Флаг ExpertRemove и неудалившийся ордер

 

Добрый день коллеги. Два вопроса.


1. Каким флагом (функцией) проверяется сработавший ExpertRemove()?


2. Кто-нибудь сталкивался с такой проблемой (возникло один раз, хочу понять насколько такое часто происходит) - Поток свободен, OrderDelete() на отложенный ордер вернул true, а ордер не удалился. По журналу ошибка - поток занят. 

 
Reactor555:

Добрый день коллеги. Два вопроса.


1. Каким флагом (функцией) проверяется сработавший ExpertRemove()?


2. Кто-нибудь сталкивался с такой проблемой (возникло один раз, хочу понять насколько такое часто происходит) - Поток свободен, OrderDelete() на отложенный ордер вернул true, а ордер не удалился. По журналу ошибка - поток занят. 


Надо что-то в Deinit делать, если есть такая нужда. Например писать флаг в Глобальную переменную терминала через

GlobalVariableSet


Вот из хелпа.

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.

 
Alexey Volchanskiy:

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.


Это я читал. Вопрос в том, есть ли у меня доступ к этому флагу.

 
Reactor555:

Это я читал. Вопрос в том, есть ли у меня доступ к этому флагу.

Просто надо засомневаться, что OrderDelete() вернул true и перед удалением советника проверять всё что надо.

 
Reactor555:

1. Каким флагом (функцией) проверяется сработавший ExpertRemove()?

_StopFlag, но есть особенность в MT5 (возможно, и в MT4)

2. Кто-нибудь сталкивался с такой проблемой (возникло один раз, хочу понять насколько такое часто происходит) - Поток свободен, OrderDelete() на отложенный ордер вернул true, а ордер не удалился. По журналу ошибка - поток занят. 

Скорее всего, OrderDelete вернул false. Иначе это очень серьезный баг, о котором еще никто за годы не сообщал.

 

Скорее всего, OrderDelete вернул false. Иначе это очень серьезный баг, о котором еще никто за годы не сообщал.


bb = OrderDelete( maso [ i ] ); else if ( OrderCloseTime() == nd );

 if ( !bb ) Alert ( ExName + " Ошибка удаления ордера" );


Это выдержка из программы. Сообщения об ошибке не было.

 
fxsaber:

_StopFlag, но есть особенность в MT5 (возможно, и в MT4)


Я вот тоже думал, что он. Но нигде нет конкретного описания, что это именно он. Везде написано "принудительное прерываение программы"... а что это за прерывание не написано.

 
Reactor555:

Я вот тоже думал, что он. Но нигде нет конкретного описания, что это именно он. Везде написано "принудительное прерываение программы"... а что это за прерывание не написано.

Прерывание может произойти ИСКЛЮЧИТЕЛЬНО ПОСЛЕ того как закончится выполнение события. То-есть если ExpertRemove() вызван из void OnTick(), то эксперт будет удалён с графика после того как выполнение программы дойдёт до последней фигурной скобки или команды return.

 
Reactor555:

bb = OrderDelete( maso [ i ] );
 else if ( OrderCloseTime() == nd );

 if ( !bb ) Alert ( ExName + " Ошибка удаления ордера" );



Это выдержка из программы. Сообщения об ошибке не было.

А где if которому относится else может и не должно было выполняться Alert()???

 
Alexey Viktorov:

А где if которому относится else может и не должно было выполняться Alert()???


bb = OrderDelete( maso [ i ] ); 

 if ( !bb ) Alert ( ExName + " Ошибка удаления ордера" );


извините... случайно вышло...

 
Reactor555:

bb = OrderDelete( maso [ i ] ); 

 if ( !bb ) Alert ( ExName + " Ошибка удаления ордера" );


извините... случайно вышло...

Случайно такое не выходит.

А откуда знаете, что OrderDelete вообще вызывался?