AM2
Андрей

 
Уровень 27

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 270



Панель управления на MQL4 это просто!

До сегодняшнего дня я думал что писать панели управления это очень непростая задача. Когда я попробовал набросать простенький вариант, все оказалось иначе.

Пусть в нашей панели будет всего три кнопки «BUY», «SELL», «CLOSE». Вы спросите почему так мало? Да только потому чтобы показать принцип написания панелей, люди знакомые c MQL4 очень быстро приспособят данный пример под свои потребности.

Реализуем нашу панель в виде советника. Первым делом создадим функцию установки объекта «Кнопка». Здесь мы пропишем размеры кнопки, наименование шрифта, цвет текста и т.д.



void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);

//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
  }


При инициализации советника создадим необходимые нам кнопки:


int OnInit()
  {
   PutButton("B",50,50,"BUY");
   PutButton("S",150,50,"SELL");
   PutButton("C",250,50,"CLOSE");

   return(INIT_SUCCEEDED);
  }


Далее создадим функцию установки ордера:


void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(price,Digits),100,0,0,"",123,0,clr);
   return;
  }


И функцию закрытия всех ордеров:


void ClosePos(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),100,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),100,White);
              }
           }
        }
     }
  } 


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

virtual void  OnChartEvent( 
   const int     id,       // идентификатор события 
   const long&   lparam,   // параметр события типа long 
   const double  dparam,   // параметр события типа double 
   const string  sparam    // параметр события типа string 
   )


Параметры
id
[in] Идентификатор события.

lparam
[in] Параметр события типа long.

dparam
[in] Параметр события типа double.

sparam
[in] Параметр события типа string.

Возвращаемое значение
Нет.


Наш обработчик будет выглядеть следующим образом:


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем "B"
      if(clickedChartObject=="B")
        {
         PutOrder(0,Ask);
        }
      //--- если нажатие на объекте с именем "S"
      if(clickedChartObject=="S")
        {
         PutOrder(1,Bid);
        }
      //--- если нажатие на объекте с именем "C"
      if(clickedChartObject=="C")
        {
         ClosePos();
        }

      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
  }


И вот наша панель практически готова:


//+------------------------------------------------------------------+
//|                                                        Panel.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright 2015, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   PutButton("B",50,50,"BUY");
   PutButton("S",150,50,"SELL");
   PutButton("C",250,50,"CLOSE");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);

//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,0.1,NormalizeDouble(price,Digits),100,0,0,"",123,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),100,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),100,White);
              }
           }
        }
     }
  }  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем "B"
      if(clickedChartObject=="B")
        {
         PutOrder(0,Ask);
        }

      if(clickedChartObject=="S")
        {
         PutOrder(1,Bid);
        }

      if(clickedChartObject=="C")
        {
         ClosePos();
        }

      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
  }
//+------------------------------------------------------------------+


Проверим наше творение в действии:



Покупаем, нажимаем кнопку «BUY»:



Закрываем покупку, жмем «CLOSE»:



И наконец то проверяем кнопку «SELL»:



Точно таким же образом можно добавить на график кнопки с любыми другими необходимыми вам функциями или написать панель на MQL5, отличие будет только в содержании функций.

Скачать советник файлом можно по ссылке: www.opentraders.ru/downloads/1132/
  • +9
  • Просмотров: 16136
  • 5 апреля 2016, 20:25
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Торгуем в тестере вручную. MT4
02 апреля 2016
27 апреля 2016

Комментарии (11)

+
0
А как узнать размер устанавливаемого лота? Откуда он берет это значение.
avatar

  18  nonych Сообщений: 63 - Евгений

  • 6 апреля 2016, 03:25
+
0
Андрей, и еще добавте возможность автоматического выставления уровней ТП и СЛ сразу после открытия ордера по заранее заданным параметрам. И если возможно добавте трейлинг стоп.
avatar

  6  Sergey1 Сообщений: 117

  • 6 апреля 2016, 05:12
+
0
А как узнать размер устанавливаемого лота? Откуда он берет это значение.


Это учебный пример. Лот можно вывести в настройки как в любом советнике или вводить в поле прямо на графике.
Редактирован: 6 апреля 2016, 07:40
avatar

  27  AM2 Автор Сообщений: 8245 - Андрей

  • 6 апреля 2016, 07:33
+
0
Андрей, и еще добавте возможность автоматического выставления уровней ТП и СЛ сразу после открытия ордера по заранее заданным параметрам. И если возможно добавте трейлинг стоп.


С этим вопросом вам в стол заказов: zakaz.opentraders.ru/
avatar

  27  AM2 Автор Сообщений: 8245 - Андрей

  • 6 апреля 2016, 08:40
+
0
На кнопку жму окрашивается по канту синим, ордер не окрывает
avatar

  15  gued Сообщений: 249

  • 7 апреля 2016, 16:28
+
0
На кнопку жму окрашивается по канту синим, ордер не окрывает


Я тестировал у меня работал. Это больше учебный пример. Я сейчас отлаживаю более продвинутую версию: zakaz.opentraders.ru/31773.html
avatar

  27  AM2 Автор Сообщений: 8245 - Андрей

  • 7 апреля 2016, 17:35
+
0
А почему программно не отжимаешь кнопку? Так и остаются нажатыми и визуально в том числе.
//--- вернем кнопку в ненажатое состояние
ObjectSetInteger(0,InpName,OBJPROP_STATE,false);

И в OnDeinit() кнопки хорошо бы удалять…
Редактирован: 13 апреля 2016, 17:24
avatar

  21  Oxy Сообщений: 3247 - ..ιllιlι.lι.ιllι.ιlι..

  • 13 апреля 2016, 17:22
+
0
Не мешало бы все это добавить, но это всего лишь простенький примерчик, может кто закажет :) 
Редактирован: 13 апреля 2016, 19:47
avatar

  27  AM2 Автор Сообщений: 8245 - Андрей

  • 13 апреля 2016, 19:45
+
0
avatar

  21  Oxy Сообщений: 3247 - ..ιllιlι.lι.ιllι.ιlι..

  • 15 апреля 2016, 01:56
+
0
avatar

  1  ZeleBoba Сообщений: 7

  • 19 декабря 2016, 11:39
+
0
Здравствуйте! А можно уточнить по поводу функции chartredraw()? В каком случае она вызывается, и как правильно ей пользоваться?
avatar

  0  Yur4ik Сообщений: 1

  • 8 ноября 2018, 17:45

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари