Обсуждение статьи "Как быстро добавить панель управления к индикатору и советнику"

 

Опубликована статья Как быстро добавить панель управления к индикатору и советнику:

Вы хотите добавить к своему индикатору или советнику графическую панельку для удобного и быстрого управления, но не знаете, как это сделать? В этой статье шаг за шагом я покажу как "прикрутить" панель диалога со входными параметрами к вашей MQL4/MQL5-программе.

Ваша MQL4/MQL5-программа — индикатор или советник — может быть одной из лучших и полностью выполнять возложенные на нее задачи. Но вы всегда можете немного улучшить ее. Как правило, в 99% случаев для любого изменения входных параметров программы пользователю нужно заходить в ее настройки. Хотите обойтись без этого?

Сделать это можно, создав собственную панель управления на базе классов Стандартной библиотеки. Это позволит менять настройки без перезапуска программы. К тому же, такой подход оживляет программу и выгодно выделяет ее среди других. Посмотреть примеры графических панелей вы можете в Маркете.

В этой статье я покажу, как самому добавить простую панель к вашей MQL4/MQL5-программе. Вы узнаете, как научить программу читать входные параметры и реагировать на изменение их значений.


2.2. Панель

Вид панели "PanelDialog2.mqh" после внесения окончательных изменений:

Panel number two

Рис. 4. Панель номер два

Что мы получим после объединения советника "MACD Sample.mq5" и панели "PanelDialog2.mqh"? На текущем таймфрейме, на котором будет работать советник, можно будет оперативно менять параметры советника ("Lots", "Trailing Stop Level (in pips)" и другие), а также параметры оповещения о торговых событиях советника ("Mail", "Push", "Alert").

Измененные параметры советника ("Lots", "Trailing Stop Level (in pips)" и другие) применяются после щелчка на кнопке "Применить изменения". Изменение параметров оповещения о торговых событиях советника ("Mail", "Push", "Alert") применяются автоматически — щелкать на кнопке "Применить изменения" не нужно.

Автор: Karputov Vladimir

 
Спасибо за статью! А как можно изменить цвет фона и рамки самой панели? Что-то не нашел в стандартных классах.
 
Maxim Dmitrievsky:
Спасибо за статью! А как можно изменить цвет фона и рамки самой панели? Что-то не нашел в стандартных классах.
Если простым способом - то никак. А сложный способ я не искал.
 
Maxim Dmitrievsky:
Спасибо за статью! А как можно изменить цвет фона и рамки самой панели? Что-то не нашел в стандартных классах.
Переопределить дефайны в Defines.mqh.
 
Andrey Khatimlianskii:
Переопределить дефайны в Defines.mqh.
  1. При ближайшем обновлении стандартная библиотека будет восстановлена - соответственно будут восстановлен файл Defines.mqh.
  2. Править стандартную библиотеку - это не есть хорошо.
 
Karputov Vladimir:
  1. При ближайшем обновлении стандартная библиотека будет восстановлена - соответственно будут восстановлен файл Defines.mqh.
  2. Править стандартную библиотеку - это не есть хорошо.
Я не предлагал ее править. Переопределить нужно после включения этого файла, но до создания панели.
 
Andrey Khatimlianskii:
Я не предлагал ее править. Переопределить нужно после включения этого файла, но до создания панели.
Gподскажите плз как сделать, на простом примере, в ооп слабо шарю. Менял цвета дефайнов в самой библиотеке - цвет панельки не меняется
 
Maxim Dmitrievsky:
Gподскажите плз как сделать, на простом примере, в ооп слабо шарю. Менял цвета дефайнов в самой библиотеке - цвет панельки не меняется

После изменения файла перекомпилируйте советника, должно сработать. И не забудьте сделать бэк-ап, чтоб после обновления восстановить свой вариант.

Переопределение делается с помощью #undef и #define. Но их нужно в нужное место вставить ;)

 
Andrey Khatimlianskii:

Переопределение делается с помощью #undef и #define. Но их нужно в нужное место вставить ;)

Единственная деталь, отличающая ... от ... . 
 
Andrey Khatimlianskii:

После изменения файла перекомпилируйте советника, должно сработать. И не забудьте сделать бэк-ап, чтоб после обновления восстановить свой вариант.

Переопределение делается с помощью #undef и #define. Но их нужно в нужное место вставить ;)

Ну вот так сделал, ниче не работает. Панель как была белой так и осталась

 Компилятор пишет Macro redifinition, т.е. типа переоперделил... 

//+------------------------------------------------------------------+
//|                                                      MyPanel.mqh |
//|                                    Copyright © 2013, DeltaTrader |
//|                                    http://www.deltatrader.com.br | 
//+------------------------------------------------------------------+
#property copyright     "DeltaTrader © 2013"
#property link          "www.deltatrader.com.br"
#property version       "1.000"
#property description   "Test Panel"
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Panel.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Defines.mqh>

#define CONTROLS_DIALOG_COLOR_BORDER_LIGHT  C'0x00,0x00,0xFF'
#define CONTROLS_DIALOG_COLOR_BORDER_DARK  C'0x00,0x00,0xFF'
#define CONTROLS_DIALOG_COLOR_BG            C'0x00,0x00,0xFF'
#define CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x00,0x00,0xFF'
#define CONTROLS_DIALOG_COLOR_CLIENT_BG     C'0x00,0x00,0xFF'
#define CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0x00,0x00,0xFF'

//+------------------------------------------------------------------+
//| Global parameters                                                |
//+------------------------------------------------------------------+
int      panelXX     =  200;
int      panelYY     =  200;
int      panelWidth  =  600;
int      panelHeight =  400;

CAppDialog m_panel;

//--- Bid objects
CPanel m_bidcolor;
CLabel m_bidlabel;
 

//--- Ask objects
CPanel m_askcolor;
CLabel m_asklabel;
CEdit m_edit;
//+------------------------------------------------------------------+
//| On Init                                                          |
//+------------------------------------------------------------------+
int OnInit() 
  {
//--- Panel create
   m_panel.Create(0,"blablabla",0,panelXX,panelYY,panelWidth,panelHeight);
//--- Bid label and colors
   m_bidcolor.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_bidcolor.ColorBackground(clrYellow);
   m_panel.Add(m_bidcolor);
   
   m_bidlabel.Create(0,"Bid Text",0,5,5,0,0);
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   m_bidlabel.Color(clrBlue);
   m_panel.Add(m_bidlabel);
//--- Ask label and colors
   m_askcolor.Create(0,"Ask Background Color",0,1,1,panelWidth-30,30);
   m_askcolor.ColorBackground(clrAqua);
   m_panel.Add(m_askcolor);
   
   m_asklabel.Create(0,"Ask Text",0,5,30,0,0);
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   m_asklabel.Color(clrRed);
   m_panel.Add(m_asklabel);
   
   m_edit.Create(0,"Bid Background Color",0,1,1,panelWidth-30,30);
   m_panel.Add(m_edit);
//--- Run panel
   m_panel.Run();
   return(0);
  }
//+------------------------------------------------------------------+
//| On DeInit                                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Destroy panel
   m_panel.Destroy(reason);
//--- Delete all objects
   ObjectsDeleteAll(0,0);
  }
//+------------------------------------------------------------------+
//| On Calculate                                                     |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- A very simples bid label
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
//--- A very simples ask label
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| On Chart Event                                                   |
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Move the panel with the mouse
   m_panel.ChartEvent(id,lparam,dparam,sparam);
//--- 
  }
//+------------------------------------------------------------------+
 
Maxim Dmitrievsky:

Ну вот так сделал, ниче не работает. Панель как была белой так и осталась

 Компилятор пишет Macro redifinition, т.е. типа переоперделил... 

Воспользуйтесь моим первым советом, просто замените цвета в оригинальном файле и перекомпилируйте советника.

Чтобы вспомнить, как я переопределил цвета в своей панели, нужно покопаться, а сейчас некогда.