Особенности языка mql4, тонкости и приёмы работы - страница 35

 
fxsaber #:

Вот и думаю теперь, как перебрать ВСЕ ордера по ОДНОМУ разу.

Хз. стараться писать так чтобы подобные соскоки не приводили к критичным последствиям.

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

 
Andrei Trukhanovich #:

Как вариант - разносить ботов по разным счетам.

Тогда запрещать, например, expiration отложек. В общем, костыль.

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

 
fxsaber #:

Спасибо за подробный ответ! Вот и думаю теперь, как перебрать ВСЕ ордера по ОДНОМУ разу.

может запомнить первый и последний ордер  ( тикет )?

и после окончания цикла проверить, что первый и последний ордер имеют те же тикеты, что и перед подсчетом

   int n  = OrdersTotal();
   
   if(n == 0) return(0.0);
   else if(n == 1 && OrderSelect(0, SELECT_BY_POS)) return(OrderLots());
   
   int t_last = OrderSelect(n - 1, SELECT_BY_POS) ? OrderTicket() : -1;
   int t_first = OrderSelect(0, SELECT_BY_POS) ? OrderTicket() : -1;


 ЗЫ: по логике за вот такую коллизию должен и отвечать OrderSelect() - вернуть false в случае если изменилась таблица ордеров, но даже не припомню, чтобы где то читал на форуме, что у кого-нибудь OrderSelect() вернул false, как и обработчиков ошибки OrderSelect() тоже не встречал

 
Igor Makanu #:

может запомнить первый и последний ордер  ( тикет )?

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

 
fxsaber #:

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

а полное запоминание тикетов тоже будет давать сбои ибо пока бежим по циклу, может измениться состояние ордеров которые уже обработали


я конечно не уверен, но если будет закрыт ордер когда мы в цикле, то изменится OrderTotal()

если закроется ордер и откроется новый, тогда изменится тикет и/или OrderSelect(0) или  OrderSelect(OrderTotal()-1)


а по Вашему мнению, какая ситуация может произойти, чтобы остались прежние "крайние ордера" и сам OrderTotal() ?

 
Igor Makanu #:

а по Вашему мнению, какая ситуация может произойти, чтобы остались прежние "крайние ордера" и сам OrderTotal() ?

Скорее всего, OrdersTotal поменяется при перетряхивании таблицы ордеров.

А так возможна доливка лимитника с порождением дополнительной позиции.

 
Igor Makanu #:

может запомнить первый и последний ордер  ( тикет )?

запоминание первого ничего не дает

 
fxsaber #:

Существует ли теоретическая возможность, что данный код пропустит какой-то ордер, что существовал ДО и ПОСЛЕ вызова функции? Или же учтет дважды.

Т.е. что происходит с индексацией, когда во время перебора какой-то ордер удалится или появится?

я собираю массив тикетов и работаю с ним.
Если произошло изменение OrdersTotal, или Баланса, или Маржи - значит нужно пересобрать список заново.

то есть ЕА всегда работает только со своими, отобранными тикетами

 
Andrei Trukhanovich #:

запоминание первого ничего не дает

это особенности реализации архитектуры , которые не документированы и никто не гарантирует в дальнейшем...

по сабжу, запомнить OrderTotal() и  OrdersHistoryTotal() , и тикеты крайних ордеров

если после расчетов в цикле изменились эти значения, то обрабатываем


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


единственное на что надеяться, так на скорость работы  OrderSelect() - если правильно помню, то более миллиона вызовов в секунду

 
fxsaber #:

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

Запоминать может и не дорого, а вот отслеживать состояние полное может быть дорого. Согласен с предыдущими, снижать нагрузку логикой разумности и приоритетов.

Асинхронный мир, в котором и мы живем, не гарантирует порядок ответов порядку запросов, и вообще порядка не гарантирует.