BaseTrader.MartketTime, предложение
Atom
06.03.2011


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

Смарт, насколько я понимаю, использует время компьютера.

Поэтому появилась идея использовать не системное время (т.к. оно может:
- быть не синхронизировано
- быть не московским,
....), а московское время из интернета.

Т.е. обращаться к стандартными NTP серверам и опрашивая их получать московское время.

Поискав в инете наткнулся на множество тем, выбрал решение отсюда как наиболее простое: всемогущий MSDN

Немного его отредактировал под наши нужны, получил следующее:

Код
using System;
using System.Net;
using System.Net.Sockets;

namespace Robots.Entities
{
/// <summary>
/// Static class to receive Moscow time from a NTP server.
/// </summary>
public static class NtpClient
{
/// <summary>
/// Gets Moscow DateTime from <paramref name="ntpServer"/>.
/// </summary>
/// <param name="ntpServer">The hostname of the NTP server.</param>
/// <returns>A DateTime containing Moscow current time.</returns>
public static DateTime GetMoscowTime(string ntpServer = "time-a.nist.gov")
{
var address = Dns.GetHostEntry(ntpServer).AddressList;

if (address == null || address.Length == 0)
throw new ArgumentException(string.Format("Could not resolve ip address from '{0}'.", ntpServer), "ntpServer");

var ep = new IPEndPoint(address[0], 123);
return GetMoscowTime(ep);
}

/// <summary>
/// Gets Moscow DateTime form <paramref name="ep"/> IPEndPoint.
/// </summary>
/// <param name="ep">The IPEndPoint to connect to.</param>
/// <returns>A DateTime containing Moscow current time.</returns>
private static DateTime GetMoscowTime(IPEndPoint ep)
{
var s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Connect(ep);

var ntpData = new byte[48]; // RFC 2030
ntpData[0] = 0x1B;
for (var i = 1; i < 48; i++)
ntpData[i] = 0;

s.Send(ntpData);
s.Receive(ntpData);

const byte offsetTransmitTime = 40;
ulong intpart = 0;
ulong fractpart = 0;

for (var i = 0; i <= 3; i++)
intpart = 256 * intpart + ntpData[offsetTransmitTime + i];

for (var i = 4; i <= 7; i++)
fractpart = 256 * fractpart + ntpData[offsetTransmitTime + i];

var milliseconds = (intpart * 1000 + (fractpart * 1000) / 0x100000000L);
s.Close();

var timeSpan = TimeSpan.FromMilliseconds(milliseconds);

var dateTime = new DateTime(1900, 1, 1);
dateTime += timeSpan;

var moscowTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time");
var offsetAmount = moscowTimeZone.GetUtcOffset(dateTime);
var networkDateTime = dateTime + offsetAmount;

return networkDateTime;
}

/// <summary>
/// Gets TimeSpan offset.
/// </summary>
/// <returns>Gets offset between local time and Moscow Time.</returns>
public static TimeSpan GetMoscowTimeOffset()
{
try
{
var moscowDateTime = GetMoscowTime();
return moscowDateTime - DateTime.Now;
}
catch(Exception)
{
return new TimeSpan(0);
}
}
}
}


Цитата:
NtpClient.GetMoscowTime("time.nist.gov")
возвращает текущее московское время :)
Цитата:
NtpClient.GetMoscowTimeOffset()
- смещение с московским временем.

Предложение состоит в том, чтобы использовать данное время для определения BaseTrader.MarketTime.
1 раз - при инициализации получать московское время и просто подсчитать первоначальную разницу между московским временем и локальным.
Затем установить его в MarketTimeOffset.


Вот текущее использование, которое я сегодня добавил в моего робота:
Код
public class OwnQuikTrader : QuikTrader
{
public OwnQuikTrader(string path, string ddeServer, string dllName) :
base(path, ddeServer, dllName)
{
base.MarketTimeOffset = NtpClient.GetMoscowTimeOffset();
}

//...

public override DateTime MarketTime
{
get { return DateTime.Now; }
}
}

Теги:


Спасибо:


< 1 2 
EugeneP

Фотография
Дата: 19.07.2011
Ответить


President Перейти

1.
вот нашел сервер
Name: ntp.rts.ru
Address: 194.247.133.37
и моя винда даже смогла с ним ссинхронизироваться



pool.ntp.org юзайте. С ним вроде без проблем коннектится
Спасибо:

EugeneP

Фотография
Дата: 19.07.2011
Ответить


Alexander



Кстати, поздравляю с денюхой! Успехов [thumbup]
Спасибо:

Alexander

Фотография
Дата: 21.07.2011
Ответить


EugeneP Перейти
Alexander



Кстати, поздравляю с денюхой! Успехов [thumbup]



Спасибо большое :) [thumbup]
Спасибо:
< 1 2 

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy