MarketTime в версии StockSharp_4.0.10
Atom
26.12.2011


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

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

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

вот какой код выполняю
Код
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 и локальным часовым поясом.

Теги:


Спасибо:


1 2  >
Alexander

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


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

vfreeman

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


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


благодарю!

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

Alexander

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


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


благодарю!

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


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

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

vfreeman

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


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


благодарю!

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


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

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


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

Alexander

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


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


благодарю!

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


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

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


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



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


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

vfreeman

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


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


благодарю!

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


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

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


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



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


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


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

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

vfreeman

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


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


благодарю!

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


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



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

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

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

Alexander

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


Да, минуя.

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

vfreeman

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


Alexander Mukhanchikov Перейти
Да, минуя.

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


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

Alexander

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


Код
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;
			}
		}
	}
}
Спасибо:
1 2  >

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

loading
clippy