![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сереж!
Мне не нравится ни моя версия (синзронизация по перврй сделке), ни твоя версия,
потому что она "круглосуточно" долбит винды и практически постоянно подстраивает время,
тогда как время нужно подстроить только перед началом и в конце сессий.
Нужно подумать, как сделать гибрид из наших версий.
Посмотри, и скажи что думаешь
//| Time_sync_forts.mq5 |
//| Copyright 2017 Sergey Chalyshev & prostotrader |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 Sergey Chalyshev & prostotrader"
#property link "https://www.mql5.com"
#property version "1.09"
//---
struct _SYSTEMTIME
{
short wYear;
short wMonth;
short wDayOfWeek;
short wDay;
short wHour;
short wMinute;
short wSecond;
short wMilliseconds;
};
_SYSTEMTIME loc_time;
#import "kernel32.dll"
//void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//
input ENUM_DAY_OF_WEEK FirstDay = SATURDAY; //Первый выходной
input ENUM_DAY_OF_WEEK SecondDay = SUNDAY; //Второй выходной
//
MqlTick tick;
MqlDateTime sv_time, tts_time;
int st_st_mon = 35100; //09-45
int end_st_mon = 36000; //10-00
int st_end_mon = 50280; //13-58
int end_end_mon = 50400; //14-00
int st_st_day = 50460; //14-01
int end_st_day = 50700; //14-05
int st_end_day = 67380; //18-43
int end_end_day = 67500; //18-45
int st_st_evn = 67560; //18-46
int end_st_evn = 68400; //19-00
int st_end_evn = 85680; //23-48
int end_end_evn = 85800; //23-50
//---
bool is_sync;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
is_sync = true;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert Convert To Time function |
//+------------------------------------------------------------------+
bool ConvertToTime(const ulong n_value,_SYSTEMTIME &a_time)
{
MqlDateTime cur_time={0};
TimeToStruct(datetime(n_value/1000),cur_time);
if(cur_time.year>0)
{
a_time.wDay=short(cur_time.day);
a_time.wDayOfWeek=short(cur_time.day_of_week);
a_time.wHour=short(cur_time.hour);
a_time.wMinute= short(cur_time.min);
a_time.wMonth = short(cur_time.mon);
a_time.wSecond= short(cur_time.sec);
a_time.wYear=short(cur_time.year);
a_time.wMilliseconds=short(n_value%1000);
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
//| Expert On Tick function |
//+------------------------------------------------------------------+
void OnTick()
{
tts_time.year = 0;
TimeTradeServer(tts_time);
if(tts_time.year > 0)
{
if((tts_time.day_of_week == int(FirstDay)) ||
(tts_time.day_of_week == int(SecondDay))) return;
int cur_time = tts_time.hour * 3600 + tts_time.min * 60 + tts_time.sec;
if(((cur_time >= st_st_mon) && (cur_time < end_st_mon)) ||
((cur_time >= st_end_mon) && (cur_time < end_end_mon)) ||
((cur_time >= st_st_day) && (cur_time < end_st_day)) ||
((cur_time >= st_end_day) && (cur_time < end_end_day)) ||
((cur_time >= st_st_evn) && (cur_time < end_st_evn)) ||
((cur_time >= st_end_evn) && (cur_time < end_end_evn)))
{
if(!is_sync)
{
if(!SymbolInfoTick(Symbol(), tick))
{
Print("Error SymbolInfoTick", GetLastError());
return;
}
sv_time.year = 0;
TimeToStruct(tick.time, sv_time);
if(sv_time.year>0)
{
ulong last_ping=ulong(NormalizeDouble(double(TerminalInfoInteger(TERMINAL_PING_LAST))/2000,0));
ulong mls_time=ulong(tick.time_msc%1000);
if((mls_time+last_ping)>999)
{
mls_time=tick.time_msc+last_ping;
if(!ConvertToTime(mls_time, loc_time)) return;
}
else
{
loc_time.wYear = short(sv_time.year);
loc_time.wMonth = short(sv_time.mon);
loc_time.wDay = short(sv_time.day);
loc_time.wDayOfWeek = short(sv_time.day_of_week);
loc_time.wHour = short(sv_time.hour);
loc_time.wMinute = short(sv_time.min);
loc_time.wSecond = short(sv_time.sec);
loc_time.wMilliseconds=short(mls_time+last_ping);
}
if(SetLocalTime(loc_time))
{
is_sync=true;
Print("Local time sync is done. Symbol = ",Symbol()," Sync hour = ",loc_time.wHour, " Sync min = ",loc_time.wMinute,
" Sync sec = ",loc_time.wSecond," Sync ms = ",loc_time.wMilliseconds);
}
}
}
}
else is_sync = false;
}
}
//+------------------------------------------------------------------+
Добавлено
И ещё мне не нравится, что пинг редко меняется в терминале
Первый результат работы нового советника
2017.02.06 10:33:04.922 Delta_time (BR-3.17,M1) ping : 5 | time current: 2017.02.06 10:33:04 | time server: 10:33:4,710 | time local: 10:33:4,922 | delta ms: -21 | min max delta: 0 : -212
2017.02.06 10:33:08.424 Delta_time (BR-3.17,M1) ping : 5 | time current: 2017.02.06 10:33:08 | time server: 10:33:8,407 | time local: 10:33:8,424 | delta ms: -22 | min max delta: 0 : -212
2017.02.06 10:33:11.244 Delta_time (BR-3.17,M1) ping : 5 | time current: 2017.02.06 10:33:11 | time server: 10:33:11,221 | time local: 10:33:11,244 | delta ms: -25 | min max delta: 0 : -212
2017.02.06 10:33:11.830 Delta_time (BR-3.17,M1) ping : 5 | time current: 2017.02.06 10:33:11 | time server: 10:33:11,806 | time local: 10:33:11,830 | delta ms: -27 | min max delta: 0 : -212
2017.02.06 10:33:11.837 Delta_time (BR-3.17,M1) ping : 5 | time current: 2017.02.06 10:33:11 | time server: 10:33:11,806 | time local: 10:33:11,837 | delta ms: -30 | min max delta: 0 : -212
2017.02.06 10:33:12.026 Delta_time (BR-3.17,M1) ping : 5 | time current: 2017.02.06 10:33:11 | time server: 10:33:11,958 | time local: 10:33:12,26 | delta ms: -37 | min max delta: 0 : -212
Перед концом утренней сессии время синхронизировалось, а вот в 14-01 -- 14-04 нет :(
Видимо это связано с тем, что заявки только снимались.
Но всё-равно синхронизация есть :)
2017.02.06 14:23:10.145 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:10 | time server: 14:23:10,121 | time local: 14:23:10,145 | delta ms: -2 | min max delta: 0 : -24
2017.02.06 14:23:10.158 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:10 | time server: 14:23:10,144 | time local: 14:23:10,158 | delta ms: -3 | min max delta: 0 : -24
2017.02.06 14:23:12.188 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:12 | time server: 14:23:12,168 | time local: 14:23:12,188 | delta ms: -5 | min max delta: 0 : -24
2017.02.06 14:23:12.188 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:12 | time server: 14:23:12,168 | time local: 14:23:12,188 | delta ms: -7 | min max delta: 0 : -24
2017.02.06 14:23:14.590 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:14 | time server: 14:23:14,569 | time local: 14:23:14,590 | delta ms: -9 | min max delta: 0 : -24
2017.02.06 14:23:14.725 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:14 | time server: 14:23:14,694 | time local: 14:23:14,725 | delta ms: -13 | min max delta: 0 : -31
2017.02.06 14:23:14.727 Delta_time (BR-3.17,M1) ping : 7 | time current: 2017.02.06 14:23:14 | time server: 14:23:14,699 | time local: 14:23:14,727 | delta ms: -15 | min max delta: 0 : -31
Решил остановится на следуюшем
int end_st_mon = 36000; //10-00
int st_tr_mon = 36060; //10-01
int end_tr_mon = 36120; //10-02
int st_end_mon = 50280; //13-58
int end_end_mon = 50400; //14-00
int st_st_day = 50700; //14-05
int end_st_day = 50760; //14-06
int st_end_day = 67380; //18-43
int end_end_day = 67500; //18-45
int st_st_evn = 68700; //19-05
int end_st_evn = 68760; //19-06
int st_end_evn = 85680; //23-48
int end_end_evn = 85800; //23-50
Думаю, что тема исчерпана
Последняя версия здесь
https://www.mql5.com/ru/forum/167309#comment_4065302
У разработчиков появилась возможность "малой кроввью" добавить время в стаканы
Из релиза Spectra 5.3
4. Технологические изменения.
Модернизация ядра и риск-модуля ТКС, направленная на стабилизацию работы системы.
В версии 5.3 шлюзовые ограничители потока транзакций от клиентов были заменены на единую точку. В предыдущих версиях использовался ограничитель на каждый шлюз.
Для таблиц потоков, транслирующих сделки и заявки, добавлено новое поле moment_ns.
УРРРАААААА!
Добавлено
Спектра 5,3 начнёт работать на бирже 27 фераля 2017 года.
Добавлено
{
ENUM_BOOK_TYPE type; // тип заявки из перечисления ENUM_BOOK_TYPE
double price; // цена
long volume; // объем
ulong moment_ns; //ООООООООО-ЧЕНЬ ЖДЁМ
};
Добавлено
{
ENUM_BOOK_TYPE type; // тип заявки из перечисления ENUM_BOOK_TYPE
double price; // цена
long volume; // объем
ulong moment_ns; //ООООООООО-ЧЕНЬ ЖДЁМ
};
И еще бы для сентимента (насколько я понимаю инфа по ОИ, ордерам и т.п. называется так). Там будет достаточно миллисекундной. А вообще, чем точнее, тем лучше, но хотелось бы одной точности для всей возможной информации.
А влезут ли в ULONG НОНОсекунды?
Добавлено
Нужно посмотреть как объявила moment_ns биржа
Через 20 дней уже будет работать в боевом режиме, а
документацию ещё не выложили (как всегда) :(
А влезут ли в ULONG НОНОсекунды?
Добавлено
Нужно посмотреть как объявила moment_ns биржа
Через 20 дней уже будет работать в боевом режиме, а
документацию ещё не выложили (как всегда) :(
вечерняя дополнительная торговая сессия на срочном рынке 24 февраля 2017 г.
(является торговым днем на срочном рынке) будет отменена.