А в частном случае, когда идет такая вот последовательность:
if(OrderSelect(...)) { ... // что-то очень быстрое и незатратное if(OrderClose(..., OrderClosePrice()) .... }то можно использовать. Но если будут появляться сообщения об частых реквотах или ошибках, то стоит серьезно подумать над более корректной реализацией.
В общем случае нельзя. OrderClosePrice содержит закешированное значение на момент вызова OrderSelect и это значение может устареть к моменту вызова OrderClose.
А в частном случае, когда идет такая вот последовательность:
if(OrderSelect(...)) { ... // что-то очень быстрое и незатратное if(OrderClose(..., OrderClosePrice()) .... }то можно использовать. Но если будут появляться сообщения об частых реквотах или ошибках, то стоит серьезно подумать над более корректной реализацией.
Что-то здесь не сходится.
Вообще, идея иметь под рукой текущую цену закрытия для открытых ордеров не так уж и плоха. Еще лучше было бы и вовсе исключить этот параметр из OrderClose() ввиду его безальтернативности. Какой смысл каждый раз выбирать между Ask и Bid в зависимости от типа одрера, если этот выбор всегда один и тот же?
Кстати, пример в русской версии документации к OrderClosePrice() нерелевантен.
Это стандартная ошибка экспертописателей в восприятии рыночного окружения. Цена никак не является неизменной, а может (и делает это постоянно) измениться в любой момент. Не забывайте про асинхронные процессы - все рыночное окружение меняется, а трейдер может только успеть (или не успеть) сделать сделку по текущим ценам.
OrderClosePrice хранит закешированную текущую цену, по которой можно было бы закрыть ордер. OrderClosePrice обновляется (фиксируется) только после вызова OrderSelect и никак не меняется от вызовов RefreshRates. OrderClosePrice равен Ask для SELL ордеров и Bid для BUY.
С учетом Ваших вопросов я настоятельно рекомендую не использовать OrderClosePrice в операциях закрытия позиций.
Это создает разные проблемы и усложняет код ...
Обычно ведь нужно закрыть по текущему рынку.
Других ситуаций я чтото представить не могу.
Может быть есть смысл расширить функционал и разрешить указывать вместо цены 0,
что могло бы означать - закрыть по рынку?
>> если цена остается неизменной в обработчике тиков
Это стандартная ошибка экспертописателей в восприятии рыночного окружения. Цена никак не является неизменной, а может (и делает это постоянно) измениться в любой момент. Не забывайте про асинхронные процессы - все рыночное окружение меняется, а трейдер может только успеть (или не успеть) сделать сделку по текущим ценам.
Про асинхронные процессы я не забываю никогда с тех пор, как посвятил несколько лет программированию систем жесткого реального времени под QNX. Кстати, Metaquotes до сих пор не исправил ошибку с race condition при инициализации глобальных переменных, про которую я говорил год назад.
С учетом Ваших вопросов я настоятельно рекомендую не использовать OrderClosePrice в операциях закрытия позиций.
В любом случае, OrderSelect() после RefreshRates() - очевидный workaround для OrderClosePrice(). Хотя, наверное, и медленный.
А я так и непонял, зачем в OrderClose нужно указывать цену закрытия?
Это создает разные проблемы и усложняет код ...
Обычно ведь нужно закрыть по текущему рынку.
Других ситуаций я чтото представить не могу.
Может быть есть смысл расширить функционал и разрешить указывать вместо цены 0,
что могло бы означать - закрыть по рынку?
Мы специально жестко проверяем цены, чтобы не дать писать очень плохих экспертов. Ошибки с выбором цен указывают на серьезные проблемы в эксперте. Если разрешим писать все что угодно в торговых заявках, то качество экспертов будет абсолютно неприемлемым. И в этом обязательно обвинят разработчиков, которые допускают такие глупости в торговых заявках.
В любом случае, OrderSelect() после RefreshRates() - очевидный workaround для OrderClosePrice(). Хотя, наверное, и медленный.
Ask и Bid, как известно, берут значения из копии рыночного окружения, которая без вызова RefreshRates() остается неизменной. Термин "текущая цена закрытия", так же как и обсуждаемое значение OrderClosePrice(), очевидно, был применен в контексте рыночного окружения обработчика тиков, а не в контексте реального времени. Так что, замечание по поводу экспертописателей с их ошибками и восприятием не имеет к сказанному мной никакого отношения.
Имеет самое непосредственное отношение, так как устаревание относилось к Вашему вопросу "как это значение может устареть, если цена остается неизменной в обработчике тиков?" Устаревание по отношению к внешним рыночным ценам, о которых знает сервер.Именно такие вопросы создают сомнения в правильном восприятии цен и способах их использования.
Дело в том, что трейдер точно должен знать цену, по которой он хочет закрыться. Мало кто захочет, чтобы его закрывали по рынку - у трейдеров будут постоянные подозрения о слиппажах. В принципе, нулевая цена могла бы быть выходом, но не думаю, что мы на это пойдем.
Мы специально жестко проверяем цены, чтобы не дать писать очень плохих экспертов. Ошибки с выбором цен указывают на серьезные проблемы в эксперте. Если разрешим писать все что угодно в торговых заявках, то качество экспертов будет абсолютно неприемлемым. И в этом обязательно обвинят разработчиков, которые допускают такие глупости в торговых заявках.
Я к примеру уверен, что 99% экспертов будут использовать закрытие по рынку,
потому, что сейчас всем это приходится эмулировать руками добавляя кучу кода,
и потом проверяя ошибки (реквоты) и учитывать эти особенности в построении всего эксперта.
Не рекомендую из-за сомнений в правильности его использования на фоне задаваемых вопросов.
А что мешает абстрагироваться от фона задаваемых вопросов? Ответ
по существу представлял бы намного большую ценность.
Весьма сомнительное утверждение. Особенно на фоне :) спекуляций
об изменении рыночной цены и значения цены в обработчике тиков.
Именно такие вопросы создают сомнения в правильном восприятии цен и способах их использования.
Опа. Помнится, вырванное из контекста утверждение было любимым
оружием газеты Прав?Да! в идеологической борьбе. Которую она,
к слову сказать, с треском проиграла.
Позволю себе напомнить, в оригинале текст был такой: "как это значение может устареть, если цена остается неизменной
в обработчике тиков? По крайней мере, до вызова RefreshRates()." Что соответствует документации
и легко может быть проверено простейшим советником. На всякий
случай повторюсь, речь идет не о текущей рыночной цене, а о значениях
Ask и Bid в функции start().
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Корректно ли использование данной конструкции:
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,CLR_NONE)
Проверка работы на демо счете показала, что функция возвращает текущие Bid для BUY и Ask для SELL, то есть все верно.
В документации не сказано о применении функции OrderClosePrice() к открытым ордерам.