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

 
fxsaber:

Из Агента через фрейм нужно вытащить всю необходимую инфу для анализа.

Всегда на 19 % такое происходят. Нашёл тему, говорят это из-за истории. 
Буду пробовать. 
 

Вся череда событий OnTradeTransaction идет после завершения OrderSend.

Советник

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{ 
  static bool FirstRun = true;  
  static ulong StartTime;
  
  if (FirstRun)
  {
    StartTime = GetMicrosecondCount();
    
    FirstRun = false;
  }

  Print(EnumToString(Trans.type));
  Print((GetMicrosecondCount() - StartTime) / 1000);    
}

Руками отправляем торговый приказ.

Лог

2018.02.14 09:41:46.671 '8854170': instant sell 1.00 EURUSD at 1.23673
2018.02.14 09:41:46.853 '8854170': accepted instant sell 1.00 EURUSD at 1.23673
2018.02.14 09:41:46.853 '8854170': deal #192088422 sell 1.00 EURUSD at 1.23673 done (based on order #208541700)
2018.02.14 09:41:46.853 '8854170': order #208541700 sell 1.00 / 1.00 EURUSD at 1.23673 done in 190.608 ms


Результат советника

2018.02.14 09:41:46.853 TRADE_TRANSACTION_ORDER_ADD
2018.02.14 09:41:46.853 0
2018.02.14 09:41:46.853 TRADE_TRANSACTION_DEAL_ADD
2018.02.14 09:41:46.853 1
2018.02.14 09:41:46.853 TRADE_TRANSACTION_ORDER_DELETE
2018.02.14 09:41:46.853 1
2018.02.14 09:41:46.853 TRADE_TRANSACTION_HISTORY_ADD
2018.02.14 09:41:46.853 2
2018.02.14 09:41:46.853 TRADE_TRANSACTION_REQUEST
2018.02.14 09:41:46.853 2


Отлично видно и по столбцу времени и по числовым показателям советника, что длительность выполнения торгового приказа никак не сказывается на череде событий OnTradeTransaction. Вся асинхронность летит к чертям! Умудрились же так напортачить. Build 1755.

 

Символ имеет Digits == 3

при этом в логе гораздо больше цифр выводится

'18000903': failed modify order #896199 buy limit 0.01 BTCUSD at 616.00100 sl: 0.00000 tp: 0.00000 -> 616.00100, sl: 0.00000 tp: 616.10100 [Invalid request]
 
В режиме "Ордера и Сделки" просмотра торговой истории не хватает столбца "Комментарий".
 
Гадкий баг не Терминала, а Платформы MT5
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, Bid);
  
//  OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 100, 0, 0);
}

Запускаем на MQ-Demo на каком-нибудь медленно двигающемся символе. Например, EURHUF.

Скрипт открывает BUY-позицию с TP = Bid. Т.е. позиция должна сразу закрыться. Но TP будет проверяться на соответствие условию акцептирования только на следующем тике!

Никакого мгновенного закрытия позиции не произойдет, пока не придет новый тик. Более того, если следующий у следующего тика будет Bid < TP, то TP так и останется без акцепта.


Это же касается и лимитных ордеров (закомментированная строка). В Тестере - аналогичная ситуация.

 
fxsaber:
Гадкий баг не Терминала, а Платформы MT5

Запускаем на MQ-Demo на каком-нибудь медленно двигающемся символе. Например, EURHUF.

Скрипт открывает BUY-позицию с TP = Bid. Т.е. позиция должна сразу закрыться. Но TP будет проверяться на соответствие условию акцептирования только на следующем тике!

Никакого мгновенного закрытия позиции не произойдет, пока не придет новый тик. Более того, если следующий у следующего тика будет Bid < TP, то TP так и останется без акцепта.


Это же касается и лимитных ордеров (закомментированная строка). В Тестере - аналогичная ситуация.

Пожалуйста в вопросах по MQL5 прикладывайте чистый MQL5 код. 

Надоело видеть Вашу НАСТЫРНУЮ рекламу по поводу и без.
 
Vladimir Karputov:

Пожалуйста в вопросах по MQL5 прикладывайте чистый MQL5 код. 

Баг не касается MQL5.

 
Vladimir Karputov:
Надоело видеть Вашу НАСТЫРНУЮ рекламу по поводу и без.

рекламу чего?

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL5 MT5 MetaTrader 5".
 
fxsaber:

Открываю руками BUY-позицию на двух торговых демо-серверах


RoboForex-MetaTrader 5


FXOpen-MT5

Строки одного цвета обозначают одно и то же. Однако, хорошо видно, что они идут в разных очередностях. У Робо сообщение о выполнении приказа приходит после выполнения сделки. А у опенов - ДО! По этой причине OrderSend возвращает удачу, но сделки еще нет. Т.е. получаем несинхронизированность OrderSend с историей, что есть баг. В чем причина?

Если ордер отправдяется во внешнюю торговую систему, то торговый сервер MetaTrader 5 не ждет ответа от неё и сразу возвращает результат запроса как "ордер размещен". По этой причине OrderSend всегда вернет deal=0, так как информации о совершенной сделке еще нет. Ловите её в OnTrade или OnTradeTransaction.

Пример слушателя торговых событий дан в статье С чего начать при создании торгового робота для Московской биржи MOEX - TradeTransactionListener.mq5