MarketTime в версии StockSharp_4.0.10

MarketTime в версии StockSharp_4.0.10
Atom
12/26/2011
vfreeman


Trader.MarketTime возвращает локальное время
попытка вызова SyncMarketTime(Exchange.Rts) к успеху не привела.
Расхождение времени в терминале QUIK и Trader.MarketTime осталось.
Как получить биржевое время?

я полностью повторил вопрос из топика MarketTime в версии StockSharp_4.0.8 с учетом того что было прокомментировано.

В чем собственно проблема - на моей машине локальное время расходится со временем биржи примерно на 5 минут - причем время в нашей локалке синхронизируют наши админы (а уж что они берут за эталон - вопрос выходит за темы форума)
так вот
Trader.MarketTime возвращает локальное время
после вызова SyncMarketTime(Exchange.Rts) изменяется Trader.MarketTimeOffset, но меняется не верно

вот какой код выполняю
Code
Debug.Print(Trader.MarketTime)
Debug.Print(Trader.MarketTimeOffset.ToString)
SyncMarketTime(Trader, Exchange.Rts)
Debug.Print(Trader.MarketTimeOffset.ToString)

и вот что получаю:

26.12.2011 10:46:21
00:00:00
01:00:00

т.е. смещение на 1 час, хотя по логике должно быть что-то около 00:05:00

это очень похоже на примечание к методу SyncMarketTime

Примечание
Если не удалось получить время биржи через NTP сервер, возвращается разница между часовым поясом TimeZoneInfo и локальным часовым поясом.

Tags:


Thanks:


1 2  >
Alexander

Avatar
Date: 12/26/2011
Reply


Из терминала время получается через QuikTerminal.ServerTime
Thanks:

vfreeman

Avatar
Date: 12/26/2011
Reply


Alexander Mukhanchikov
Из терминала время получается через QuikTerminal.ServerTime


благодарю!

возвращает верное время! жаль что ITrader не реализует этот метод...
надо будет подумать как из стратегии добраться...
Thanks:

Alexander

Avatar
Date: 12/26/2011
Reply


vfreeman
Alexander Mukhanchikov
Из терминала время получается через QuikTerminal.ServerTime


благодарю!

возвращает верное время! жаль что ITrader не реализует этот метод...
надо будет подумать как из стратегии добраться...


Так специально сделали, ибо он порой пустой, запаздывает, ....

Перегрузите в своём QuikTrader метод MarketTime и возвращайте QuikTerminal.ServerTime там (если он не нал).
Thanks:

vfreeman

Avatar
Date: 12/27/2011
Reply


Alexander Mukhanchikov
vfreeman
Alexander Mukhanchikov
Из терминала время получается через QuikTerminal.ServerTime


благодарю!

возвращает верное время! жаль что ITrader не реализует этот метод...
надо будет подумать как из стратегии добраться...


Так специально сделали, ибо он порой пустой, запаздывает, ....

Перегрузите в своём QuikTrader метод MarketTime и возвращайте QuikTerminal.ServerTime там (если он не нал).


идея, наверное, хорошая - еще бы уметь [confused]
Thanks:

Alexander

Avatar
Date: 12/27/2011
Reply


vfreeman
Alexander Mukhanchikov
vfreeman
Alexander Mukhanchikov
Из терминала время получается через QuikTerminal.ServerTime


благодарю!

возвращает верное время! жаль что ITrader не реализует этот метод...
надо будет подумать как из стратегии добраться...


Так специально сделали, ибо он порой пустой, запаздывает, ....

Перегрузите в своём QuikTrader метод MarketTime и возвращайте QuikTerminal.ServerTime там (если он не нал).


идея, наверное, хорошая - еще бы уметь [confused]



Code
public class MyTrader : QuikTrader
{
public override MarketTime {get {return Terminal.ServerTime ?? base.MarketTime;}}
}


вообще такие вопросы лучше задавать гуглу :)
но скоро новый год... [cool]
Thanks:

vfreeman

