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

Теги:


Спасибо:




16 Ответов
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;
			}
		}
	}
}
Спасибо:

vfreeman

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


Alexander Mukhanchikov Перейти
Код
using System;
		public NtpClient(string ntpServer = "time-a.nist.gov:123")


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.01.2012
Ответить


vfreeman Перейти
Alexander Mukhanchikov Перейти
Код
using System;
		public NtpClient(string ntpServer = "time-a.nist.gov:123")


благодарю! попробую поковырять...


http://msdn.microsoft.co...us/library/kd3cf2ex.aspx
Спасибо:

vfreeman

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


Mikhail Sukhov Перейти
vfreeman Перейти
Alexander Mukhanchikov Перейти
Код
using System;
		public NtpClient(string ntpServer = "time-a.nist.gov:123")


благодарю! попробую поковырять...


https://msdn.microsoft.co...us/library/kd3cf2ex.aspx



грамотный вариант!
но не проходит. похоже действительно NTP не работает через http-прокси...
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.01.2012
Ответить


vfreeman Перейти
похоже действительно NTP не работает через http-прокси...


Наверное у вас порты закрыты.
Спасибо:

vfreeman

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


Mikhail Sukhov Перейти
vfreeman Перейти
похоже действительно NTP не работает через http-прокси...


Наверное у вас порты закрыты.


в том то и дело что закрыты. у меня на работе выход в инет есть только через прокси - все остальные порты закрыты. сам квик нормально ходит через проксик.
для моей задачи вполне бы подошло и локальное время - его можно через те же NTP-сервера синхронизировать специальным софтом - но в нашей локалке каждые несколько минут происходит синхронизация хрен знает с чем - минут на 5 от общепринятого. в моем случае локальное время вообще использовать опасно BigGrin
Автор топика
Спасибо:

VassilSanych

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


Почему предпочтение time-a.nist.gov?
(Вот прямо сейчас он у меня не доступен)
time.nist.gov
,например, подключается рандомно к любому адресу из большого списка
Спасибо:


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

loading
clippy