Прежде всего, в описании внешних переменных советника добавим следующие строки, для возможности пользователем задания цвета фона и текста кнопок:
- Код: выделить все
input color colBtn1Back = clrSkyBlue; // Цвет фона кнопки BUY
input color colBtn2Back = clrRed; // Цвет фона кнопки SELL
input color colBtn3Back = clrGold; // Цвет фона кнопки CLOSE
input color colText = clrBlack; // Цвет текста кнопок
Далее, нам нужно определить переменные для "внутреннего пользования" разработчика:
- Код: выделить все
// Настройки кнопок:
ENUM_BASE_CORNER enuCorn = CORNER_LEFT_UPPER; // Угол графика для привязки
string strBtn1 = "BUY"; // Имя кнопки 1
string strBtn2 = "SELL"; // Имя кнопки 2
string strBtn3 = "CLOSE"; // Имя кнопки 3
string strFont = "Arial"; // Шрифт
int intFSiz = 12; // Размер шрифта
int intDl1 = 15; // отступ слева для 1-ой кнопки
int intDh1 = 20; // отступ сверху для 1-ой кнопки
int intWi = 80; // ширина кнопок
int intHi = 30; // высота кнопок
int intDl2; // Отступ слева для 2-ой кнопки
int intDl3; // Отступ слева для 3-ой кнопки
Видно, что это угол привязки для кнопок имена кнопок, шрифт и его размер, размеры кнопок и отступ по вертикали и горизонтали для 1-ой кнопки. Поскольку отступ по вертикали для всех кнопок должен быть одинаковым, то для 2 и 3-ей кнопки нужно задать только отступ слева.
Далее, в коде эксперта нужно расположить следующие четыре функции, отвечающие за функционирование создаваемых кнопок:
- Код: выделить все
void f_SetButton(string na, int dl, int dh, int wi, int hi, color back)
{
/*
na - имя кнопки
dl - оступ слева для кнопки
dh - отступ сверху для кнопки
wi - ширина кнопки
hi - высота кнопки
back - цвет фона кнопки
*/
//создадим кнопку
if(!f_ButtonCreate(0, na, 0, dl, dh, wi, hi, enuCorn, na, strFont, intFSiz,
colText, back, clrNONE, false, false, false, true, 0))
{
return;
}
//перерисуем график
ChartRedraw();
}
//*********************************************************************************************
//+------------------------------------------------------------------+
//| Создает кнопку |
//+------------------------------------------------------------------+
bool f_ButtonCreate(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const int width=50, // ширина кнопки
const int height=18, // высота кнопки
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const string text="Button", // текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const color clr=clrBlack, // цвет текста
const color back_clr=C'236,233,216', // цвет фона
const color border_clr=clrNONE, // цвет границы
const bool state=false, // нажата/отжата
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим кнопку
if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать кнопку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты кнопки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим цвет текста
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим цвет фона
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим цвет границы
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- переведем кнопку в заданное состояние
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- включим (true) или отключим (false) режим перемещения кнопки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//*********************************************************************************************
//+------------------------------------------------------------------+
//| Удаляет кнопку |
//+------------------------------------------------------------------+
bool f_ButtonDelete(const long chart_ID=0, // ID графика
const string name="Button") // имя кнопки
{
//--- сбросим значение ошибки
ResetLastError();
//--- удалим кнопку
if(!ObjectDelete(chart_ID, name))
{
Print(__FUNCTION__,
": не удалось удалить кнопку! Код ошибки = ",GetLastError());
return(false);
}
//--- успешное выполнение
return(true);
}
//*********************************************************************************************
bool f_ButtonPressured(string na)
{
/*
Функция определяет находится ли указанная кнопка в нажатом состоянии
na - имя кнопки
*/
bool bol_Y = ObjectGetInteger(0, na, OBJPROP_STATE, true);
if(bol_Y) return(true);
return(false);
}
Первая ф-ия f_SetButton() - устанавливает параметры кнопки; вторая функция f_ButtonCreate() - создает саму кнопку; третья - f_ButtonDelete() - отвечает за удаление кнопки (это необходимо при выгрузке советника); четвертая функция - f_ButtonPressured() - определяет действия при нажатии пользователем на кнопку.
Поскольку создание кнопок должно происходить при запуске эксперта, соответствующие вызовы функции f_SetButton() прописывается в коде стандартной функции эксперта OnInit():
- Код: выделить все
int OnInit()
{
f_SetButton(strBtn1, intDl1, intDh1, intWi, intHi, colBtn1Back);
intDl2 = intDl1 + intWi +1;
f_SetButton(strBtn2, intDl2, intDh1, intWi, intHi, colBtn2Back);
intDl3 = intDl2 + intWi +1;
f_SetButton(strBtn3, intDl3, intDh1, intWi, intHi, colBtn3Back);
return(INIT_SUCCEEDED);
}
Также в этом месте нужно задать координаты расположения всех кнопок (переменные intDl2, intDl3).
Итак, кнопки созданы и теперь готовы к применению в коде эксперта.
Далее рассмотрим как же использовать их непосредственно в самом коде.