Если срабатывает SetOrder - эксперт после открытия позиции начинает работу сначала или дальше с текущего места?

 
Если срабатывает SetOrder - эксперт после открытия позиции начинает работу сначала или дальше с текущего места?
 
это зависит от того, стоит после SetOrder инструкция exit или нет
 
Exit не стоит, но эксперт работу дальше не продолжает
 
работа экспертов после торговых операций
Как Вы обнаружили что эксперт "дальше не работает" ?
Поставьте команду print("Оказывается, эксперт работает дальше!") после SetOrder и запустите эксперта.
 
да нет... все-таки не работает!
Пробовал написать эксперта, который бы открывал позиции на основе теории Билла Вильямса - т.е. пользуясь тремя разными системами входа и выхода соответственно для отдельной позиции.

Для этого после открытия позиции - записываем номер тикета в глобальную переменную... и таким образом потом имеем возможность проверить позицию - не пора ли ее закрывать.
На мой взгляд проверка номера тикета - самый верный способ проводить операции именно над той позицией которую открывал эксперт. Но тут возникает проблема...

Часть кода:

SetOrder(OP_SELL,QLots,Ask,Slippage,Bid+StopLoss*Point,0,Blue);
SetGlobalVariable("LTicket",OrderValue(TotalTrades,VAL_TICKET));
Print ("LTicket", LTicket);
Exit;

После чего читем журнал и видим только:

'146579': order succesfull
'146579': order sell 1.00 EURUSD at 1.1717 sl: 1.1967 tp: 0.0000

И наступает длиннющая пауза... :(
Таким образом делаем вывод, что после открытия позиции экпертом последующие операторы по-просту не срабатывают и соответственно никакие глобальные переменные никуда не записываются. При тестировании на истории (OHLC) таких прoблем не было...
Буду благодарен если посоветуете как это решить.
 
кстати, вот и место ошибки
Кстати, вот и место, где передается 0 в OrderValue
SetGlobalVariable("LTicket",OrderValue(TotalTrades,VAL_TICKET));
После выдачи(только выдачи, а не совершения сделки и открытия позиции!) команды на совершение операции позиция не открывается тут же. Поэтому вызов OrderValue(TotalTrades,VAL_TICKET) неправомерен.
Посмотрите на время строк:
'146579': order sell 1.00 EURUSD at 1.1717 sl: 1.1967 tp: 0.0000
'146579': order succesfull
Время будет разным - операция длится несколько секунд (если связь не идеальная и это не демо-счет).

Следующий момент - в коде:
SetGlobalVariable("LTicket",OrderValue(TotalTrades,VAL_TICKET));
Print ("LTicket", LTicket);

Вы вероятно думаете что командой SetGlobalVariable("LTicket", присваиваете значение локальной переменной LTicket ?
Это не так. Глобальные переменные именные строковые и не имеют никакого отношения к локальным переменным, описанным через var: xxxx
 
Понял. Спасибо! но как же решить эту проблему?
Я имею в виду - как сделать, чтобы
SetGlobalVariable("LTicket",OrderValue(TotalTrades,VAL_TICKET));
записывал номер последнего лота в глобальную переменную и потом можно было проверить открыт ли ордер с таким номером и соответственно принимать соответствующие решения по нему?

Насчет "Следующего момента" - я все это понимаю... но все-равно спасибо.
 
проблема явно не решаема в MT 3.xx
Проблема определения номера ордера только что заказанной(именно заказанной, а не исполненной) операции явно не решаема в MT 3.xx .
Дело в том, что исполнением заявки занимается отдельный поток выполнения, который может завершить операцию через 3-5-10-20-NNN секунд. Эксперт не ждет завершения торговых операций, он лишь ставит свои заявки в очередь(кстати, в очереди не может быть более одной заявки одновременно) на выполнение.

В MT 4 мы введем полный контроль за совершением торговых операций со стороны эксперта. То есть, эксперт будет ждать завершения операции и получит номер тикета и код результата операции.
 
Ну что ж... и на этом спасибо! Только еще сориентируйте пожалуйста когда выйдет 4 версия?
Причина обращения: