Модернизация класса CExpert (Expert.mqh) - страница 3

 

По идее, в объявления OpenLongParams, OpenShortParams, CheckOpenLong, CheckOpenShort нужно добавить ссылочный параметр volume, который на входе будет содержать максимально возможный рассчитанный объем позиции, а на выходе - реально требуемый сигналом. CExpert должен продолжать вызывать эти методы, если текущий объём позиции меньше, чем максимально возможный рассчитанный. Точно так же нужно изменить объявления CloseLongParams, CloseShortParams, CheckCloseLong, CheckCloseShort для возможности выхода лесенкой.

И нужно изменить логику снятия отложников. Сейчас они снимаются, если есть сигнал на закрытие позиции - это логически некорректно; многие стратегии, работающие на отложниках, с такой логикой сделать вообще невозможно. В CExpertSignal нужно добавить метод CheckDeleteOrder[Long|Short].

 
George Merts:

А можно обосновать ?

Не вижу смысла в препираниях со скучающими по жизни
 
Alexey Volchanskiy:
Не вижу смысла в препираниях со скучающими по жизни
Да уж ,он за вас рубился давеча - а вы ему ,со скучающими по жизни , летел Икар себе к солнцу ........... 
 
Alexey Volchanskiy:
Не вижу смысла в препираниях со скучающими по жизни

Что-то не понял...

Алексей, вопрос вроде как вполне разумный - почему CExpert убог от рождения ?  Я вот, вижу его очень даже разумным и логичным. Для МТ5-Netting счетов, фактически, близким к идеальному шаблону системы.

Выбираем позицию, если не выбирается - запрашиваем сигнал на вход, и входим, если надо, а если позиция выбралась - то запрашиваем сопровождение.

Для МТ4 и МТ5-Hedge, где возможны разнонаправленные позиции он напрямую не годится - как раз Владимир сейчас столкнулся с этими проблемами. Но сама суть "каркаса", к которому подключаются модули сигналов, ММ и трейлинга - почему она "убогая" ?

 

Пока оставим за скобками функцию определения направления позиции/однонаправленности позиций и само направление позиции/позиций. Более важно, КУДА нужно вставлять код на проверку открытия новой позиции. Итак, для bool CExpert::Processing(void) предлагаю такой вариант:

//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
bool CExpert::Processing(void)
  {
//--- calculate signal direction once
   m_signal.SetDirection();
//--- check if open positions
   if(SelectPosition())
     {
      //--- open position is available
      //--- check the possibility of opening a position/setting pending order
      if(CheckOpen())
         return(true);

      //--- 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);
        }
     }
...

 


 

 
Vladimir Karputov:

Пока оставим за скобками функцию определения направления позиции/однонаправленности позиций и само направление позиции/позиций. Более важно, КУДА нужно вставлять код на проверку открытия новой позиции. Итак, для bool CExpert::Processing(void) предлагаю такой вариант

Боюсь, что "оставить за скобками" не выйдет. Владимир, я уже немало времени думаю над этой самой функцией процессинга - она логична, если позиция неттинговая. Однако, в случае разнонаправленного хеджирования - она никак не годится. Ни в том виде, в котором она была раньше (CheckOpen() - если нет позиции, и все остальные функции, если позиция есть), ни в предлагаемом виде.

Если не перерабатывать серьезно идеологию цикла процессинга в CExpert - то я бы оставил прежний вариант. Но, учитывая любовь народа к локированию - он не годится.

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

 

"За скобками" - значит поговорим об этом позже :). Просто явно нужна отдельная функция, которая должна делать:

  • проверять, все-ли позиции имеют одинаковое направление.
  • если все позиции имеют одинаковое направление, значит нужно как-то это направление возвращать.
По поводу "нужно как-то это направление возвращать" можно ввести protected переменную:

protected:
   ENUM_POSITION_TYPE m_positions_direction;             // positions direction

и при инициализации класса присваивать ей значение "-1" - то есть "направление неизвестно".

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CExpertAveraging::CExpertAveraging(void) : m_positions_direction(-1)
  {

  }


 

 
Vladimir Karputov:

На данный момент советник на базе класса CExpert позволяет держать ОДНУ позицию.

Тема заглохла? Или переместилась в другую ветку?

Был бы признателен, если бы кто-то смог дать ссылку на решение. Поиском находится только много вопросов и ни одного решения.

 
victor3m:

Тема заглохла? Или переместилась в другую ветку?

Был бы признателен, если бы кто-то смог дать ссылку на решение. Поиском находится только много вопросов и ни одного решения.

Модернизация CExpert заглохла - так как я перешел на свой алгоритм получения и обработки торговых сигналов в эксперте. 

 
Vladimir K @Vladimir Karputov arputov:

Модернизация CExpert заглохла - так как я перешел на свой алгоритм получения и обработки торговых сигналов в эксперте. 

Если есть статья или код, могли бы дать ссылку, интересно почитать.