OrderSelect = false. Исключение, допустимая ситуация или закономерность ?..

 

Всем добрый день!

Интересный и полезный вопрос из разряда контроля ордеров.

При инициализации советника, после перезапуска или после перезагрузки компа, нам обязательно необходимо определить принадлежность уже открытых ордеров... определить «свои» ордера, запомнить их характеристики и т.п.

Для этого в MQL мы сначала используем функцию OrderTotal, затем .

И тут самое интересное. В документации по MQL сказано, что одно из возможных возвращаемых функцией OrderSelect значений это false.

Как же быть с обработкой такой ситуации ?

Если OrderSelect возвращает false при переборе открытых позиций, то мы уже не можем достоверно определить был ли не выбранный ордер «наш» или не «наш». Таким образом, мы не можем утверждать, что алгоритм работы советника с ордерами удается восстановить.

Одно из решений которое я вижу для себя, это повторять попытки выбора ордеров, до тех пор пока OrderSelect не вернет true для всех открытых ордеров... Однако не введет ли такое решение нас в бесконечное ожидание ?

Важно определить как лучше обрабатывать такую ситуацию.

Еще интересно понять при каких вообще ситуациях OrderSelect способен вернуть false ?

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

А как поступаете Вы ? и какие у Вас соображение по этой ситуации ?

Буду благодарен всем кто поделиться своим опытом и наблюдениями.

P.S. В любом случае предполагаем, что IsConnected() и IsTradeAllowed() равное true (контролируется отдельным блоком).

 
MaxsiM:

Всем добрый день!

Интересный и полезный вопрос из разряда контроля ордеров.

При инициализации советника, после перезапуска или после перезагрузки компа, нам обязательно необходимо определить принадлежность уже открытых ордеров... определить «свои» ордера, запомнить их характеристики и т.п.

Для этого в MQL мы сначала используем функцию OrderTotal, затем .

И тут самое интересное. В документации по MQL сказано, что одно из возможных возвращаемых функцией OrderSelect значений это false.

Как же быть с обработкой такой ситуации ?

Если OrderSelect возвращает false при переборе открытых позиций, то мы уже не можем достоверно определить был ли не выбранный ордер «наш» или не «наш». Таким образом, мы не можем утверждать, что алгоритм работы советника с ордерами удается восстановить.

Одно из решений которое я вижу для себя, это повторять попытки выбора ордеров, до тех пор пока OrderSelect не вернет true для всех открытых ордеров... Однако не введет ли такое решение нас в бесконечное ожидание ?

Важно определить как лучше обрабатывать такую ситуацию.

Еще интересно понять при каких вообще ситуациях OrderSelect способен вернуть false ?

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

А как поступаете Вы ? и какие у Вас соображение по этой ситуации ?

Буду благодарен всем кто поделиться своим опытом и наблюдениями.

P.S. В любом случае предполагаем, что IsConnected() и IsTradeAllowed() равное true (контролируется отдельным блоком).

OrderSelect просто возвращает, выбран ордер или нет. При обработке ордер был закрыт по стопу например и мы его уже выбрать не сможем. Нужно переходить к следующему ордеру и все.
 
Vinin:
OrderSelect просто возвращает, выбран ордер или нет. При обработке ордер был закрыт по стопу например и мы его уже выбрать не сможем. Нужно переходить к следующему ордеру и все.

OrderSelect(x,SELECT_BY_POS,MODE_TRADES)

в смысле ордер закрыт и мы его выбрать не сможем?

Ведь мы выбираем по номеру позиции только среди открытых ордеров. ....

 
MaxsiM:
Vinin:
OrderSelect просто возвращает, выбран ордер или нет. При обработке ордер был закрыт по стопу например и мы его уже выбрать не сможем. Нужно переходить к следующему ордеру и все.

OrderSelect(x,SELECT_BY_POS,MODE_TRADES)

в смысле ордер закрыт и мы его выбрать не сможем?

Ведь мы выбираем по номеру позиции только среди открытых ордеров. ....


Не только среди открытых, но и в истории тоже. Просто ордер поменял статус (я так считаю), был среди открытых, а теперь уже ущел в историю. Хотя могут быть и другие мнения. Но я проверку делаю всегда на выбор ордера.

 
Vinin:
MaxsiM:
Vinin:
OrderSelect просто возвращает, выбран ордер или нет. При обработке ордер был закрыт по стопу например и мы его уже выбрать не сможем. Нужно переходить к следующему ордеру и все.

OrderSelect(x,SELECT_BY_POS,MODE_TRADES)

в смысле ордер закрыт и мы его выбрать не сможем?

Ведь мы выбираем по номеру позиции только среди открытых ордеров. ....


Не только среди открытых, но и в истории тоже. Просто ордер поменял статус (я так считаю), был среди открытых, а теперь уже ущел в историю. Хотя могут быть и другие мнения. Но я проверку делаю всегда на выбор ордера.


Вообще для ордеров из истории предлагается использовать в OrderSelect режим MODE_HISTORY...

Хотя такая ситуация как вы пишете возможна (возврат false), если ордер ушел в историю в том момент когда мы уже запросили OrderTotal и приступили к перебору ордеров....

 

Интересно есть ли еще какие либо ситуации когда OrderSelect (x, SELECT_BY_POS, MODE_TRADES) способен вернуть false ?...

(кроме той что описана выше, когда ордер уходит в MODE_HISTORY уже после того как мы запросили про помощи OrdersTotal количество ОТКРЫТЫХ ордеров)....

 
Привет,

если делаете цикл по всем ордерам и он в какой-то момент возвращает False из OrderSelect, проще всего (подразумевается, что логических ошибок в этом месте кода нет) перезапустить весь цикл, т.к. часть массива ордеров скорее всего сместилась, иначе рискуем чегонить прохлопать или повторно проехаться по проверенному ранее ордеру. Ситуация достаточно редкая,  поэтому при повторном получении False в новом цикле можно завершать работу советника,  с попутным форматированием дисков (шутка :)).

BRGDS
 
Если fаlse при подсчете ордеров на основаниии которого принимается решение об открытии (и тому подобное) - тогда выскаиваем из start (return(0)), если где-нибудь типа трейлинга - можно продолжать цикл.