Стратегии и роботы > TimeWarp: оценка временных лагов

Обсуждение, описание стратегий и роботов, идеи для стратегий
BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

TimeWarp: оценка временных лагов

Непрочитанное сообщение BugsDigger » 30 мар 2020, 10:47

Время от времени на форуме поднимается вопрос о задержке работы стратегии относительно реального времени окончания бара; при этом звучат разные мнения. Предлагаемый робот-советник ведет лог событий, что дает объективную картину.

Код: Выделить всё

function Initialize()
{
 StrategyName = "TimeWarp";
 AddInput("Input1", Inputs.Candle, 1, true, "");
 AddParameter("toMSK", 0); // разница с Москвой в часах (положительная для востока, отрицательная для запада)
 
 AddGlobalVariable("LogFile", Types.String, "");
 AddGlobalVariable("InputTF_sec", Types.Int, 1);
 AddGlobalVariable("Cnt", Types.Int, 0);
 
 LongLimit = 0;
 ShortLimit = 0;
}

function OnUpdate()
{
/*
Оценка временных лагов.
По событию OnUpdate в логе фиксируются:
 - номинальное время окончания бара,
 - текущее время компьютера,
// - время сервера // доступно только с использованием специальной техники работы с объектами терминала
 - разница между ними.
Время компьютера д.б. выставлено с максимальной точностью.
Обычно время в Win-системах синхронизуется автоматически (есть соответствующая настройка).
Точность текущего локального времени можно проверить, например, на
https://www.ntp-servers.net
*/

 if(Cnt==0)
 {
  Cnt=1;
 
  LogFile=@"D:\ADdebug\TimeWarp.txt";
//WriteLine(LogFile, "Bar                     Computer     Server       Comp-Bar      Srv-Bar       Comp-Srv");
  WriteLine(LogFile, "Bar                     Computer     Comp-Bar");
 
  int tf=Input1.Timeframe; 
  switch(tf)
  {
   case -1:    InputTF_sec=1; break;       // 1S  (1 секунда)
   case -2:    InputTF_sec=2; break;       // 2S  (2)
   case -3:    InputTF_sec=3; break;       // 3S  (3)
   case -4:    InputTF_sec=4; break;       // 4S  (4)
   case -5:    InputTF_sec=5; break;       // 5S  (5)
   case -6:    InputTF_sec=6; break;       // 6S  (6)
   case -10:   InputTF_sec=10; break;      // S10 (10)
   case -12:   InputTF_sec=12; break;      // S12 (12)
   case -15:   InputTF_sec=15; break;      // S15 (15)
   case -20:   InputTF_sec=20; break;      // S20 (20)
   case -30:   InputTF_sec=30; break;      // S30 (30)
   case 1:     InputTF_sec=60; break;      // M1  (60)
   case 2:     InputTF_sec=60*2; break;    // M2  (120)
   case 3:     InputTF_sec=60*3; break;    // M3  (180)
   case 4:     InputTF_sec=60*4; break;    // M4  (240)
   case 5:     InputTF_sec=60*5; break;    // M5  (300)
   case 6:     InputTF_sec=60*6; break;    // M6  (360)
   case 10:    InputTF_sec=60*10; break;   // M10 (600)
   case 12:    InputTF_sec=60*12; break;   // M12 (720)
   case 15:    InputTF_sec=60*15; break;   // M15 (900)
   case 20:    InputTF_sec=60*20; break;   // M20 (1200)
   case 30:    InputTF_sec=60*30; break;   // M30 (1800)
   case 60:    InputTF_sec=3600; break;    // H1  (3600)
   case 60*2:  InputTF_sec=3600*2; break;  // H2  (7200)
   case 60*3:  InputTF_sec=3600*3; break;  // H3  (10800)
   case 60*4:  InputTF_sec=3600*4; break;  // H4  (14400)
   case 60*6:  InputTF_sec=3600*6; break;  // H6  (21600)
   case 60*8:  InputTF_sec=3600*8; break;  // H8  (28800)
   case 60*12: InputTF_sec=3600*12; break; // H12 (43200) чисто по времени
// case 60*24: InputTF_sec=3600*24; break; // D1  (86400) чисто по времени, но дневные бары на самом деле считают с учетом длительности дневной сессии
   case 60*24: InputTF_sec=60*(60*8+45); break; // D1 (31500) день с учетом длительности дневной сессии; выходит меньше, чем для TF=12H
   default:    InputTF_sec=0; break;
  }
 }

 DateTime comp=DateTime.Now;               
// DateTime srv=Core.ConnectionManager.Instance.GetServerTime();
 DateTime bar=GetTime(0);     // это начало бара; OnUpdate вызывается в конце бара
 bar=bar.AddSeconds((double)InputTF_sec); // конец бара

 TimeSpan msk=new TimeSpan((int)toMSK, 0, 0);
 comp=comp-msk;
 
// string s=String.Format(@"{0:dd/MM/yyyy HH:mm:ss.fff} {1:HH:mm:ss.fff} {2:HH:mm:ss.fff} ", bar, comp, srv);
 string s=String.Format(@"{0:dd/MM/yyyy HH:mm:ss.fff} {1:HH:mm:ss.fff} ", bar, comp);
 
 TimeSpan dt=comp-bar;
 s+=(dt>=TimeSpan.Zero ? "+" : "-");
 s+=String.Format(@"{0:hh\:mm\:ss\.fff} ", dt);
 
/* 
 dt=srv-bar;
 s+=(dt>=TimeSpan.Zero ? "+" : "-");
 s+=String.Format(@"{0:hh\:mm\:ss\.fff} ", dt);

 dt=comp-srv;
 s+=(dt>=TimeSpan.Zero ? "+" : "-");
 s+=String.Format(@"{0:hh\:mm\:ss\.fff}", dt);
*/ 
 WriteLine(LogFile, s);
}


Замечу, что в измеряемую задержку, кроме задержки на сервере брокера и транспорта до терминала, должны, очевидно, входить и задержки при расчете индикаторов, т.к. все активные индикаторы д.б. , насколько я понимаю, посчитаны до вызова OnUpdate во всех активных роботах.

Результат (часы компа, как сообщает сайт ntp-servers.net, спешат на 0,13 сек):

Bar Computer Comp-Bar
27.03.2020 18:39:00.000 09:59:01.968 +15:20:01.968 - до начала сессии
27.03.2020 18:40:00.000 10:00:00.540 +15:20:00.540 - старт сессии

30.03.2020 10:01:00.000 10:01:00.776 +00:00:00.776 - первая минутная свеча
30.03.2020 10:02:00.000 10:02:00.966 +00:00:00.966
30.03.2020 10:03:00.000 10:03:00.588 +00:00:00.588
30.03.2020 10:04:00.000 10:04:01.281 +00:00:01.281
30.03.2020 10:05:00.000 10:05:00.686 +00:00:00.686
30.03.2020 10:06:00.000 10:06:00.350 +00:00:00.350
30.03.2020 10:07:00.000 10:07:01.836 +00:00:01.836
30.03.2020 10:08:00.000 10:08:01.002 +00:00:01.002
30.03.2020 10:09:00.000 10:09:00.633 +00:00:00.633
30.03.2020 10:10:00.000 10:10:01.332 +00:00:01.332
30.03.2020 10:11:00.000 10:11:01.697 +00:00:01.697
30.03.2020 10:12:00.000 10:12:00.526 +00:00:00.526
30.03.2020 10:13:00.000 10:13:00.368 +00:00:00.368
30.03.2020 10:14:00.000 10:14:01.058 +00:00:01.058
30.03.2020 10:15:00.000 10:15:00.164 +00:00:00.164
30.03.2020 10:16:00.000 10:16:01.352 +00:00:01.352
30.03.2020 10:17:00.000 10:17:00.896 +00:00:00.896
30.03.2020 10:18:00.000 10:18:01.266 +00:00:01.266
30.03.2020 10:19:00.000 10:19:00.920 +00:00:00.920
30.03.2020 10:20:00.000 10:20:02.093 +00:00:02.093
30.03.2020 10:21:00.000 10:21:00.839 +00:00:00.839
30.03.2020 10:22:00.000 10:22:01.352 +00:00:01.352
30.03.2020 10:23:00.000 10:23:01.124 +00:00:01.124
30.03.2020 10:24:00.000 10:24:01.885 +00:00:01.885
30.03.2020 10:25:00.000 10:25:01.348 +00:00:01.348
30.03.2020 10:26:00.000 10:26:01.019 +00:00:01.019
30.03.2020 10:27:00.000 10:27:00.710 +00:00:00.710

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

Вернуться в «Стратегии и роботы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость