Как выполнить ограничение на колчиство ордеров?

 
В правилах чемпионата есть торговое условие - Максимальное количество одновременно выставленных ордеров (включая отложенные) - 3. как обеспечить в советнике выполнение этого условия? или это ограничение будет контролировать сервер, и советник не сможет открыть более трех ордеров ? вопрос возник потому, что сегодня на демо счете у меня советник открыл четыре отложенных ордера с одним и тем же временем код примерно такой: int start() { // здесь проверка разных условий на открытие отложек if (OrdersTotal()==0) { OrderSend(OP_SELLSTOP); OrderSend(OP_BUYSTOP); } } в терминале в один момент появилось четыре отложенных ордера (2 - SELLSTOP и 2-BUYSTOP) с одним и тем же временем секунда в секунду очевидно что в промежуток времени 1 секунды поступило больше одной котировки и функция start успела отработать более двух раз а вот функция OrdersTotal() не распознала что два ордера уже были открыты сервер принял на исполнение открытие дух ордеров и открыл их два раза каким-то образом поставив у себя на очередь, но информация о том что первые два уже были открыты терминал понять не смог! Самое удивительное произошло, когда цена достигла цены открытия указанной в ордере BUYSTOP как вы думаете, что было после этого?
 
Loky:
В правилах чемпионата есть торговое условие - Максимальное количество одновременно выставленных ордеров (включая отложенные) - 3. как обеспечить в советнике выполнение этого условия? или это ограничение будет контролировать сервер, и советник не сможет открыть более трех ордеров ? вопрос возник потому, что сегодня на демо счете у меня советник открыл четыре отложенных ордера с одним и тем же временем код примерно такой: int start() { // здесь проверка разных условий на открытие отложек if (OrdersTotal()==0) { OrderSend(OP_SELLSTOP); OrderSend(OP_BUYSTOP); } } в терминале в один момент появилось четыре отложенных ордера (2 - SELLSTOP и 2-BUYSTOP) с одним и тем же временем секунда в секунду очевидно что в промежуток времени 1 секунды поступило больше одной котировки и функция start успела отработать более двух раз а вот функция OrdersTotal() не распознала что два ордера уже были открыты сервер принял на исполнение открытие дух ордеров и открыл их два раза каким-то образом поставив у себя на очередь, но информация о том что первые два уже были открыты терминал понять не смог! Самое удивительное произошло, когда цена достигла цены открытия указанной в ордере BUYSTOP как вы думаете, что было после этого?


if ( OrdersTotal() <= 2 )
{
// МОЖНО ОТКРЫТЬ
}
else
{
// увы - уже открыто 3 ордера

}
 
В статье советы для Участников Чемпионата нашел ответ на один из заданных мной вопросов Все ограничения связаны с функцией OrderSend. Нужно программно отслеживать ограничения и не допускать ошибочного вызова этой функции. При неправильном значении объема (количество лотов меньше минимально допустимого значения, либо больше максимального значения, либо ошибка грануляции) функция вернет ошибку. GetLastError() вернет код 131(ERR_INVALID_TRADE_VOLUME). Торговый сервер не будет пропускать торговые операции, нарушающие ограничения Чемпионата. При этом вся информация о таких нарушениях будет сохраняться в логах сервера. Эксперт, регулярно допускающий нарушения вышеперечисленных ограничений, может быть дисквалифицирован и снят с участия в чемпионате. как же избежать дисквалификацию и снятия с участия в чемпионате если в скрипте стоит проверка на количество открытых ордеров (OrdersTotal()==0) но она не всегда срабатывает ???????????
 
надо написать правильно:) тогда будет срабатывать всегда
 
sashken, подскажи если знаешь, как написать 100% проверку сколько ордеров открыто? только пауза после открытия и выжидания неизвестно какого события неприемлема
 
когда цена достигла уровня, по которому должны были исполниться два отложенных ордера, почему-то открылся только один ордер BUY с количеством лотов равным одному отложенному ордеру
 
Loky:
когда цена достигла уровня, по которому должны были исполниться два отложенных ордера, почему-то открылся только один ордер BUY с количеством лотов равным одному отложенному ордеру

Если вторым ордером был SELL, то нужно учитывать, что BUY открывается по Ask. Поэтому если оба ордера были выставлены по одной цене, то он открылся раньше, а до второго ордера, который открывается по Bid, цена могла не дойти.
 
bstone:
Loky:
когда цена достигла уровня, по которому должны были исполниться два отложенных ордера, почему-то открылся только один ордер BUY с количеством лотов равным одному отложенному ордеру

Если вторым ордером был SELL, то нужно учитывать, что BUY открывается по Ask. Поэтому если оба ордера были выставлены по одной цене, то он открылся раньше, а до второго ордера, который открывается по Bid, цена могла не дойти.

Да нет не так.

Планировалось открыть только два разнонаправленных отложенных ордера

if (OrdersTotal()==0) { OrderSend(OP_SELLSTOP); OrderSend(OP_BUYSTOP);

но каким то волшебным образом открылось 4 ордера 2 sellstop и 2 buystop и вот когда цена поднялась до уровня buystop 2 отложенных ордера - близнеца (отличались только тикетами) сработали но появился только ОДИН ордер buy с одинарным лотом.

Поэтому и возник вопрос как недопустить открытие больше 3 ордеров

 
Loky:
В правилах чемпионата есть торговое условие - Максимальное количество одновременно выставленных ордеров (включая отложенные) - 3. как обеспечить в советнике выполнение этого условия? ..
Может быть, Вам поможет это: Учёт ордеров в большой программе.
 
Loky:

Да нет не так.

Логи в студию. Пока все, что вы говорите больше смахивает на мистику.
Причина обращения: