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

 
Forester #:

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

Разные типы исполнения стоят.

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

Лимитники/тейки по текущей цене в Терминале (не в Тестере)

fxsaber, 2020.05.19 11:17

MT5


Другая платформа


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


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

Лимитники/тейки по текущей цене в Терминале (не в Тестере)

fxsaber, 2020.05.19 11:46

Вот так выглядит исполнение лимитника по текущей цене, когда надо подождать несколько дольше.


Когда исполнился.


Лог.

2020.05.19 12:21:34.917 Trades  '84249': buy limit 0.01 USDHKD at 7.75057
2020.05.19 12:21:34.958 Trades  '84249': accepted buy limit 0.01 USDHKD at 7.75057
2020.05.19 12:21:34.959 Trades  '84249': order #618119 buy limit 0.01 / 0.01 USDHKD at market done in 42.100 ms
2020.05.19 12:23:11.473 Trades  '84249': deal #421616 buy 0.01 USDHKD at 7.75057 done (based on order #618119)


Исполнение длилось почти 100 секунд. На другой платформе - мгновенно.

 
В коде увидел такую конструкцию.
m_logticks[i].bid_d=(m_ticks[i].bid>0)?MathLog(m_ticks[i].bid):MathLog(1e0);
Компилятор заменяет ее на число (ноль в данном случае), или каждый раз делает вызов логарифма?
 
fxsaber #:
Разные типы исполнения стоят.

Типы исполнения:


Теперь понятно, почему поведение у разных ДЦ разное.

Ал-ри с рыночным исполнением исполнил СЛ сразу, ему не важна точность цены, но она удачно оказалась точной.

А то что СЛ при Instant исполнении (на MQ Demo) не срабатывает сразу же - очень странно. Ведь именно такой Bid=СЛ и был несколько секунд до наступления следующего тика. Логичнее сразу же и исполнить, ведь на Instant главное - это точное совпадение цены. И это условие соблюдено. И как вы показали на видео - на других платформах он исполняется если цена ==СЛ и не ждет следущего тика (если я правильно понял).

Уважаемые разработчики
, объясните пожалуйста, зачем тестер ждет следующий тик, если условие срабатывания ордера уже выполнилось при открытии позиции с указанными ТП/СЛ?

Надеюсь хотя бы время закрытия < времени открытия починят.На MQ Demo - Instant .исполнение, так что придется тестировать на др. ДЦ, где оно рыночное. Лучше всего на Ал-ри, т.к. сразу известен инструмент и дата, на которой ошибка точно появится. На др. серверах аозможно придется перебирать даты и инструменты.

 
Forester #:
b4098 починили - спасибо!


Forester #:

Тест за 1 день по EURCHF начисляет свопы в конце дня для принудительно закрытых сделок в конце теста (end of test). Почему? Ведь в тестах по EURUSD и USDCHF не начисляет. Думаю надо или все символам начислять или всем не начислять, т.е. д.б. одинаковое поведение.

Проверил пару замеченных инструментов на нескольких датах. Похоже, что свопы тоже починили. Спасибо! (Жаль, что не пишите о сделанной работе, а приходится с новой бетой лазить по истории форума и проверять)

Радость о исправлении оказалась не долгой... Видимо не исправляли или исправили, но не полностью (т.к. на Ал-ри свопы в конце теста перестали замечаться):
ДЦ MQ Demo: b 4105

код - купили и держим до конца теста

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

Тест


 
Forester #:

Радость о исправлении оказалась не долгой... Видимо не исправляли или исправили, но не полностью (т.к. на Ал-ри свопы в конце теста перестали замечаться):
ДЦ MQ Demo: b 4105

код - купили и держим до конца теста

Тест


Поправка: тестировать надо с 2 по 3 июня 2023. Т.е. своп будет начислен за 1 день, без перехода на следующие сутки.

Будет так


Тест
из предыдущего поста с 1 по 3 июня показывает 1 своп за переход с 1 на 2 и +1 своп за конец теста, без перехода на новые сутки. Т.е. 1 лишний своп.

 

Последняя релизная MT5. Есть такой скрипт, в цикле создаёт и удаляет кастомный символ.

void SaveSymbol(const string &SymbName,MqlTick &NewTicks[],int NewTicksCount)
{
  bool fDummy;
  string CopySymbName=SymbName+"-Custom";
  if(SymbolExist(CopySymbName,fDummy))
  {
    SymbolSelect(CopySymbName,false);
    if(!CustomSymbolDelete(CopySymbName))
      Alert("Failed to delete symbol "+CopySymbName);
  }

  CustomSymbolCreate(CopySymbName,NULL,SymbName);
  int TicksAdded=CustomTicksReplace(CopySymbName,0,(long)D'01.01.2099'*1000,NewTicks);
  Print(CopySymbName+" - added "+(string)TicksAdded+" ticks");
}

void CopySymbol()
{
  MqlTick NewTicks[];
  ArrayResize(NewTicks,100000);
  for(int i=0;i!=ArraySize(NewTicks);++i)
  {
    NewTicks[i].bid=1;
    NewTicks[i].ask=1.1;
    NewTicks[i].time=i;
    NewTicks[i].time_msc=i*1000;
  }
  SaveSymbol("AUDCAD",NewTicks,ArraySize(NewTicks));
}

void OnStart()
{
  for(;;)
    CopySymbol();
}

При запуске этого скрипта на более чем 1 графике одновременно весь терминал зависает и перестаёт отвечать. Похоже, дело в синхронизации, на 1 графике работает нормально.

 

Последняя релизная МТ5. Есть такой советник:

void SaveSymbol(int Iter,const string &SymbName,MqlTick &NewTicks[],int NewTicksCount)
{
  string CopySymbName=SymbName+"-Custom"+(string)Iter;
  CustomSymbolCreate(CopySymbName,"",SymbName);
  int TicksAdded=CustomTicksReplace(CopySymbName,0,(long)D'01.01.2099'*1000,NewTicks);
  Print(CopySymbName+" - added "+(string)TicksAdded+" ticks");
}

void OnInit()
{
  Print("Going for symbols deletion");
  for(int i=0;i!=100;++i)
    CustomSymbolDelete("AUDCAD-Custom"+(string)i);
  Print("All symbols deleted");

  for(int i=0;i!=100;++i)
  {
    MqlTick NewTicks[];
    ArrayResize(NewTicks,100000);
    for(int j=0;j!=ArraySize(NewTicks);++j)
    {
      NewTicks[j].bid=1;
      NewTicks[j].ask=1.1;
      NewTicks[j].time=j;
      NewTicks[j].time_msc=j*1000;
    }
    SaveSymbol(i,"AUDCAD",NewTicks,ArraySize(NewTicks));
  }
}

Он на старте удаляет сразу все 100 кастомных символов, а потом создаёт их, остальное время просто висит и ничего не делает.

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

 
Пользовательские символы. Ошибки, баги, вопросы, предложения. - Попробуйте удалить всю баровую и тиковую историю.
Пользовательские символы. Ошибки, баги, вопросы, предложения. - Попробуйте удалить всю баровую и тиковую историю.
  • 2019.02.23
  • www.mql5.com
Нужно удалить последнюю неделю котировок кастомного символа. Требуется удалить последние сутки истории кастомного символа и выставить в Обзор рынка последний тик после удаления. либо чтобы TicksDelete TicksReplace заменял тик в Обзоре рынка на последний в истории
 
Forester #:


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

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

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

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

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

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

Подтверждение проблемы с первым тиком теста. На этот раз на ДЦ MQ Demo.  b4105
Эксперт.

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

     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');}
int TimeDayOfWeek( datetime time ){return((int)((time / 86400 + THURSDAY) % 7));}//current DayOfWeek. 86400 sec in day.  7 days in week.  THURSDAY on 1 Jan 1971

Тест  с 30 по 31 мая

Дает такие сделки. Первая закрылась с временем раньше чем открылась, на скриншоте видно, что на той же минуте, ниже покажу в миллисекундах.

Посмотрим, как тестер поведет себя если,эта сделка будет не первой в тесте. Запустим на 1 день раньше. Тест с 29 по 31 мая. 2 первые сделки от 29 мая на них не смотрим и 2 первые сделки от 30 мая - первая из них закрылась, но уже не на той же минуте, на которой открылась, а на 4-й (и это правильно)

Смотрим подробности и сравниваем:

Тест 30-31 мая
Тест 29-31 мая





2023.05.30 00:01:28   --Main (EURGBP) tick time=2023.05.30 00:01:28.550 ask=0.86708 bid=0.86648
2023.05.30 00:01:28   ===Buy GBPUSD. Tick time=2023.05.30 00:01:28.497 ask=1.23629 bid=1.23435
2023.05.30 00:01:28   instant buy 1 GBPUSD at 1.23629 sl: 1.23435 tp: 1.23639 (1.23435 / 1.23629)

2023.05.30 00:01:28   stop loss triggered #2 buy 1 GBPUSD 1.23629 sl: 1.23435 tp: 1.23639 [#3 sell 1 GBPUSD at 1.23435]

2023.05.30 00:01:28   --Main (EURGBP) tick time=2023.05.30 00:01:28.550 ask=0.86838 bid=0.86631
2023.05.30 00:01:28   ===Buy GBPUSD. Tick time=2023.05.30 00:01:28.497 ask=1.23629 bid=1.23435

2023.05.30 00:04:01   stop loss triggered #4 buy 1 GBPUSD 1.23629 sl: 1.23435 tp: 1.23639 [#5 sell 1 GBPUSD at 1.23435]




2023.05.30 23:54:56   POSITION_ID:0 deal #1 at 2023.05.30 00:00:00.000 Price:0.00000 DEAL_TYPE: 2
2023.05.30 23:54:56   POSITION_ID:2 deal #2 at 2023.05.30 00:01:28.550 Price:1.23629 DEAL_TYPE: 0
2023.05.30 23:54:56   POSITION_ID:2 deal #3 at 2023.05.30 00:01:28.497 Price:1.23435 DEAL_TYPE: 1 !!!!!
2023.05.30 23:54:56   POSITION_ID:4 deal #4 at 2023.05.30 00:01:28.550 Price:1.23629 DEAL_TYPE: 0
2023.05.30 23:54:56   POSITION_ID:4 deal #5 at 2023.05.30 00:04:01.704 Price:1.23430 DEAL_TYPE: 1
2023.05.29 00:02:40   --Main (EURGBP) tick time=2023.05.29 00:02:40.743 ask=0.86952 bid=0.86763 - сделки другого дня - не интересны
2023.05.29 00:02:40   ===Buy GBPUSD. Tick time=2023.05.29 00:02:12.789 ask=1.23540 bid=1.23330
2023.05.29 00:02:41   --Main (EURGBP) tick time=2023.05.29 00:02:41.108 ask=0.86952 bid=0.86769
2023.05.29 00:02:41   ===Buy GBPUSD. Tick time=2023.05.29 00:02:12.789 ask=1.23540 bid=1.23330


2023.05.30 00:01:28   --Main (EURGBP) tick time=2023.05.30 00:01:28.550 ask=0.86708 bid=0.86648
2023.05.30 00:01:28   ===Buy GBPUSD. Tick time=2023.05.30 00:01:28.497 ask=1.23629 bid=1.23435
2023.05.30 00:01:28   instant buy 1 GBPUSD at 1.23629 sl: 1.23435 tp: 1.23639 (1.23435 / 1.23629)

2023.05.30 00:01:28   --Main (EURGBP) tick time=2023.05.30 00:01:28.550 ask=0.86838 bid=0.86631
2023.05.30 00:01:28   ===Buy GBPUSD. Tick time=2023.05.30 00:01:28.497 ask=1.23629 bid=1.23435

2023.05.30 00:04:01   stop loss triggered #6 buy 1 GBPUSD 1.23629 sl: 1.23435 tp: 1.23639 [#8 sell 1 GBPUSD at 1.23435]
2023.05.30 00:04:01   stop loss triggered #7 buy 1 GBPUSD 1.23629 sl: 1.23435 tp: 1.23639 [#9 sell 1 GBPUSD at 1.23435]

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

2023.05.30 23:54:56   POSITION_ID:6 deal #6 at 2023.05.30 00:01:28.550 Price:1.23629 DEAL_TYPE: 0
2023.05.30 23:54:56   POSITION_ID:7 deal #7 at 2023.05.30 00:01:28.550 Price:1.23629 DEAL_TYPE: 0
2023.05.30 23:54:56   POSITION_ID:6 deal #8 at 2023.05.30 00:04:01.704 Price:1.23430 DEAL_TYPE: 1
2023.05.30 23:54:56   POSITION_ID:7 deal #9 at 2023.05.30 00:04:01.704 Price:1.23430 DEAL_TYPE: 1

Как видно в тесте 29-30 мая есть сделки зарывающиеся  ( 01:28.497 ) до времени открытия ( 01:28.550 ) - это время тика торгуемого инструмента, до времени открытия, с него взяты цены для торговли, как текущие. Цена срабатывания СЛ ( 1.23435 ) взята по цене на момент до открытия сделки в 01:28.497.
Если этот момент времени сделать не первым в тесте, запустив его с 29 мая, то эта проблемная сделка закрылась правильно, по времени после открытия и с ценой на момент правильного закрытия, проскальзывание получилось другое 1.23430 -правильное, по тику после открытия сделки.

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

Многие первые сделки имеют эту проблему, при стартах в разные дни.
 
Вторая проблема с первой сделкой.
Эксперт тот же. Стартовые даты 5-6 июня, чтобы посмотреть 1-ю сделку и 2-6 июня, чтобы посмотреть на нее же, если она не 1-я в тесте.
5-6 июня   2-6 июня  





--Main (EURGBP) tick time=2023.06.05 00:02:01.377 ask=0.86051 bid=0.85913
2023.06.05 00:02:01   ===Buy GBPUSD. Tick time=2023.06.05 00:03:30.000 ask=1.24736 bid=1.24422
2023.06.05 00:02:01   instant buy 1 GBPUSD at 1.24736 sl: 1.24422 tp: 1.24746 (1.24422 / 1.24736)
2023.06.05 00:03:09   --Main (EURGBP) tick time=2023.06.05 00:03:09.133 ask=0.86051 bid=0.85913
2023.06.05 00:03:09   ===Buy GBPUSD. Tick time=2023.06.05 00:03:30.000 ask=1.24736 bid=1.24422
2023.06.05 00:03:09   instant buy 1 GBPUSD at 1.24736 sl: 1.24422 tp: 1.24746 (1.24422 / 1.24736)
2023.06.05 00:03:44   stop loss triggered #2 buy 1 GBPUSD 1.24736 sl: 1.24422 tp: 1.24746 [#4 sell 1 GBPUSD at 1.24422]
2023.06.05 00:03:44   stop loss triggered #3 buy 1 GBPUSD 1.24736 sl: 1.24422 tp: 1.24746 [#5 sell 1 GBPUSD at 1.24422]





2023.06.05 23:54:58   POSITION_ID:0 deal #1 at 2023.06.05 00:00:00.000 Price:0.00000 DEAL_TYPE: 2
2023.06.05 23:54:58   POSITION_ID:2 deal #2 at 2023.06.05 00:02:01.377 Price:1.24736 DEAL_TYPE: 0
2023.06.05 23:54:58   POSITION_ID:3 deal #3 at 2023.06.05 00:03:09.133 Price:1.24736 DEAL_TYPE: 0
2023.06.05 23:54:58   POSITION_ID:2 deal #4 at 2023.06.05 00:03:44.524 Price:1.24422 DEAL_TYPE: 1
2023.06.05 23:54:58   POSITION_ID:3 deal #5 at 2023.06.05 00:03:44.524 Price:1.24422 DEAL_TYPE: 1

2023.06.02 00:01:23   --Main (EURGBP) tick time=2023.06.02 00:01:23.023 ask=0.85935 bid=0.85900
2023.06.02 00:01:23   ===Buy GBPUSD. Tick time=2023.06.02 00:01:22.976 ask=1.25390 bid=1.25221
2023.06.02 00:01:23   --Main (EURGBP) tick time=2023.06.02 00:01:23.023 ask=0.85953 bid=0.85843
2023.06.02 00:01:23   ===Buy GBPUSD. Tick time=2023.06.02 00:01:22.976 ask=1.25390 bid=1.25221


2023.06.05 00:02:01   --Main (EURGBP) tick time=2023.06.05 00:02:01.377 ask=0.86051 bid=0.85913
2023.06.05 00:02:01   ===Buy GBPUSD. Tick time=2023.06.02 23:54:59.168 ask=1.24508 bid=1.24500
2023.06.05 00:02:01   instant buy 1 GBPUSD at 1.24508 sl: 1.24500 tp: 1.24518 (1.24500 / 1.24508)
2023.06.05 00:03:09   --Main (EURGBP) tick time=2023.06.05 00:03:09.133 ask=0.86051 bid=0.85913
2023.06.05 00:03:09   ===Buy GBPUSD. Tick time=2023.06.02 23:54:59.168 ask=1.24508 bid=1.24500
2023.06.05 00:03:44   stop loss triggered #6 buy 1 GBPUSD 1.24508 sl: 1.24500 tp: 1.24518 [#8 sell 1 GBPUSD at 1.24500]
2023.06.05 00:03:44   stop loss triggered #7 buy 1 GBPUSD 1.24508 sl: 1.24500 tp: 1.24518 [#9 sell 1 GBPUSD at 1.24500]

2023.06.05 23:54:58   POSITION_ID:0 deal #1 at 2023.06.02 00:00:00.000 Price:0.00000 DEAL_TYPE: 2
2023.06.05 23:54:58   POSITION_ID:2 deal #2 at 2023.06.02 00:01:23.023 Price:1.25390 DEAL_TYPE: 0
2023.06.05 23:54:58   POSITION_ID:3 deal #3 at 2023.06.02 00:01:23.023 Price:1.25390 DEAL_TYPE: 0
2023.06.05 23:54:58   POSITION_ID:2 deal #4 at 2023.06.02 00:04:10.071 Price:1.25221 DEAL_TYPE: 1
2023.06.05 23:54:58   POSITION_ID:3 deal #5 at 2023.06.02 00:04:10.071 Price:1.25221 DEAL_TYPE: 1


2023.06.05 23:54:58   POSITION_ID:6 deal #6 at 2023.06.05 00:02:01.377 Price:1.24508 DEAL_TYPE: 0
2023.06.05 23:54:58   POSITION_ID:7 deal #7 at 2023.06.05 00:03:09.133 Price:1.24508 DEAL_TYPE: 0
2023.06.05 23:54:58   POSITION_ID:6 deal #8 at 2023.06.05 00:03:44.524 Price:1.24422 DEAL_TYPE: 1
2023.06.05 23:54:58   POSITION_ID:7 deal #9 at 2023.06.05 00:03:44.524 Price:1.24422 DEAL_TYPE: 1
Тут к времени закрытия претензий нет. Но есть к цене открытия. Первая сделка в тесте открылась в  02:01.377 ,  ей взята неправильная цена  1.24736 на момент времени  03:30.000, который взят из будущего - подглядывание вперед получается. Второй тик открылся в 03:09.133 т.е. тоже до 03:30.000 с которого взята будущая  цена. Дальнейшие тики уже идут правильно.

На втором тесте, когда эти сделки не первые в тесте, цена  для них взята с предыдущего дня в 02 23:54:59.168 т.е. по цене до времени открытия, это правильно. Закрылись тоже правильно. Получается, что тика в 03:30.000 не было, тестер ее сам придумал.
Смотрим. Нет тика в это время.



Как следствие - финансовый результат от этих сделок отличается из за разной цены открытия.

Будьте добры исправить ситуацию и сделать правильное тестирование по реальным тикам, а не сгенерированным. В данной ситуации при старте теста для первого тика надо не генерировать тик, а найти предыдущий в истории, который  был 02 23:54:59.168.