...Я не понимаю смысла данной операции. Как связана необходимость закрытия позиции сигналом с необходимостью удаления отложенных ордеров ?
Laryx, здесь проверяются состояния... почитайте, если интересно про это у коллеги Сергеева в статье: "Прототип торгового робота"
А в данном случае:
if(m_expiration!=0 && TimeCurrent()>m_expiration) { m_expiration=0; return(DeleteOrderLong()); }
просто проверяется экспирация отложек-лонгов...
Ведь если m_expiration не равен нулю, значит параметр задан... и значит, нужно его проверить...
Я не вдавался в код по этим строкам:
if(m_signal.CheckCloseLong(price)) return(DeleteOrderLong());
но смею предположить, что просто сигнал к закрытию лонгов призван "потушить" и все отложки-лонги... если ошибаюсь, то более мудрые коллеги поправят...
Я не вдавался в код по этим строкам:
но смею предположить, что просто сигнал к закрытию лонгов призван "потушить" и все отложки-лонги... если ошибаюсь, то более мудрые коллеги поправят...
Вот-вот. Я именно про этот момент и говорю. Первая строка - вполне понятна и правильна. Но вот далее - у Сигнала запрашивается возможность закрытия позиции, и если сигнал ее закрывает - одновременно почему-то удаляется текущий (только один, очередной, первый, скорее всего) отложенный ордер.
Я не вполне пойму подобного действия. Решил спросить - мож, я чего недопонял. Но, похоже, просто разработчики не вдавались сильно в механизм работы с отложками - все стандартные сигналы работают без отложек.
Просто я экспериментировал с очередным экспертом, проходил под дебаггером код, но у меня выставлены две отложки - вот я в эту ветку и зашел. Теперь разбираюсь, кто неправильно кого понимает.
- www.mql5.com
Laryx, Вам говорит о чём-нибудь вот такое объявление метода CExpertSignal::CheckCloseLong() ? :-))
virtual bool CheckCloseLong(double &price);
Библиотека ведь недаром называется Стандартной...
Не вполне понял ваш вопрос
Laryx, Вам говорит о чём-нибудь вот такое объявление метода CExpertSignal::CheckCloseLong() ? :-))
Не вполне понял суть вопроса. Функция проверяет необходимость закрытия позиции. Но при чем тут отложенные ордера ? Позиция - закрывается, ордера при этом - остаются. Почему вместе с закрытием позиции необходимо еще и удалить отложки ?
- www.mql5.com
Laryx:
Не вполне понял суть вопроса. Функция проверяет необходимость закрытия позиции. Но при чем тут отложенные ордера ? Позиция - закрывается, ордера при этом - остаются. Почему вместе с закрытием позиции необходимо еще и удалить отложки ?
Laryx, что значит ключевое слово virtual?
virtual bool CheckCloseLong(double &price);
И ещё раз "Библиотека ведь недаром называется Стандартной..."
Laryx, что значит ключевое слово virtual?
Ну, насколько я понимаю, слово virtual устанавливает "позднее связывание" - то есть, если есть иерархия объектов, в которой существует перегруженная функция с таким спецификатором, то какую именно из имеющихся перегружаемых функцию вызывать в конкретном случае, выясняется не в момент компиляции, а в момент создания объекта. Таким образом, можно указатели на объект преобразовать к базовому типу, и вызывать функцию у базового типа - но вызываться будет по-прежнему функция потомка, хотя в тексте программы будет присутствовать указатель на предка.
Применительно к данному случаю это означает всего лишь то, что есть возможность написать наследника класса CSignal, где написать свою собственную функцию CheckCloseLong(double&), которая будет вызываться в функции CExpert::CheckDeleteOrderLong(void).
Однако, вопрос прежний - при чем тут отложенные ордера ? Этой перегруженной функцией я просто могу задать функциональность сигнала в плане закрытия позиций. Но при этом все равно будет удален выбранный отложенный ордер. Я и спрашиваю - почему ? Это "баг или фича" ? Почему закрытие позиции в стандартной реализации подразумевает удаление отложенных ордеров ?
И ещё раз "Библиотека ведь недаром называется Стандартной..."
Именно поэтому я и спрашиваю. У себя в коде я давно уже переопределил функцию CExpert::CheckDeleteOrderLong(void), и она у меня отложки не удаляет, а только закрывает позицию, если это требует сигнал. Но почему по стандарту отложки удаляются ?
Laryx, Вы сами ответили на свой вопрос. Причём на хорошем уровне :-))
А самое главное, что Вы сделали то, что и нужно делать в таких случаях, когда нужна другая реализация метода.
Не будьте так строги к Разработчику относительно Стандартной библиотеки...
Скорее второе.
Скорее второе.
Аааа... Семен-семеныч !!!! :-)))
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
К сожалению, объектами Стандартной Библиотеки народ не больно-то пользуется, но все же, может кто мне расскажет...
В Стандартной Библиотеке в классе 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()) - то одновременно удаляется текущий ордер (???).
Я не понимаю смысла данной операции. Как связана необходимость закрытия позиции сигналом с необходимостью удаления отложенных ордеров ?
Понятное дело, сейчас перегружу эту функцию, чтобы ордера удалялись тогда, когда сигнал потребует удаления отложенных ордеров, но все же хотелось бы понять и чем руководствовались разработчики при написании этого функционала.