Примеры: Ошибка 146 ("Торговый поток занят") и как с ней бороться

 

New article Ошибка 146 ("Торговый поток занят") и как с ней бороться has been published:

Статья посвящена бесконфликтной торговле нескольких экспертов на одном терминале МТ 4 и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.

Author: Andrey Khatimlianskii

 
Большое спасибо. Это многим будет полезно. Ждём новую статью об обработке ошибок возвращаемых сервером.
 
Конечно, следующая статья уже на подходе ;)

ps: буду признателен за любые конструктивные замечания и предложения по поводу статьи
 
ExpertTrader:

Я не знаю, вроде сделал все так, но проблема осталать...

2006.05.15 12:12:58 TradeDispatcher: trade context is busy

Опишите подробнее ситуацию:
  • какая версия терминала?
  • сколько работает экспертов?
  • во всех экспертах используются функции TradeIsBusy() и TradeIsNotBusy()?
  • перед всеми торговыми операциями?
Желательно привести полный код всех работающих экспертов, тогда я смогу максимально точно воспроизвести ситуацию.
 
ExpertTrader:


4. На момент предыдущего сообщения перед всеми операциями, но т.к. из-за добавления этих функций к трейлинг-стопу выходило сообщение Превышен лимит ожидания (30 сек.)!, и стоп не передвигался, я убрал их от туда.

Вот и ответ на ваш вопрос - слишком частые передвижения СтопЛосса без разделения доступа к торговому потоку.
Надо либо двигать реже (каждые n пунктов), либо поставить больше лимит ожидания.

ps: лучше вместо кода эксперта прикрепить файл - будет удобнее читать комментарии ;)
 

komposter писал(а):

В использовании функций TradeIsBusy() и TradeIsNotBusy() может возникнуть только одна проблема - если после того, как торговый поток будет занят, эксперта удалить с графика, переменная TradeIsBusy останется равной 1
Хотел спросить, а разве не поможет в решении этой проблемы следующее :

if(IsStopped())
{
Print("Эксперт был остановлен пользователем!");
TradeIsBusy=0;
return(-1);
}
и тогда, при ручном удалении эксперта, переменная обнулится ?
Спасибо.
 
ForexFox:
Хотел спросить, а разве не поможет в решении этой проблемы следующее :
if(IsStopped())
{
Print("Эксперт был остановлен пользователем!");
TradeIsBusy=0;
return(-1);
}
и тогда, при ручном удалении эксперта, переменная обнулится ?
Переменная - одна на всех экспертов. Если её обнулять из каждого эксперта, начнётся бардак ;)
Например, если удалить с графика эксперт, который в данный момент не торгует, он обнулит переменную, и несколько других экспертов "подерутся" за торговый поток.
 
komposter:
ForexFox:
Хотел спросить, а разве не поможет в решении этой проблемы следующее :
if(IsStopped())
{
Print("Эксперт был остановлен пользователем!");
TradeIsBusy=0;
return(-1);
}
и тогда, при ручном удалении эксперта, переменная обнулится ?
Переменная - одна на всех экспертов. Если её обнулять из каждого эксперта, начнётся бардак ;)
Например, если удалить с графика эксперт, который в данный момент не торгует, он обнулит переменную, и несколько других экспертов "подерутся" за торговый поток.

А, ну да, все правильно.
Спасибо за разъяснение
 

А на каком же тогда принципе торгуют торговые системы на чемпионате? там же единый поток на каждый сервак, а система обхода ошибки наверняка не у всех в ТС прописана.

 
fornax:

А на каком же тогда принципе торгуют торговые системы на чемпионате? там же единый поток на каждый сервак, а система обхода ошибки наверняка не у всех в ТС прописана.

Эта статья посвящена одновременной работе нескольких экспертов на одном терминале.
На чемпионате каждый эксперт работает на своем терминале, поэтому ошибки 146 быть не может в принципе ;)
 
Подскажите, пожалуйста. В опубликованом алгоритме преведена последовательность
1.// определяем необходимость входа в рынок
2.// рассчитываем уровни Стоп Лосс, Тейк Профит и размер лота
3.// ждём освобождения торгового потока и занимаем его (если произошла ошибка,
4.// выходим)
5.// обновляем рыночную информацию
6.// пересчитываем уровни Стоп Лосс и Тейк Профит
7.// открываем позицию

Вопрос в том, что расчет в соответствии с пунктом 2. нигде не используется и мне кажется его можно пропустить. Ведь мы всё равно повторно расчитывам уровни в пункте 6. Или я не прав?
Причина обращения: