Обсуждение статьи "Создаем помощника в ручной торговле"

 

Опубликована статья Создаем помощника в ручной торговле:

Количество торговых роботов для работы на валютных рынках в последнее время растет как снежный ком. В них закладываются различные концепции и стратегии, но беспроигрышный образец искусственного интеллекта создать еще никому не удалось. Поэтому многие трейдеры остаются приверженцами ручной торговли. Но и для таких специалистов создаются роботизированные помощники, так называемые торговые панели. Данная статья — еще один пример создания торговой панели "с нуля".

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

Разрабатывая дизайн будущей торговой панели, вы должны задуматься о практичности ее применения. В первую очередь, она должна быть достаточно информативной, и при этом легко читаемой, не перегруженной лишними элементами. Мы должны всегда помнить, что это инструмент для реальной работы трейдера, а не просто красивая картинка на экране.

Вот мой вариант.

Дизайн

Автор: Dmitriy Gizlyk

 

Подобные панели уже давно выложены на данном сайте. Пользы по сравнению со стандартной ни какой.

Что касается идей.

1) Кнопка обратного отложенного ордера за стоплосом.

2) Кнопка Переворот позиции одной кнопкой.

3) Кнопка Тралл позиции

4) Кнопка Мартингейл обратного ордера

5) Кнопка Тейкпрофит 3 к 1 или настраиваемый. 

Минимальный стандартный набор. 

 
Ilya Vasenin:

Подобные панели уже давно выложены на данном сайте. Пользы по сравнению со стандартной ни какой.

Что касается идей.

1) Кнопка обратного отложенного ордера за стоплосом.

2) Кнопка Переворот позиции одной кнопкой.

3) Кнопка Тралл позиции

4) Кнопка Мартингейл обратного ордера

5) Кнопка Тейкпрофит 3 к 1 или настраиваемый. 

Минимальный стандартный набор. 

Да, в Маркете много торговых панелей. Много различных работ и в Фрилансе по созданию торговых панелей. Вы, как и любой другой, можете воспользоваться этой готовой панелью на бесплатной основе. Но это статья, а не продукт с Маркета. И целью статьи является не дать готовый продукт для использования, а показать всем и научить желающих, как каждый может создать свою индивидуальную торговую панель, по своим требованиям.
 
  Внизу на панели транслируется Баланс и Эквити счета, что дублирует вкладку "Инструменты" терминала. Предлагаю вместо этого показывать на этом месте сколько сделано сделок за текущий день, каков их результат и в будущем сделать так, чтобы при достижении заданного количества сделок или заданного убытка на день, терминал отключался.
 
Dmitriy Gizlyk:
И целью статьи является не дать готовый продукт для использования, а показать всем и научить желающих, как каждый может создать свою индивидуальную торговую панель, по своим требованиям.

Дмитрий, сегодня начал делать панельку на мкл 4 по вашему уроку. Почти все работает, но при клике на панели или на любой кнопке открывает только бай. В чем может быть причина?

 

//+------------------------------------------------------------------+
//|                                                   TradePanel.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\Button.mqh>

//--- Inputs
extern double Lot        = 0.1;      // лот
extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 500;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 0;        // магик
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum label_align
  {
   left=-1,
   right=1,
   center=0
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CTradePanel : public CAppDialog
  {
private:

   CLabel            Lots_label;                      // Display label " Lots"
   CEdit             Lots;                            // Display volume of next order
   CButton           SELL,BUY;                        // Sell and Buy Buttons
   CButton           CloseAll;                        // Close buttons

   //--- Create Label object
   bool              CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align);
   //--- Create Button
   bool              CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size);
   //--- Create Edit object
   bool              CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size);

   //--- On Event functions
   void              LotsEndEdit(void);               // Edit Lot size

   //--- variables of current values
   double            cur_lot;                         // Lot of next order

   void              BuyClick();                      // Click BUY button
   void              SellClick();                     // Click SELL button
   void              CloseClick();                    // Click CLOSE button   

public:
                     CTradePanel(void){};
                    ~CTradePanel(void){};
   virtual bool      Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420);
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   virtual void      Destroy(const int reason);
  };

CTradePanel TradePanel;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
// Create Trade Panel
   TradePanel.Create(ChartID(),"Panelka",0,20,20,150,200);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   TradePanel.Destroy(reason);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CTradePanel::CreateLabel(const long chart,const int subwindow,CLabel &object,const string text,const uint x,const uint y,label_align align)
  {
// All objects must have separate name
   string name=m_name+"Label"+(string)ObjectsTotal(chart,-1,OBJ_LABEL);
//--- Call Create function
   if(!object.Create(chart,name,subwindow,x,y,0,0))
     {
      return false;
     }
//--- Adjust text
   if(!object.Text(text))
     {
      return false;
     }
//--- Align text to Dialog box's grid
   ObjectSetInteger(chart,object.Name(),OBJPROP_ANCHOR,(align==left ? ANCHOR_LEFT_UPPER :(align==right ? ANCHOR_RIGHT_UPPER : ANCHOR_UPPER)));
//--- Add object to controls
   if(!Add(object))
     {
      return false;
     }
   return true;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CTradePanel::CreateButton(const long chart,const int subwindow,CButton &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size)
  {
// All objects must have separate name
   string name=m_name+"Button"+(string)ObjectsTotal(chart,-1,OBJ_BUTTON);
//--- Call Create function
   if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size))
     {
      return false;
     }
//--- Adjust text
   if(!object.Text(text))
     {
      return false;
     }
//--- set button flag to unlock
   object.Locking(false);
//--- set button flag to unpressed
   if(!object.Pressed(false))
     {
      return false;
     }
//--- Add object to controls
   if(!Add(object))
     {
      return false;
     }
   return true;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CTradePanel::CreateEdit(const long chart,const int subwindow,CEdit &object,const string text,const uint x,const uint y,const uint x_size,const uint y_size)
  {
// All objects must have separate name
   string name=m_name+"Edit"+(string)ObjectsTotal(chart,-1,OBJ_EDIT);
//--- Call Create function
   if(!object.Create(chart,name,subwindow,x,y,x+x_size,y+y_size))
     {
      return false;
     }
//--- Adjust text
   if(!object.Text(text))
     {
      return false;
     }
//--- Align text in Edit box
   if(!object.TextAlign(ALIGN_CENTER))
     {
      return false;
     }
//--- set Read only flag to false
   if(!object.ReadOnly(false))
     {
      return false;
     }
//--- Add object to controls
   if(!Add(object))
     {
      return false;
     }
   return true;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CTradePanel::Create(const long chart,const string name,const int subwin=0,const int x1=20,const int y1=20,const int x2=320,const int y2=420)
  {
// At first call create function of parents class
   CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);

// Calculate coordinates and size of BID object

// Create object
   CreateLabel(chart,subwin,Lots_label,"LOT",55,5,0);
   CreateEdit(chart,subwin,Lots,"0.1",33,35,60,20);
   CreateButton(chart,subwin,BUY,"BUY",33,65,60,20);
   CreateButton(chart,subwin,SELL,"SELL",33,95,60,20);
   CreateButton(chart,subwin,CloseAll,"CLOSE",33,125,60,20);

   return(true);
  }
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CTradePanel)
ON_EVENT(ON_END_EDIT,Lots,LotsEndEdit)
ON_EVENT(ON_CLICK,BUY,BuyClick)
ON_EVENT(ON_CLICK,SELL,SellClick)
ON_EVENT(ON_CLICK,CloseAll,CloseClick)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//|  Click BUY button                                                |
//+------------------------------------------------------------------+
void CTradePanel::BuyClick(void)
  {
   PutOrder(0,Ask);
  }
//+------------------------------------------------------------------+
//|  Click BUY button                                                |
//+------------------------------------------------------------------+
void CTradePanel::SellClick(void)
  {
   PutOrder(1,Bid);
  }
//+------------------------------------------------------------------+
//|  Click BUY button                                                |
//+------------------------------------------------------------------+
void CTradePanel::CloseClick(void)
  {
   CloseAll();
  }
//+------------------------------------------------------------------+
//| Read lots value after edit                                       |
//+------------------------------------------------------------------+
void CTradePanel::LotsEndEdit(void)
  {
//--- Read and normalize lot value
   cur_lot=NormalizeDouble(StringToDouble(Lots.Text()),2);
  }
//+------------------------------------------------------------------+
//| Application deinitialization function                            |
//+------------------------------------------------------------------+
void CTradePanel::Destroy(const int reason)
  {
   CAppDialog::Destroy(reason);
   return;
  }
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   TradePanel.OnEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
 
Andrew Kornishkin:

Дмитрий, сегодня начал делать панельку на мкл 4 по вашему уроку. Почти все работает, но при клике на панели или на любой кнопке открывает только бай. В чем может быть причина?

 

Доброй ночи, Андрей.
Вы все сделали правильно в описании класса. Единственная Ваша ошибка в том, что в функции OnInit после создания класса торговой панели Вы не запустили ее выполнение функцией Run

int OnInit()
  {
//---
// Create Trade Panel
   TradePanel.Create(ChartID(),"Panelka",0,20,20,150,200);
   TradePanel.Run();
//---
   return(INIT_SUCCEEDED);
  }

 С уважением,

Дмитрий. 

 
Dmitriy Gizlyk:

Доброй ночи, Андрей.
Вы все сделали правильно в описании класса. Единственная Ваша ошибка в том, что в функции OnInit после создания класса торговой панели Вы не запустили ее выполнение функцией Run

 С уважением,

Дмитрий. 

Благодарствую, Дмитрий! 
Заработало!
 
Загрузила вашу торговую панель в метатрейдер,но она не работает. Очень жаль.
 
19681:
Загрузила вашу торговую панель в метатрейдер,но она не работает. Очень жаль.
В чем это проявляется?
Для работы панели, как и любой другой торгующей программы, надо активировать в терминале авто торговлю.
 
Dmitriy Gizlyk:
В чем это проявляется?
Для работы панели, как и любой другой торгующей программы, надо активировать в терминале авто торговлю.
Автоторговля конечно же включена. А проявляется это в том,что не работают кнопки (при нажатии на sell либо на buy выдает "error of open BUY ORDER"
 
19681:
Автоторговля конечно же включена. А проявляется это в том,что не работают кнопки (при нажатии на sell либо на buy выдает "error of open BUY ORDER"
Проверьте - разрешена ли вообще торговля по символу? В связи с послденими событиями (Brexit) часть брокеров ограничила временно торговые операции
Причина обращения: