Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - страница 35

 
fxsaber #:
Да - так красивее будет)
 
Forester #:

ДЦ: Ал-ри, хедж, ECN счет.

Не сталкивался, чтобы MQ что-то воспроизвели на сервере, отличном от MQ-Demo. Попробуйте там.

У самого нет в А... счета.

 
Forester #:
Да - так красивее будет)

Правильнее. Например, 12 миллисекунд.

 
Forester #:
П.С. Вместо работы над советником уже 3-й раз за последние 8 дней, трачу время на баги ((. Не туда время уходит, куда хотелось бы. Черный ящик тяжелее исследовать, чем свой код.

Удивляет, что такая ситуация не у всех. Видимо, слишком доскональный подход.

 
fxsaber #:

Удивляет, что такая ситуация не у всех. Видимо, слишком доскональный подход.

Из за Report-a заметил, сразу число сделок и сумма стали отличаться, со своим вариантом Virtual-а. А соответствие уже почти точное. Исправляю все. Вот и это нашел и предложил исправить...

Другие не смотрят на милисекунды, тестер их  и не печатает. А ваш Report  - контролирует.

 
Forester #:

Из за Report-a заметил, сразу число сделок и сумма стали отличаться, со своим вариантом Virtual-а. А соответствие уже почти точное. Исправляю все. Вот и это нашел и предложил исправить...

Другие не смотрят на милисекунды, тестер их  и не печатает. А ваш Report  - контролирует.

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

Я об этом писал пару раз, меня тоже никто не услышал или не понял. Забейте.

 
Forester #:

Нашелся ещё баг со временем закрытия сделки по СЛ в миллисекундах (DEAL_TIME_MSC). Эксперт:

Торгует в коде на GBPUSD, а запускаем на другом инструменте EURGBP. ДЦ: Ал-ри, хедж, ECN счет.

Забыли обновить время закрытия сделки в мс 15:00.139, оно получается раньше времени открытия 15:00.488 .


Предполагаю, что время закрытия не обновляется, только в случае, если сделка открылась и закрылась по цене тика, который был раньше первого тика основного инструмента EURGBP. Т.к. все последующие тики (как видно по 2-му, имеют правильное время закрытия)

Немного изменил код, чтобы быстрее встретить ошибку - СЛ сразу ставлю = Bid. Чтобы как и в первом случае на Ал-ри, стоп сработал сразу при открытии сделки.

#include <Trade\Trade.mqh> //подключаем библиотеку для совершения торговых операций
CTrade Trade;              // объект для выполнения торговых операций
int stop=0;
void OnTick(){
  if(stop > 1){return;}//2 первые сделки
  MqlTick Tick;
  if (SymbolInfoTick(_Symbol, Tick) ){Print("--Main (",_Symbol,") tick time=",MscToString(Tick.time_msc));}
  if (SymbolInfoTick("GBPUSD", Tick)){
     Print("===Buy GBPUSD. Tick time=",MscToString(Tick.time_msc)," ask=",Tick.ask," bid=",Tick.bid);

     Trade.Buy (1,"GBPUSD",Tick.ask, Tick.bid, Tick.ask + 10 * _Point);
     //Trade.Sell(1,_Symbol,Tick.bid, 0, 0);
  }
  stop++;
}
void OnDeinit(const int  reason ){
   HistorySelect(0,TimeCurrent());
   for(int i=0;i<HistoryDealsTotal();i++){
      ulong deal_ticket=    HistoryDealGetTicket(i);
      long tr_time=HistoryDealGetInteger(deal_ticket,DEAL_TIME_MSC);

      Print("POSITION_ID:",HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID)," deal #",deal_ticket," at ",MscToString(tr_time)," Price:",DoubleToString(HistoryDealGetDouble(deal_ticket,DEAL_PRICE),5)," DEAL_TYPE: ",HistoryDealGetInteger(deal_ticket,DEAL_TYPE));
     }
}

string MscToString(long ms){return (string)(datetime)(ms/1000)+"."+IntegerToString(ms%1000, 3, '0');}


На Ал-ри все по прежнему.

На Demo MQ - уже по другому!

Печать результатов:

2023.05.29 00:02:40   --Main (EURGBP) tick time=2023.05.29 00:02:40.743
...
2023.05.29 00:02:40   ===Buy GBPUSD. Tick time=2023.05.29 00:02:12.789 ask=1.2354 bid=1.2333
...
2023.05.29 00:02:41   --Main (EURGBP) tick time=2023.05.29 00:02:41.108
2023.05.29 00:02:41   ===Buy GBPUSD. Tick time=2023.05.29 00:02:12.789 ask=1.2354 bid=1.2333 - новых тиков по GBPUSD не было
...
2023.05.29 00:03:16   stop loss triggered #2 buy 1 GBPUSD 1.23540 sl: 1.23330 tp: 1.23550 [#4 sell 1 GBPUSD at 1.23330]
2023.05.29 00:03:16   stop loss triggered #3 buy 1 GBPUSD 1.23540 sl: 1.23330 tp: 1.23550 [#5 sell 1 GBPUSD at 1.23330]


2023.05.29 23:54:58   POSITION_ID:0 deal #1 at 2023.05.29 00:00:00.000 Price:0.00000 DEAL_TYPE: 2
2023.05.29 23:54:58   POSITION_ID:2 deal #2 at 2023.05.29 00:02:40.743 Price:1.23540 DEAL_TYPE: 0
2023.05.29 23:54:58   POSITION_ID:3 deal #3 at 2023.05.29 00:02:41.108 Price:1.23540 DEAL_TYPE: 0
2023.05.29 23:54:58   POSITION_ID:2 deal #4 at 2023.05.29 00:03:16.321 Price:1.23320 DEAL_TYPE: 1
2023.05.29 23:54:58   POSITION_ID:3 deal #5 at 2023.05.29 00:03:16.321 Price:1.23320 DEAL_TYPE: 1

Ситуация точно такая же. К моменту тика основного инструмента ( EURGBP )  02:40.743 уже был тик по торгуемому инструменту ( GBPUSD) 02:12.789 . До второго тика основного инструмента - новых тиков по торгуемому GBPUSD не было (как и в 1м примере на Ал-ри).

По первому тику открылась позиция, но НЕ закрылась сразу же по СЛ == Bid = 1.23330 .    На Ал-ри она сразу же закрылась. В этом отличие!

Думаю, что закрывать по СЛ позицию, сразу же при открытии - правильно. Условие для срабатывания СЛ==Bid выполнилось же. А на демо MQ не закрылась.

Я за одинаковую логику срабатывания ТП/СЛ. Или эта логика меняется в зависимости от ДЦ? Неужели со стороны ДЦ можно влиять на логику тестера?

Итого имеем:
- на Ал-ри закрывает сразу же. что логически правильно. Но ошибка в том, что ставит время закрытия  < времени открытия)
- на демо MQ - не закрывает сразу же при открытии, хотя СЛ == Bid. Ошибка в том, что не закрыл сразу же.     Или такая логика все же правильная и её везде надо применить? Скажите. Тогда ошибка у Ал-ри, потому-что сразу закрыл.


Впрочем обратное правило (когда СЛ не срабатывает сразу же на тике открытия) я обнаружил в тестере (с ДЦ Ал-ри) для сделок, если они открыты когда тики по основному и торгуемому символу пришли в одну миллисекунду. А если в разные мс, то закрывает сразу. Если это неправильное поведение, то сообщите (если вы мотрудник MQ и хотите починить) - покажу моменты, когда такое случается. Тоже весьма запутанный момент... пару дней еще буду помнить, где искать.

 
Aleksandr Slavskii #:

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

Вы про проскальзывания наверное? А я про то, что время закрытия сделки установили раньше времени открытия. Такое в жизни невозможно.
Других разниц я не заметил - все четко. Кроме той, что в предыдущем посте описал.

Aleksandr Slavskii #:

Я об этом писал пару раз, меня тоже никто не услышал или не понял.

Стараюсь приводить код для повторения и подробно описываю, чтобы было понятнее.
 
Forester #:

Итого имеем:
- на Ал-ри закрывает сразу же. что логически правильно. Но ошибка в том, что ставит время закрытия  < времени открытия)
- на демо MQ - не закрывает сразу же при открытии, хотя СЛ == Bid. Ошибка в том, что не закрыл сразу же.     Или такая логика все же правильная и её везде надо применить? Скажите. Тогда ошибка у Ал-ри, потому-что сразу закрыл.


Впрочем обратное правило (когда СЛ не срабатывает сразу же на тике открытия) я обнаружил в тестере (с ДЦ Ал-ри) для сделок, если они открыты когда тики по основному и торгуемому символу пришли в одну миллисекунду. А если в разные мс, то закрывает сразу. Если это неправильное поведение, то сообщите (если вы мотрудник MQ и хотите починить) - покажу моменты, когда такое случается. Тоже весьма запутанный момент... пару дней еще буду помнить, где искать.


Сделал еще один тест для сравнения. 
ДЦ Ал-ри, Осн инструмент  != торгуемому. Было (с первого поста на эту тему):

2023.05.29 23:54:58   POSITION_ID:0 deal #1 at 2023.05.29 00:00:00.0 Price:0.00000 DEAL_TYPE: 2
2023.05.29 23:54:58   POSITION_ID:2 deal #2 at 2023.05.29 00:15:00.488 Price:1.23441 DEAL_TYPE: 0
2023.05.29 23:54:58   POSITION_ID:2 deal #3 at 2023.05.29 00:15:00.139 Price:1.23402 DEAL_TYPE: 1
2023.05.29 23:54:58   POSITION_ID:4 deal #4 at 2023.05.29 00:15:16.417 Price:1.23441 DEAL_TYPE: 0
2023.05.29 23:54:58   POSITION_ID:4 deal #5 at 2023.05.29 00:16:01.617 Price:1.23402 DEAL_TYPE: 1

ДЦ Ал-ри, основной инструмент = торгуемому.
Стало:

2023.05.29 00:15:00   --Main (GBPUSD) tick time=2023.05.29 00:15:00.139
2023.05.29 00:15:00   ===Buy GBPUSD. Tick time=2023.05.29 00:15:00.139 ask=1.23452 bid=1.23402

2023.05.29 00:15:00   --Main (GBPUSD) tick time=2023.05.29 00:15:00.189
2023.05.29 00:15:00   ===Buy GBPUSD. Tick time=2023.05.29 00:15:00.189 ask=1.23441 bid=1.23431

2023.05.29 23:54:46   POSITION_ID:0 deal #1 at 2023.05.29 00:00:00.000 Price:0.00000 DEAL_TYPE: 2
2023.05.29 23:54:46   POSITION_ID:2 deal #2 at 2023.05.29 00:15:00.139 Price:1.23452 DEAL_TYPE: 0
2023.05.29 23:54:46   POSITION_ID:3 deal #3 at 2023.05.29 00:15:00.189 Price:1.23441 DEAL_TYPE: 0
2023.05.29 23:54:46   POSITION_ID:2 deal #4 at 2023.05.29 00:16:01.617 Price:1.23402 DEAL_TYPE: 1
2023.05.29 23:54:46   POSITION_ID:3 deal #5 at 2023.05.29 00:16:01.617 Price:1.23402 DEAL_TYPE: 1

1-я сделка не закрылась сразу же, а после 2-й в 16:01.617 - время стопа . Т.е. логика НЕ закрывать сделку по СЛ при открытии принята основной. Но в 1-м случае она не выполнена. Давайте все сделаем по одной логике! Или 1 или 2. Но закрывать, если СЛ=bid - логичнее. Любой ДЦ с радостью примет такой подарок, если СЛ=bid для покупки или =ask для продажи. Да и биржа наверное исполнит.

1-й сделке время открытия установилось в то самое 15:00.139 (в 1-м случае его неправильно поставили как время закрытия).

Т.е. в 1-м примере при тесте по инструменту отличному от торгуемого, было использовано в качестве времени закрытия, не время срабатывания СЛ, а время последнего тика торгуемого инструмента 15:00.139, с которого копировалась цена для открытия сделки.
Загадка разгадана!!! - осталось исправить.

Возможное дополнительное условие, как раньше писал " если сделка открылась и закрылась по цене тика, который был раньше первого тика основного инструмента EURGBP ".



Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - Нашел еще один баг со временем закрытия сделки по СЛ в миллисекундах.
Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - Нашел еще один баг со временем закрытия сделки по СЛ в миллисекундах.
  • 2023.12.18
  • www.mql5.com
Одно из окон с результатами оптимизации не реагирует на кнопку закрытия. Там происходит корректировка ошибок по времени открытия закрытия. И эта сделка просто была исключена из отчета На что сразу обратил внимание
 

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

Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления

Forester, 2023.12.19 11:42

Забыли обновить время закрытия сделки в мс 15:00.139, оно получается раньше времени открытия 15:00.488 .

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

Сам учитываю подобное через SwapTime-механизм.

  virtual TICKET_TYPE OrderSend( const string &Symb, const int &Type, const double &dVolume, const double &Price,
                                 const int &SlipPage, const double &SL, const double &TP,
                                 const string &comment, const MAGIC_TYPE &magic, const datetime &dExpiration )
  {
    const TICKET_TYPE Res = this.GetOrders(Symb)
                              ? SWAPTIME(this.SelectOrders.OrderSend(Symb, Type, dVolume, Price, SlipPage, SL, TP,
                                                                     comment, magic, dExpiration))
                              : -1;

    if (Res != -1)
      this.CheckChanges();

    return(Res);
  }

Любые Order-операции на символе нужно делать с последним его тиком, но при этом время в нем выставлять равным текущему (внутреннее окружения).