Как усреднить позицию в Эксперте MQL5? - страница 2

 
Vladimir Karputov:

Мастер MQL5 создаёт эксперта на базе класса "CExpert" и за открытие/закрытие/реверс отвечает главная функция "bool CExpert::Processing(void)".

При работе на хедж счёте нужно полностью переписать эту функцию и зависимые от неё в новом классе - наследнике от  CExpert.

Ничего себе. Это задачка конкретная. Получается, нужно будет переопределить почти всё. 

Может кто-то уже это делал? 

 
Евгений Панин:


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

Алгоритм такой: если цена откатывается на 1% в ненужную сторону, покупать еще лот к уже имеющемуся в позиции.

Какое же это усреднение? Это докупка против тренда. Усреднение - открытие противоположных позиций с увеличенным лотом, таким, чтобы через в процессе ненужного движения прибыль от противоположных позиций сравнялась или стала больше убытка от текущей позиции. Тогда и закрывать текущую через CTrade.PositionCloseBy

 
Alexey Volchanskiy:

Какое же это усреднение? Это докупка против тренда. Усреднение - открытие противоположных позиций с увеличенным лотом, таким, чтобы через в процессе ненужного движения прибыль от противоположных позиций сравнялась или стала больше убытка от текущей позиции. Тогда и закрывать текущую через CTrade.PositionCloseBy

Да, это то, что Вы называете докупкой против тренда. Вопрос в том, каким образом её сделать через CExpert
 
Евгений Панин:
Да, это то, что Вы называете докупкой против тренда. Вопрос в том, каким образом её сделать через CExpert

Примерно так:

//+------------------------------------------------------------------+
//|                                              ExpertAveraging.mqh |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#include "Expert.mqh"
//+------------------------------------------------------------------+
//| Class CExpertAveraging.                                          |
//| Purpose: Base class expert advisor.                              |
//| Derives from class CExpert.                                      |
//+------------------------------------------------------------------+
class CExpertAveraging : public CExpert
  {
protected:

public:

protected:
   //--- processing (main method)
   virtual bool      Processing(void);
  };
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
bool CExpertAveraging::Processing(void)
  {
//--- calculate signal direction once
   m_signal.SetDirection();
//--- check if open positions
   if(SelectPosition())
     {
      //--- drawdown test
      double balance=m_account.Balance();
      double equity=m_account.Equity();
      if(equity/balance<0.99)
        {
         //--- check the possibility of opening a position/setting pending order
         if(CheckOpen())
            return(true);
        }

      //--- open position is available
      //--- check the possibility of reverse the position
      if(CheckReverse())
         return(true);
      //--- check the possibility of closing the position/delete pending orders
      if(!CheckClose())
        {
         //--- check the possibility of modifying the position
         if(CheckTrailingStop())
            return(true);
         //--- return without operations
         return(false);
        }
     }
//--- check if plased pending orders
   int total=OrdersTotal();
   if(total!=0)
     {
      for(int i=total-1; i>=0; i--)
        {
         m_order.SelectByIndex(i);
         if(m_order.Symbol()!=m_symbol.Name())
            continue;
         if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT || m_order.OrderType()==ORDER_TYPE_BUY_STOP)
           {
            //--- check the ability to delete a pending order to buy
            if(CheckDeleteOrderLong())
               return(true);
            //--- check the possibility of modifying a pending order to buy
            if(CheckTrailingOrderLong())
               return(true);
           }
         else
           {
            //--- check the ability to delete a pending order to sell
            if(CheckDeleteOrderShort())
               return(true);
            //--- check the possibility of modifying a pending order to sell
            if(CheckTrailingOrderShort())
               return(true);
           }
         //--- return without operations
         return(false);
        }
     }
//--- check the possibility of opening a position/setting pending order
   if(CheckOpen())
      return(true);
//--- return without operations
   return(false);
  }
//+------------------------------------------------------------------+


и в эксперте, который сгенерировал Мастер MQL5 заменить в двух местах:

#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\ExpertAveraging.mqh>
//--- available signals
.
.
.
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpertAveraging ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+

 

Но это очень грубо - просто набросок.

Файлы: