//+------------------------------------------------------------------+ //| TestButtons.mq5 | //| Copyright 2013, https://login.mql5.com/ru/users/tol64 | //| Site, http://tol64.blogspot.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, http://tol64.blogspot.com" #property link "http://tol64.blogspot.com" #property description "email: hello.tol64@gmail.com" #property version "1.0" //--- #property indicator_separate_window // Индикатор в подокне #property indicator_plots 0 // Отсутствие графических серий //--- #define NUMBER_BUTTONS_WIDTH 4 // Количество кнопок в ширину #define NUMBER_BUTTONS_HEIGHT 3 // Количество кнопок в высоту //+------------------------------------------------------------------+ //| Глобальные параметры | //+------------------------------------------------------------------+ //--- Шрифт string font_name="Calibri"; //--- Свойства подокна индикатора int number_subwindow =WRONG_VALUE; // Номер подокна int subwindow_height =0; // Высота подокна string shortname_subwindow ="TestButtons"; // Короткое имя индикатора string prefix =shortname_subwindow+"_"; // Префикс для объектов int chart_width =0; // Ширина графика int chart_height =0; // Высота графика int chart_y_distance =0; // Дистанция от верха графика до подокна //--- Свойства кнопок color button_bg_color =clrSteelBlue; // Цвет кнопки color button_font_color =clrWhite; // Цвет шрифта color button_hover_bg_color =clrGreen; // Цвет кнопки при наведении курсора color button_on_bg_color =C'2,72,136'; // Цвет нажатой кнопки //+------------------------------------------------------------------+ //| Массивы | //+------------------------------------------------------------------+ //--- Отображаемый текст в кнопках string buttons_text[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]= { {"BUTTON 01","BUTTON 02","BUTTON 03","BUTTON 04"}, {"BUTTON 05","BUTTON 06","BUTTON 07","BUTTON 08"}, {"BUTTON 09","BUTTON 10","BUTTON 11","BUTTON 12"} }; //--- Названия объектов string buttons_object_name[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]= { {"button_01","button_02","button_03","button_04"}, {"button_05","button_06","button_07","button_08"}, {"button_09","button_10","button_11","button_12"} }; //--- Ширина кнопок int buttons_width[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]; //--- Высота кнопок int buttons_height[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]; //--- Координата X int buttons_x_distance[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]; //--- Координата Y int buttons_y_distance[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]; //--- Состояние кнопок bool buttons_state[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]= { {true,false,false,false}, {false,false,false,false}, {false,false,false,false} }; //--- Цвет кнопок color buttons_color[NUMBER_BUTTONS_HEIGHT][NUMBER_BUTTONS_WIDTH]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Включим таймер с интервалом 1 секунда EventSetTimer(1); //--- Добавим префикс к именам объектов AddPrefix(); //--- Включим слежение за событиями мыши ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true); //--- Установим короткое имя IndicatorSetString(INDICATOR_SHORTNAME,shortname_subwindow); //--- Получим свойства подокна SetSubwindowProperties(); //--- Установим свойства кнопок InitButtonsColor(); // Определим цвета InitButtonsXYdistance(); // Определим координаты InitButtonsWidthHeight(); // Определим размеры //--- Установим панель кнопок SetButtonsPanel(); //--- Обновим график ChartRedraw(); //--- Всё прошло успешно return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Деинициализация | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(reason==REASON_REMOVE || // Если индикатор удалён с графика или reason==REASON_RECOMPILE) // программа была перекомпилирована { //--- Отключим таймер EventKillTimer(); //--- Удалим объекты DeleteButtons(); //--- Включим управление скроллу графика ChartSetInteger(0,CHART_MOUSE_SCROLL,true); //--- Отключим слежение за событиями мыши ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false); //--- Обновим график ChartRedraw(); } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // размер массива price[] const int prev_calculated, // обработано баров на предыдущем вызове const int begin, // откуда начинаются значимые данные const double &price[]) // массив для расчета { return(rates_total); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- Проверим, включено ли отслеживание событий мыши CheckEventMouseMove(); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- Отслеживание движения мыши и нажатия левой кнопки мыши if(id==CHARTEVENT_MOUSE_MOVE) { int x =(int)lparam; // по горизонтали int y =(int)dparam; // по вертикали int window =WRONG_VALUE; // окно, в котором находится курсор datetime time =NULL; // время бара, соответствующего курсору double level =0.0; // уровень (цена), соответствующая курсору //--- Получим местоположение курсора if(ChartXYToTimePrice(0,x,y,window,time,level)) { //--- Получим расстояние от верха графика до подокна индикатора chart_y_distance=(int)ChartGetInteger(0,CHART_WINDOW_YDISTANCE,number_subwindow); //--- Преобразуем координату Y в относительную y-=chart_y_distance; //--- Если курсор в зоне подокна, // отключим скролл графика if(window==number_subwindow) ChartSetInteger(0,CHART_MOUSE_SCROLL,false); //--- Включим скролл графика, если вышли из зоны подокна индикатора else ChartSetInteger(0,CHART_MOUSE_SCROLL,true); //--- ChangeButtonsColorHover(x,y); } //--- Обновим график ChartRedraw(); return; } //--- Отслеживает нажатие на графическом объекте левой кнопкой мыши if(id==CHARTEVENT_OBJECT_CLICK) { //--- Если нажали на кнопке if(InitButtonsState(sparam)) { //--- Установим цвета кнопкам ChangeColorOnButtons(); } //--- Обновим график ChartRedraw(); return; } //--- Отслеживает событие изменение свойств и размера графика if(id==CHARTEVENT_CHART_CHANGE) { //--- Проверим, включено ли отслеживание событий мыши CheckEventMouseMove(); //--- Получим свойства подокна SetSubwindowProperties(); //--- Определим координаты для кнопок InitButtonsXYdistance(); //--- Определим размеры кнопок InitButtonsWidthHeight(); //--- Установим новые координаты кнопкам SetXYdistanceButtons(); //--- Установим новые размеры кнопкам ResizeButtons(); //--- Обновим график ChartRedraw(); return; } } //+------------------------------------------------------------------+ //| Проверяет, включено ли отслеживание событий мыши | //+------------------------------------------------------------------+ void CheckEventMouseMove() { //--- Включим слежение за передвижением курсора, если режим отключен if(!ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE)) ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true); } //+------------------------------------------------------------------+ //| Добавляет ко всем названиям объектов префикс | //+------------------------------------------------------------------+ void AddPrefix() { //--- Установим префикс названиям объектов for(int i=0; ix1 && xy1 && y=0) { //--- Определим нажатую кнопку for(int i=0; i=0) { //--- Если была ошибка при удалении, сообщим об этом if(!ObjectDelete(0,Name)) Print("Ошибка ("+IntegerToString(GetLastError())+") при удалении объекта!"); } } //+------------------------------------------------------------------+