Avatar
Date: 12/27/2011
Reply


Alexander Mukhanchikov
vfreeman
Alexander Mukhanchikov
vfreeman
Alexander Mukhanchikov
Из терминала время получается через QuikTerminal.ServerTime


благодарю!

возвращает верное время! жаль что ITrader не реализует этот метод...
надо будет подумать как из стратегии добраться...


Так специально сделали, ибо он порой пустой, запаздывает, ....

Перегрузите в своём QuikTrader метод MarketTime и возвращайте QuikTerminal.ServerTime там (если он не нал).


идея, наверное, хорошая - еще бы уметь [confused]



Code
public class MyTrader : QuikTrader
{
public override MarketTime {get {return Terminal.ServerTime ?? base.MarketTime;}}
}


вообще такие вопросы лучше задавать гуглу :)
но скоро новый год... [cool]


так я вчера совет по поводу перегрузки оставил без коммента - как раз гуглил [confused]

еще раз благодарю! буду ковырять...
Thanks:

vfreeman

Avatar
Date: 1/10/2012
Reply


Alexander Mukhanchikov
vfreeman
Alexander Mukhanchikov
Из терминала время получается через QuikTerminal.ServerTime


благодарю!

возвращает верное время! жаль что ITrader не реализует этот метод...
надо будет подумать как из стратегии добраться...


Так специально сделали, ибо он порой пустой, запаздывает, ....



убедился, что хреновый источник QuikTerminal.ServerTime

вопрос у меня возник - SyncMarketTime лезет к NTP серверу напрямую? т.е. минуя настройки прокси броузера?

опытным путем выяснил, что на машине, где инет выделенный SyncMarketTime нормально отрабатывает, а на машине где инет через прокси - хрен.
что можете посоветовать, чтоб SyncMarketTime заработал за прокси?
Thanks:

Alexander

Avatar
Date: 1/10/2012
Reply


Да, минуя.

Насколько мне сказал Гугл - прокси сервера не поддерживают обрашения к NTP.
Thanks:

vfreeman

Avatar
Date: 1/10/2012
Reply


Alexander Mukhanchikov
Да, минуя.

Насколько мне сказал Гугл - прокси сервера не поддерживают обрашения к NTP.


благодарю!
а каким решением (сторонний компонент/сами писали) идет обращение к NTP серверу? почитаю, может достаточно порт какой-нибудь открыть?
Thanks:

Alexander

Avatar
Date: 1/10/2012
Reply


Code
using System;
using System.Net;
using System.Net.Sockets;

namespace Ecng.Net
{
	using Ecng.Common;

	public class NtpClient
	{
		private readonly EndPoint _ntpServer;

		/// <summary>
		/// Create <see cref="NtpClient"/>.
		/// </summary>
		/// <param name="ntpServer">NTP server.</param>
		public NtpClient(string ntpServer = "time-a.nist.gov:123")
			: this(ntpServer.To<EndPoint>())
		{
			//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");

			//_endPoint = new IPEndPoint(address[0], 123);
		}

		/// <summary>
		/// Create <see cref="NtpClient"/>.
		/// </summary>
		/// <param name="ntpServer">NTP server.</param>
		public NtpClient(EndPoint ntpServer)
		{
			if (ntpServer == null)
				throw new ArgumentNullException("ntpServer");

			_ntpServer = ntpServer;
		}

		public DateTime GetLocalTime(TimeZoneInfo info, int timeout = 5000)
		{
			if (info == null)
				throw new ArgumentNullException("info");

			var utcTime = GetUtcTime(timeout);
			return utcTime + info.GetUtcOffset(utcTime);
		}

		public DateTime GetUtcTime(int timeout = 5000)
		{
			using (var s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
			{
				s.SendTimeout = timeout;
				s.ReceiveTimeout = timeout;

				s.Connect(_ntpServer);

				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);

				var timeSpan = TimeSpan.FromMilliseconds(milliseconds);

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

				return dateTime;
			}
		}
	}
}
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy