Код: Выделить всё
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 секунд при не особо большой активности на бирже.
Большого количества запущенных индикаторов/роботов на данный момент у меня нет.