Добрый день!
Возможно ли из MQL5 подстраивать текущее локальное время компьютера?
Будут ли работать функции GetLocalTime() и SetLocalTime()?
Проверил, работает
//| TimeTest.mq5 |
//| Copyright 2016 prostotrader |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 prostotrader"
#property link "https://www.mql5.com"
#property version "1.00"
//---
struct _SYSTEMTIME {
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
};
_SYSTEMTIME loc_time;
#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
GetLocalTime(loc_time);
if(loc_time.wYear > 0)
{
loc_time.wSecond = 55;
if(SetLocalTime(loc_time))
{
if(loc_time.wYear > 0)
{
}
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
Теперь осталось понять, как правильно синхронизировать локальное время
компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время (ФОРТС).
Есть идеи?
Теперь осталось понять, как правильно синхронизировать локальное время
компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время на ФОРТС.
Есть идеи?
Теперь осталось понять, как правильно синхронизировать локальное время
компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время на ФОРТС.
Есть идеи?
Так обновление нужно только тогда, когда тик приходит. Поэтому делать вызов только в OnTick. Перемудрили-с.
Ничего не перемудрились...
Есть премаркет, в который в стакан приходят котировки, поэтому с 9-50 до 10-00 можно синхронизировать время с временем сервера.
Добавлено
Если добавить станан какого-либо символа, то без фильтрации, туда будут попадать события от всех инструментов,
которые выбраны в Обзоре рынка. Далее взять CopyTicks() и посмотреть время для синхронизации....
Как-то так.
Добавлено
Поправте, если что не додумал.
//| Time_sync_forts.mq5 |
//| Copyright 2017 prostotrader |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link "https://www.mql5.com"
#property version "1.00"
//---
struct _SYSTEMTIME
{
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
};
_SYSTEMTIME loc_time;
#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//---
bool is_sync;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
is_sync=false;
MarketBookAdd(Symbol());
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
loc_time.wYear=0;
GetLocalTime(loc_time);
if(loc_time.wYear>0)
{
if((loc_time.wHour==9) && (loc_time.wMinute>=50) && (loc_time.wMinute<=59))
{
MqlTick curr_tick[1];
if(CopyTicks(symbol,curr_tick,COPY_TICKS_ALL,0,1)==1)
{
MqlDateTime sv_time;
TimeToStruct(curr_tick[0].time,sv_time);
if(!is_sync)
{
loc_time.wHour=ushort(sv_time.hour);
loc_time.wMinute = ushort(sv_time.min);
loc_time.wSecond = ushort(sv_time.sec);
loc_time.wMilliseconds=ushort(ulong(curr_tick[0].time_msc)-ulong(curr_tick[0].time)*1000);
if(SetLocalTime(loc_time))
{
is_sync=true;
Print("Local time sync is done.");
}
}
}
}
else is_sync=false;
}
}
//+------------------------------------------------------------------+
На всяуий случай проверка котировки на "свежесть"
{
if((loc_time.wDayOfWeek == ushort(sv_time.day_of_week)) &&
(loc_time.wHour == ushort(sv_time.hour)))
{
loc_time.wMinute = ushort(sv_time.min);
loc_time.wSecond = ushort(sv_time.sec);
loc_time.wMilliseconds=ushort(ulong(curr_tick[0].time_msc)-ulong(curr_tick[0].time)*1000);
if(SetLocalTime(loc_time))
{
is_sync=true;
Print("Local time sync is done.");
}
}
}
Теперь осталось понять, как правильно синхронизировать локальное время
компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время (ФОРТС).
Есть идеи?
Может быть, проще синхронизировать с первоисточником? Любое событие, происходящее на бирже, получает ее штамп времени. Само время на бирже синхронизируется с астрономическим с погрешностью в миллисекунды. Тогда как время прихода извещений в сервер MT5 (он стоит у брокера) уже другое, время отправки пакета в терминал третье, время прихода в терминал четвертое. Если на локальном компьютере сделать синхронизацию системного времени с астрономическим, то она будет работать всегда и локальное время будет совпадать с временем на биржах. Имеется несколько сот публичных (бесплатных) NTP серверов точного времени. Сейчас живы и работают, например, эти:
195.234.155.123;ntp.dvconsulting.dk
85.17.207.62;ntp.edge.tillo.ch
195.34.89.227;ntp.favey.ch
195.234.155.124;ntp.gal.dk
193.226.65.36;ntp.idsi.md
Может быть, проще синхронизировать с первоисточником? Любое событие, происходящее на бирже, получает ее штамп времени. Само время на бирже синхронизируется с астрономическим с погрешностью в миллисекунды. Тогда как время прихода извещений в сервер MT5 (он стоит у брокера) уже другое, время отправки пакета в терминал третье, время прихода в терминал четвертое. Если на локальном компьютере сделать синхронизацию системного времени с астрономическим, то она будет работать всегда и локальное время будет совпадать с временем на биржах. Имеется несколько сот публичных (бесплатных) NTP серверов точного времени. Сейчас живы и работают, например, эти:
195.234.155.123;ntp.dvconsulting.dk
85.17.207.62;ntp.edge.tillo.ch
195.34.89.227;ntp.favey.ch
195.234.155.124;ntp.gal.dk
193.226.65.36;ntp.idsi.md
Время, которое берётся из CopyTicks() это и есть биржевое время, понятно, что существуют задерржки доставки
пакета к моему компу, но оно достаточно маленькое 4-6 мс.
Точное время ничего не даст, так как время Биржи может не сопадать с ним, а мы торнуем именно по Биржевому
времени и из МТ5
К CopyTicks[0] добавить пинг.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день!
Возможно ли из MQL5 подстраивать текущее локальное время компьютера?
Будут ли работать функции GetLocalTime() и SetLocalTime()?