Проблема в МТ3

 
Работает эксперт по 7 парам. В час X начинает открывать позиции.
В начале эксперта прописан 11-секундный таймаут: If (CurTime-LastTradeTime) < 11 then Exit;
Все вроде бы хорошо. Только вот стало появляться сообщение: Expert 'XXX': unknown error in SetOrder
Немного поразмыслив и исследовав лог, я нашел причину. Вот она:
22:59:48 Expert 'XXX': sell 0.40 EURJPY at 132.2800 [slippage 3], sl: 133.5800 tp: 132.1700
22:59:48 Expert 'XXX': sell 0.40 GBPCHF at 2.3152 [slippage 3], sl: 2.3282 tp: 2.3141
22:59:48 Expert 'XXX': sell 0.40 GBPJPY at 198.9000 [slippage 3], sl: 200.2000 tp: 198.7900
22:59:48 Expert 'XXX': sell 0.40 EURUSD at 1.2111 [slippage 3], sl: 1.2241 tp: 1.2100
22:59:48 Expert 'XXX': unknown error in SetOrder
22:59:48 Expert 'XXX': unknown error in SetOrder
22:59:48 Expert 'XXX': unknown error in SetOrder



Получается, что по прошествии 11 секунд все 4 окна одновременно дают сигнал на открытие.
Т.е. нужен механизм очередности.
Что вы можете посоветовать, чтобы разрулить эту ситуацию?

 
Используй глобальную переменную. Правда, до конца не уверен, что это разрулит перекресток.
if (надо открыть позицию)and(CurTime-GlobalLastTrade>11)
{
SetOrder(....);
SetGlobal....(GlobalLastTrade)
}
Но не уверен, что они (эксперты) не умудрятся опять все вместе ломануться.
Кто успел (валюта) - тот и Sell :))

Или надо валюты ранжировать - Фунт только после Евры, Франк после Фунта и так далее.
 
Да - скорее всего придется выстраивать цепочку - кто за кем открывается.
Но опять же - если первым например идет eurusd, и все его ждут, а он ждет первого тика, то получается простой.

По поводу глобальной переменной. Если я вызываю
if (!GetGlobal) {
SetGlobal
SetOrder
}

то не факт - что другие не успеют вклиниться.
По хорошему операция занятия очереди должна быть равна одной машинной инструкции.
Тогда никто не вклинится.
 
Если очередность открытия не важна, то можно вообще не разруливать. Кто первым откроется - молодец, остальные ждут. Если сигнал на открытие через несколько тиков не пропадает, то все равно через таймаут все откроются. Если же сигнала повторно не будет, ввести переменную БылСигнал и проверять ее значение и наличие ордера в рынке.
 
Конечно потом все постепенно открывается. Дело в том - не напрягает ли это брокера?
 
то не факт - что другие не успеют вклиниться.
По хорошему операция занятия очереди должна быть равна одной машинной инструкции.
Тогда никто не вклинится.

А в МТ3 кажется нет многозадачности?
Все скрипты работают по очереди?
Поэтому и ограничения на работу скрипта в 1 сек?
(вопросы к разработчикам)

Если это так, то таких проблем у вас быть не может.
 
Если бы SetOrder работал с ожиданием как в MT4 проблем по идее бы не было