CExpert::CheckDeleteOrderLong() - поясните особенность работы

 

К сожалению, объектами Стандартной Библиотеки народ не больно-то пользуется, но все же, может кто мне расскажет...  

В Стандартной Библиотеке в классе CExpert при процессинге используется функция, закрывающая отложенные ордера (привожу лонг вариант):

bool CExpert::CheckDeleteOrderLong(void)
{
   double price;
   //--- check the possibility of deleting the long order
   if(m_expiration!=0 && TimeCurrent()>m_expiration)
      {
      m_expiration=0;
      return(DeleteOrderLong());
      }
   if(m_signal.CheckCloseLong(price))
      return(DeleteOrderLong());

//--- return without operations
   return(false);

 

То есть,  сперва проверяется время истечения действия ордеров, и если оно больше текущего - производится удаление текущего отложенного ордера (все верно).

А потом - у сигнала запрашивается необходимость закрытия текущей ПОЗИЦИИ ( ??? ), и если сигнал дает "добро" на закрытие (в функции CSignal::CheckCloseLong()) - то одновременно удаляется текущий ордер (???).

Я не понимаю смысла данной операции. Как связана необходимость закрытия позиции сигналом с необходимостью удаления отложенных ордеров ?  

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

 
Laryx:

...Я не понимаю смысла данной операции. Как связана необходимость закрытия позиции сигналом с необходимостью удаления отложенных ордеров ?

Laryx, здесь проверяются состояния... почитайте, если интересно про это у коллеги Сергеева в статье: "Прототип торгового робота"

А в данном случае:

if(m_expiration!=0 && TimeCurrent()>m_expiration)
      {
      m_expiration=0;
      return(DeleteOrderLong());
      }

просто проверяется экспирация отложек-лонгов...

Ведь если m_expiration не равен нулю, значит параметр задан... и значит, нужно его проверить...


Я не вдавался в код по этим строкам:

if(m_signal.CheckCloseLong(price))
      return(DeleteOrderLong());

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

 
denkir:
 

Я не вдавался в код по этим строкам:

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

Вот-вот. Я именно про этот момент и говорю. Первая строка - вполне понятна и правильна. Но вот далее - у Сигнала запрашивается возможность закрытия позиции, и если сигнал ее закрывает - одновременно почему-то удаляется текущий (только один, очередной, первый, скорее всего) отложенный ордер.

Я не вполне пойму подобного действия. Решил спросить - мож, я чего недопонял. Но, похоже, просто разработчики не вдавались сильно в механизм работы с отложками - все стандартные сигналы работают без отложек.

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

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

Laryx, Вам говорит о чём-нибудь вот такое объявление метода CExpertSignal::CheckCloseLong() ? :-))

virtual bool      CheckCloseLong(double &price);


Библиотека ведь недаром называется Стандартной...

 

Не вполне понял ваш вопрос

denkir:

Laryx, Вам говорит о чём-нибудь вот такое объявление метода CExpertSignal::CheckCloseLong() ? :-))

Не вполне понял суть вопроса. Функция проверяет необходимость закрытия позиции. Но при чем тут отложенные ордера ? Позиция - закрывается, ордера при этом - остаются. Почему вместе с закрытием позиции необходимо еще и удалить отложки ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

Laryx:

Не вполне понял суть вопроса. Функция проверяет необходимость закрытия позиции. Но при чем тут отложенные ордера ? Позиция - закрывается, ордера при этом - остаются. Почему вместе с закрытием позиции необходимо еще и удалить отложки ?

Laryx, что значит ключевое слово virtual?

virtual bool      CheckCloseLong(double &price);


И ещё раз "Библиотека ведь недаром называется Стандартной..."


 
denkir:

Laryx, что значит ключевое слово virtual?

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

Применительно к данному случаю это означает всего лишь то, что есть возможность написать наследника класса CSignal, где написать свою собственную функцию CheckCloseLong(double&), которая будет вызываться в функции CExpert::CheckDeleteOrderLong(void).

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

И ещё раз "Библиотека ведь недаром называется Стандартной..."

Именно поэтому я и спрашиваю. У себя в коде я давно уже переопределил функцию CExpert::CheckDeleteOrderLong(void), и она у меня отложки не удаляет, а только закрывает позицию, если это требует сигнал. Но почему по стандарту отложки удаляются ?

 

Laryx, Вы сами ответили на свой вопрос. Причём на хорошем уровне :-))

А самое главное, что Вы сделали то, что и нужно делать в таких случаях, когда нужна другая реализация метода.

Не будьте так строги к Разработчику относительно Стандартной библиотеки...

... Это "баг или фича" ?

Скорее второе.

 
denkir:
 

Скорее второе.

Аааа... Семен-семеныч !!!! :-))) 

Причина обращения: