← Voltar

MarketTime в версии StockSharp_4.0.10

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

Este tópico foi útil?

Compartilhar tópico

Comentários (16)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Alexander
Alexander

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

vfreeman
vfreeman Autor

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

благодарю!

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

Alexander
Alexander

vfreeman:

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

благодарю!

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

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

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

vfreeman
vfreeman Autor

Alexander Mukhanchikov:

vfreeman:

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

благодарю!

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

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

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

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

Alexander
Alexander

vfreeman:

Alexander Mukhanchikov:

vfreeman:

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

благодарю!

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

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

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

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

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

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

vfreeman
vfreeman Autor

Alexander Mukhanchikov:

vfreeman:

Alexander Mukhanchikov:

vfreeman:

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

благодарю!

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

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

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

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

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

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

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

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

Alexander Mukhanchikov:

vfreeman:

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

благодарю!

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

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

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

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

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

Alexander
Alexander

Да, минуя.

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

vfreeman
vfreeman Autor

Alexander Mukhanchikov: Да, минуя.

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

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

Alexander
Alexander
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
vfreeman Autor

Alexander Mukhanchikov: ...

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

Mikhail Sukhov
Mikhail Sukhov

vfreeman:

Alexander Mukhanchikov: ...

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

http://msdn.microsoft.com/en-us/library/kd3cf2ex.aspx

vfreeman
vfreeman Autor

Mikhail Sukhov:

vfreeman:

Alexander Mukhanchikov: ...

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

http://msdn.microsoft.com/en-us/library/kd3cf2ex.aspx

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

Mikhail Sukhov
Mikhail Sukhov

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

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

vfreeman
vfreeman Autor

Mikhail Sukhov:

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

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

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

VassilSanych
VassilSanych

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