Ошибки, баги, вопросы - страница 2106

 
fxsaber:

В СД нужно писать. Иначе так и будете после каждого OrderSend по три минуты ожидать таймаута, получая соответствующие торговые риски.


так и сделал. 

эта ошибка случается 1 из 1000, и пока только на VPS от MQL такое было... 
 
Vladislav Andruschenko:

соответственно советник получает ошибку 10012 и пытается еще раз выставить ордер.

Я бы за такой код в Маркете лишал бы статуса Продавца на год
 
A100:
Я бы за такой код в Маркете лишал бы статуса Продавца на год

я первый раз столкнулся с такой ошибкой. 

у меня нет в коде обработки такой ошибки. нет тикета - значит сделка не открылась. значит советник снова пытается открыть сделку. 
 
Vladislav Andruschenko:

проблема в принципе решаема, после получения ошибки таймаута запускать функцию перебора новых тикетов в истории. 

История не при чем. OrderSend отправляет приказ, и он СРАЗУ повляется в Терминале с состоянием ORDER_STATE_STARTED.

Но это не обозначает, что OrderSend завершил выполнение. OrderSend будет выполняться до тех пор, пока статус ордера не изменится.

Поэтому если Вы видите таймаут, это на 99% обозначает, что статус ордера ORDER_STATE_STARTED (вижу placed, но не ясно, когда скрин сделал.).

Более того, такой же таймаут может случиться без Вашего OrderSend - когда MT5-сервер делает сам OrderSend (TP/SL/MC/Expiration). Но Вы его не увидите в Терминале.

 
Vladislav Andruschenko:
у меня нет в коде обработки такой ошибки. нет тикета - значит сделка не открылась. значит советник снова пытается открыть сделку. 

Это неправильная логика. После неудачного и удачного OrderSend должно быть заново полностью считано текущее торговое окружение. Это правило должно действовать всегда.

Насчет кодов возврата. В своих советниках никак не анализирую их. По-моему, торговая логика не должна от них зависеть.

 
fxsaber:

Это неправильная логика. После неудачного и удачного OrderSend должно быть заново полностью считано текущее торговое окружение. Это правило должно действовать всегда.


согласен. надо менять. 

 
Vladislav Andruschenko:

согласен. надо менять. 

По этому правилу ветка есть.

Организация цикла перебора ордеров
Организация цикла перебора ордеров
  • 2017.09.16
  • www.mql5.com
MQL4 и MetaTrader 4: Организация цикла перебора ордеров
 
fxsaber:

По этому правилу ветка есть.


да я читал отрывками про функцию доступа к истории только при изменении окружения, и встречал ваши ссылки в других темах.

как раз в точку, ошибка появилась после прочтения вашего вариант. 

 
fxsaber:

Это неправильная логика. После неудачного и удачного OrderSend должно быть заново полностью считано текущее торговое окружение. Это правило должно действовать всегда.

Насчет кодов возврата. В своих советниках никак не анализирую их. По-моему, торговая логика не должна от них зависеть.

Теоретически, тайм-аут может случиться во время потери связи с сервером брокера.

В этом случае лучше вообще ничего не делать до ее восстановления и до полной синхронизации торгового окружения с сервером.

Как не попасть в такую ситуацию, не анализируя код возврата?

 

Ошибка компиляции.


Файл Test.mqh

int Tmp = 1;


Основной код

#include "Test.mqh"

void OnStart()
{
  Print(Tmp);
  Print(Tmp2); // 'Tmp2' - undeclared identifier
}

#define Tmp Tmp2
#include "Test.mqh"


Получается, что повторный инклуд игнорируется. Но в данной сиуации это неправильно!

Нужна такая конструкция для следующего. Советник содержится в mqh-файле. Но мне нужно иметь возможно его запустить и на реале (первый инклуд) и в своем тестере (второй инклуд).