MetaEditor build 1467 - страница 4

 

Скрипт несколько десятков раз делает одно и то же через OrderSend (не Async)

  1. Ставит отложенник.
  2. Модифицирует.
  3. Удаляет.
Во время выполнения скрипта шаги 2 и 3 для некоторых ордеров не проходят - ERR_TRADE_SEND_FAILED.

Например, скрипт делает 50 раз одно и то же. Из них для 26-го и 37-го раза отложенник выставляется, но модификация и удаление его не происходит - "Invalid request". 

Это из-за какого-то внутреннего переполнения?

Вот лог

2016.11.11 03:04:53.304 Trades  '8500457': buy limit 1.00 AUDCAD at 1.02387
2016.11.11 03:04:53.364 Trades  '8500457': accepted buy limit 1.00 AUDCAD at 1.02387
2016.11.11 03:04:53.364 Trades  '8500457': order #40316582 buy limit 1.00 / 1.00 AUDCAD at market done in 60.046 ms
2016.11.11 03:04:53.365 Trades  '8500457': modify order #40316582 buy limit 1.00 AUDCAD at 1.02387 sl: 0.00000 tp: 0.00000 -> 1.02387, sl: 1.02287 tp: 0.00000
2016.11.11 03:04:53.423 Trades  '8500457': accepted modify order #40316582 buy limit 1.00 AUDCAD at 1.02387 sl: 0.00000 tp: 0.00000 -> 1.02387, sl: 1.02287 tp: 0.00000
2016.11.11 03:04:53.423 Trades  '8500457': modify #40316582 buy limit 1.00 AUDCAD -> price: 1.02387, sl: 1.02287, tp: 0.00000) done in 58.551 ms
2016.11.11 03:04:53.424 Trades  '8500457': cancel order #40316582 buy limit 1.00 AUDCAD at 1.02387 sl: 1.02287
2016.11.11 03:04:53.483 Trades  '8500457': accepted cancel order #40316582 buy limit 1.00 AUDCAD at 1.02387 sl: 1.02287
2016.11.11 03:04:53.484 Trades  '8500457': cancel #40316582 buy limit 1.00 AUDCAD at market done in 59.999 ms
2016.11.11 03:04:53.485 Trades  '8500457': buy limit 1.00 AUDCAD at 1.02387
2016.11.11 03:04:53.542 Trades  '8500457': accepted buy limit 1.00 AUDCAD at 1.02387
2016.11.11 03:04:53.542 Trades  '8500457': order #40316583 buy limit 1.00 / 1.00 AUDCAD at market done in 57.727 ms
2016.11.11 03:04:53.543 Trades  '8500457': failed modify order #40316583 buy limit 1.00 AUDCAD at 1.02387 sl: 0.00000 tp: 0.00000 -> 1.02387, sl: 1.02287 tp: 0.00000 [Invalid request]
2016.11.11 03:04:53.543 Trades  '8500457': failed cancel order #40316583 buy limit 1.00 AUDCAD at 1.02387 [Invalid request]

2016.11.11 03:04:53.543 Trades  '8500457': buy limit 1.00 AUDCAD at 1.02387
2016.11.11 03:04:53.601 Trades  '8500457': accepted buy limit 1.00 AUDCAD at 1.02387
2016.11.11 03:04:53.602 Trades  '8500457': order #40316584 buy limit 1.00 / 1.00 AUDCAD at market done in 59.059 ms
2016.11.11 03:04:53.603 Trades  '8500457': modify order #40316584 buy limit 1.00 AUDCAD at 1.02387 sl: 0.00000 tp: 0.00000 -> 1.02387, sl: 1.02287 tp: 0.00000
2016.11.11 03:04:53.662 Trades  '8500457': accepted modify order #40316584 buy limit 1.00 AUDCAD at 1.02387 sl: 0.00000 tp: 0.00000 -> 1.02387, sl: 1.02287 tp: 0.00000
2016.11.11 03:04:53.662 Trades  '8500457': modify #40316584 buy limit 1.00 AUDCAD -> price: 1.02387, sl: 1.02287, tp: 0.00000) done in 59.187 ms
2016.11.11 03:04:53.663 Trades  '8500457': cancel order #40316584 buy limit 1.00 AUDCAD at 1.02387 sl: 1.02287
2016.11.11 03:04:53.720 Trades  '8500457': accepted cancel order #40316584 buy limit 1.00 AUDCAD at 1.02387 sl: 1.02287
2016.11.11 03:04:53.721 Trades  '8500457': cancel #40316584 buy limit 1.00 AUDCAD at market done in 58.285 ms

Выделил жирным проблемное место. До и после  этого скрипт с теми же запросами все выполняет (видно по логу). Стоп-уровни точно не участвуют тут - далеко устанавливаю.

Распечатка полученного (от OrderSend) MqlTradeResult-результата

10013 0 0 0.0 0.0 0.0 0.0 Invalid request 0 0

Код 10013.

 

Воспроизводится легко на Hedge и Netto-счетах, включая Metaquotes-Demo. Есть мысли по багу?

 
Просьба описать все ключи в одном месте, а не случайно находить

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Машинное обучение: теория и практика (торговля и не только)

Renat Fatkhullin, 2016.11.10 20:04

Для отключения контроля за делением вещественных на ноль, используйте параметр FpNoZeroCheckOnDivision=1 в разделе [Experts] файла metaeditor.ini

При наличии данного параметра, следующий код выдаст inf

void OnStart()
  {
   double x=0;  
   Print(1/x);
  }

Естественно, наличие данного параметра не избавит от ошибки компиляции при делении на константу 0.0
Print(1/0.0);

'0.0' - division by zero in the constant expression    s1.mq5    8    12
 
fxsaber:
1468
А в этом Вашем случае точно есть миллисекунды? Эксперт закрывал или тестовый торговый сервер по стопу?
 
Slawa:
А в этом Вашем случае точно есть миллисекунды? Эксперт закрывал или тестовый торговый сервер по стопу?
#include <MT4Orders.mqh>

#define TOSTRING(A) #A + " = " + (string)(A)

void OnTick()
{
  static bool FirstRun = true;
    
  if (FirstRun && SymbolInfoDouble(_Symbol, SYMBOL_ASK) != 0)
  {
    const int Ticket = OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);
    
    if (HistoryOrderSelect(Ticket))
      Print(TOSTRING(HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC)));

    if (HistoryDealSelect(Ticket))
      Print(TOSTRING(HistoryDealGetInteger(Ticket, DEAL_TIME_MSC)));    

    FirstRun = false;
  }
}
Результат
2016.11.11 11:25:56     Core 1  2016.11.03 00:00:03   HistoryDealGetInteger(Ticket,DEAL_TIME_MSC) = 1478131203349
2016.11.11 11:25:56     Core 1  2016.11.03 00:00:03   HistoryOrderGetInteger(Ticket,ORDER_TIME_DONE_MSC) = 0
 
Какой смысл спорить о жестко прошитых шрифтах? Правильное решение очевидно - шрифты должны настраиваться.
 

Макросы, вроде, перестали соответствовать C++, но так даже удобнее

#define MACRO(A) A

void f(int, int) {}

void OnStart()
{
  MACRO(f(0, 0)); // отсутствует ошибка "not actual parameters count for macro"
}
 
Slawa:
А в этом Вашем случае точно есть миллисекунды? Эксперт закрывал или тестовый торговый сервер по стопу?

Может быть я немного не в той ветке пишу, но зачем в журналах терминала сделали обратную последовательность прихода сообщений? Можно вернуть как было или сделать параметром?

Билд 1468 х64.

 
Было бы неплохо добавить в структуру MqlBookInfo поле времени поступления данных, для синхронизации при организации тестов на истории стакана и для сравнения латенси с биржевым сервером.