Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 2008

 
Evgeny Dyuka:
спасибо, у меня это всегда "фичами" было, хотя слово кривоватое

особенно когда не знаком с транслитерацией

 
Maxim Kuznetsov:

бар не откроется пока по инструменту не придёт тик. Тика может очень долго не быть ;-)

А вот эту проблему код, увы в полной мере не решает. Есть идеи, как её можно решить, что б и при режиме моделирования OHLC и по "Каждый тик на основе реальных тиков" можно было получить одинаковые данные с символа, на котором не расположен советник? В общем то, есть ли идея, как при OHLC решить проблему синхронизации без задержки, т.е. если на ином символе нет пока бара, то пользуем прошлые данные бара? Если по всем тикам проводить проверку, то там можно (хотя не пробовал) получить данные о первом тике в баре и по нему быть уверенным в синхронизации, т.е. знать был ли бар при открытии нового бара на текущем чарте или нет.

 
Aleksey Vyazmikin:

А вот эту проблему код, увы в полной мере не решает. Есть идеи, как её можно решить, что б и при режиме моделирования OHLC и по "Каждый тик на основе реальных тиков" можно было получить одинаковые данные с символа, на котором не расположен советник? В общем то, есть ли идея, как при OHLC решить проблему синхронизации без задержки, т.е. если на ином символе нет пока бара, то пользуем прошлые данные бара? Если по всем тикам проводить проверку, то там можно (хотя не пробовал) получить данные о первом тике в баре и по нему быть уверенным в синхронизации, т.е. знать был ли бар при открытии нового бара на текущем чарте или нет.

Могут даже несколько минутных баров пропустить. Формируйте бар по цене Close предыдущего. Для анализа совмесного поведения  нескольких инструментов подойдет. Для одной валюты наверное это не важно.
 
elibrarius:
Могут даже несколько минутных баров пропустить. Формируйте бар по цене Close предыдущего. Для анализа совмесного поведения  нескольких инструментов подойдет. Для одной валюты наверное это не важно.

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

 

Оставлю тут, для тех кто не знал, что в режиме оптимизации OHLC несинхронизированы тайм серии инструментов - это критично для МО


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

Новая версия платформы MetaTrader 5 build 2615: Фундаментальный анализ и комплексный критерий в тестере стратегий

Aleksey Vyazmikin, 2020.09.26 13:26


Билд 2622, минутный тайм фрейм, инструмент Si-12.20 брокер "Открытие".

Принтуем при открытии нового бара в режиме "Каждый тик на основе реальных тиков" и "OHLC на M1" :

Print("Time",TimeToString(iTime(Symbol(),PERIOD_CURRENT,0),TIME_DATE|TIME_MINUTES), " Time_TOM=",TimeToString(iTime("USDRUB_TOM",PERIOD_CURRENT,0),TIME_DATE|TIME_MINUTES));

Выше результаты сведены в таблицу, и у меня по ним есть вопросы:

1. Я ожидал, что задержка может быть в случае, если на текущем инструменте уже появился новый бар, а на инструменте с которого запрашиваем информацию ещё нет - такая ситуация действительно бывает, но только на открытии нового дня - выделено зеленым.

2. Без выделения ситуация, такая же, как и из первого пункта, но если в потиковом тестировании это ожидаемо, то почему такая ситуация происходит и в режиме  "OHLC на M1" - откуда там рассинхронизация - неясно.

3. Желтым цветом выделена ситуация, когда два тика пришли единовременно или же по запрашиваемому инструменту тик пришел быстрей, чем на инструменте с которого происходит вызов информации, но каким образом в режиме  "OHLC на M1" нет тика на этом баре, если он даже уже пришёл в потиковом режиме.

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


Ответ:

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

Новая версия платформы MetaTrader 5 build 2615: Фундаментальный анализ и комплексный критерий в тестере стратегий

Renat Fatkhullin, 2020.09.26 13:33

Ваш вопрос исключительно про OHLC режим тестирования, так как в потиковом все верно?

Тогда ответ простой - вы никаких гарантий точной синхронизации чужих символов при OHLC тестировании не можете иметь. OHLC исключительно для грязного тестирования.


 

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

//+------------------------------------------------------------------+
//|Получение информации о ценах OHLC текущего бара                   |
//+------------------------------------------------------------------+
void Get_OHLC(string symbol,ENUM_TIMEFRAMES TF, double &arr_OHLC[])
{
   ArrayResize(arr_OHLC,4);
   arr_OHLC[0]=iOpen(symbol,TF,0);
   arr_OHLC[3]=iOpen(symbol,PERIOD_M1,0);
   datetime s=iTime(symbol,TF,0);
   datetime f=iTime(symbol,PERIOD_M1,1);
   datetime Time_1=iTime(Symbol(),PERIOD_M1,1);

   if(TF!=PERIOD_M1)
   {
      double arr_High[];
      double arr_Low[];
      int copied=0;
      if(Symbol()!=symbol)//Если берем данные с другого символа, то проверяем синхронизацию - нужно, так как при открытии новой свечи на текущем символе данных можнт небыть на опрашиваемом символе
      {
         if(Time_1>f)//На текущем символе открылись раньше появления нового бара на запрашиваемом
         {
            f=iTime(symbol,PERIOD_M1,0);
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,0);
         }
         else
         {
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,1);
         }
         if(s>f)//Если текущий бар ТФ открылся раньше, чем минутный бар до которого включительно берем информацию OHLC
         {
            s=iTime(symbol,TF,1);
            arr_OHLC[0]=iOpen(symbol,TF,1);
         }
         copied=CopyHigh(symbol,PERIOD_M1,s,f,arr_High);
         if (copied>0)
         {
            arr_OHLC[1]=arr_High[ArrayMaximum(arr_High,0,WHOLE_ARRAY)];
         }
         else
         {
            Print("Ошибка копирования в массив arr_High");
         }
         copied=CopyLow(symbol,PERIOD_M1,s,f,arr_Low);
         if (copied>0)
         {
            arr_OHLC[2]=arr_Low[ArrayMinimum(arr_Low,0,WHOLE_ARRAY)];
         }
         else
         {
            Print("Ошибка копирования в массив arr_Low");
         }

      }
      else
      {
         if(s<f)
         {
            copied=CopyHigh(symbol,PERIOD_M1,s,f,arr_High);
            if (copied>0)
            {
               arr_OHLC[1]=arr_High[ArrayMaximum(arr_High,0,WHOLE_ARRAY)];
            }
            else
            {
               Print("Ошибка копирования в массив arr_High");
            }
            copied=CopyLow(symbol,PERIOD_M1,s,f,arr_Low);
            if (copied>0)
            {
               arr_OHLC[2]=arr_Low[ArrayMinimum(arr_Low,0,WHOLE_ARRAY)];
            }
            else
            {
               Print("Ошибка копирования в массив arr_Low");
            }
         }
         else
         {
            if(s==f)//Если ТФ открылся на прошлом минутном баре
            {
               arr_OHLC[1]=iHigh(symbol,PERIOD_M1,1);
               arr_OHLC[2]=iLow(symbol,PERIOD_M1,1);
            }
            if(s>f)//Если ТФ открылся на текущем минутном баре
            {
               arr_OHLC[1]=iOpen(symbol,PERIOD_M1,0);
               arr_OHLC[2]=iOpen(symbol,PERIOD_M1,0);
            }
         }
      }
   }
   else
   {
      arr_OHLC[0]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[1]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[2]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[3]=iOpen(symbol,PERIOD_M1,0);
      if(Symbol()!=symbol)
      {
         if(Time_1>iTime(symbol,PERIOD_M1,1))//Если не появился новый бар
         {
            arr_OHLC[0]=iOpen(symbol,PERIOD_M1,0);
            arr_OHLC[1]=iHigh(symbol,PERIOD_M1,0);
            arr_OHLC[2]=iLow(symbol,PERIOD_M1,0);
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,0);
         }
         else//Если появился новый бар
         {
            arr_OHLC[0]=iOpen(symbol,PERIOD_M1,1);
            arr_OHLC[1]=iHigh(symbol,PERIOD_M1,1);
            arr_OHLC[2]=iLow(symbol,PERIOD_M1,1);
            arr_OHLC[3]=iClose(symbol,PERIOD_M1,1);
         }
      }
   }
}
 
Для нормального робастного алго небольшой рассинхрон ни на что не влияет. Надуманные проблемы )
 
Maxim Dmitrievsky:
Для нормального робастного алго небольшой рассинхрон ни на что не влияет. Надуманные проблемы )

Где ж этих "нормальных" то взять!? А влияет или нет - тут рандом, если при квантовании попали на границу между квантилями, то при обучении может оказаться, что как раз разница на 1 квантиль приведет к пропуску входа на реале. В общем мне не нравится, когда я немогу воспроизвести в тестере проторговку закрытого дня, поэтому выявил причину и начал её устронять.

 
Aleksey Vyazmikin:

Где ж этих "нормальных" то взять!? А влияет или нет - тут рандом, если при квантовании попали на границу между квантилями, то при обучении может оказаться, что как раз разница на 1 квантиль приведет к пропуску входа на реале. В общем мне не нравится, когда я немогу воспроизвести в тестере проторговку закрытого дня, поэтому выявил причину и начал её устронять.

Если брать гипотетическую нормальную ТС ) глупо было бы полагать, что +- лаг что-то бы изменил 
 
Maxim Dmitrievsky:
Если брать гипотетическую нормальную ТС ) глупо было бы полагать, что +- лаг что-то бы изменил 

Ну как глупо, допустим - лаг (полученное неверное значение) означает пересечение ценой важного уровня - и статистически - есть пересечение, значит скоро разворот и входить по тренду нет уже смысла на этом часовом баре, а по факту пересечения не было, а только касания (бар то не закрыт), значит есть на открытии бара ещё потенциал дальнейшего движения.

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