Características da linguagem mql5, subtilezas e técnicas - página 75

 
Vitaly Muzichenko:

Eu coloquei o EA no gráfico no sábado, mas o EA pode obter a hora do último tick, é por exemplo no Market Watch 23:58, e minha hora local é 04:45. A hora do servidor eu não sei.

Minha pergunta é: Quanto tempo passou desde o último tick até o tempo do servidor (tempo do terminal)

Pensei por um tempo. Acontece que não há diferença quando um EA é anexado a um gráfico. Enquanto não houver um tick real, não podemos executar aquela parte do algoritmo do programa que usa o tempo real do servidor.

Se forem necessários cálculos antes do tick chegar, então solicite o ServerGMTOffset.

Portanto, o problema pode ser resolvido mesmo sem o ServerTradeTime().

 
Ihor Herasko:

Já pensei nisso. Acontece que não há diferença quando o EA é anexado ao gráfico. Enquanto não houver um tick real, não podemos executar aquela parte do algoritmo do programa que usa o tempo real do servidor.

Se forem necessários cálculos antes do tick chegar, então solicite o ServerGMTOffset.

Assim, o problema pode ser resolvido mesmo sem o ServerTradeTime().

O usuário não conhece o Offset do servidor, ele não sabe disso.

Apenas dois valores são conhecidos, e estes dados não são suficientes para calcular"quanto tempo passou desde o último tick até ao tempo do servidor(terminal)".

Esta é uma tarefa muito peculiar e não vejo uma solução, como você vê.

 
Vitaly Muzichenko:

Eu coloquei o EA no gráfico no sábado, mas o EA pode obter a hora do último tick, é por exemplo no Market Watch 23:58, e minha hora local é 04:45. A hora do servidor eu não sei.

A questão é quanto tempo passou desde o último tick até o tempo do servidor (tempo do terminal)

Não é só uma hora, é um encontro. A data e a hora. Assim, a operação aritmética com estes dados dará a diferença em segundos, o que não é difícil de traduzir em dias, horas, minutos e segundos.

Além disso, você precisa verificar o que o TimeTradeServer irá mostrar nos finais de semana.

2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeCurrent() = 2018.03.29 14:59:54
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeLocal() = 2018.03.29 15:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMT() = 2018.03.29 12:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMTOffset() = -10800
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeTradeServer() = 2018.03.29 15:00:03
Preste atenção à discrepância entre a hora do servidor e a hora local, e depois à correspondência exata entre a hora local e a hora estimada do servidor.
 
Para forex você pode refazer este código a partir de quatro

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Características da linguagem mql4, subtilezas e truques

fxsaber, 2018.03.29 14:32

#property strict

#define  HOUR 3600
#define  DAY (24 * HOUR)
#define  WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
  if (Symb == NULL)
    Symb = _Symbol;
    
  return(iTime(Symb, TimeFrame, iBarShift(Symb, TimeFrame, time) - (NextBar ? 1 : 0)));
}

datetime GetTimeDayOfWeek( const int Shift = 0, const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
  const datetime Res = TimeCurrent() / DAY * DAY;
  
  return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - 3) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}
 
fxsaber:
Você pode refazer este código para forex

Obrigado, eu vou dar uma olhada. Mas também há símbolos não cambiais.

O que não é conveniente é que você não pode simplesmente e brevemente obter a hora atual do servidor, em qualquer momento.

Alexey Viktorov:

Ambos não são apenas tempo, são datas. Em outras palavras, é tanto a data como a hora. Assim, a operação aritmética com estes dados dará a diferença em segundos, o que não é difícil de traduzir em dias, horas, minutos e segundos.

Além disso, precisamos verificar nos fins de semana o que o TimeTradeServer mostra.

Observe a discrepância entre a hora do servidor em segundos e a hora local, e então a correspondência exata entre a hora local e o cálculo da hora do servidor.

Imprimi-o da mesma forma, mas não pode ser usado ao fim-de-semana. Em geral, a informação deve ser testada.

A tarefa é mínima:"quanto tempo passou desde o último tick até o tempo do servidor (terminal)".

if( TimeCurrent()<TimeServer()-60 ) Alert( "нет котировок более 1-й минуты" );
 
Vitaly Muzichenko:

Obrigado, eu vou dar uma olhada. Mas, por outro lado, há símbolos não forex.

Se o corretor tiver pelo menos um símbolo forex, ele irá trabalhar para outros.

Se o corretor não tem um símbolo Forex, surge a questão da razoabilidade.

 
Vitaly Muzichenko:

Obrigado, eu vou dar uma olhada. Mas também há símbolos que não são forex.

Não é conveniente que você não possa simplesmente e brevemente obter a hora atual do servidor, em qualquer momento.

Também o tenho impresso, mas como o usar no fim-de-semana. Em geral, você precisa girar as informações fornecidas.

A tarefa é mínima:"quanto tempo passou desde o último tick até o tempo do servidor (terminal)".

Claro que precisamos verificar, mas a julgar pela diferença entre TimeCurrent e TimeTradeServer, podemos assumir que a diferença vai crescer.

Por favor, diga-me se a hora do servidor MQ-demo é a mesma que em Moscovo.

 
Alexey Viktorov:

Vale a pena verificar, mas a diferença entre TimeCurrent e TimeTradeServer sugere que a diferença irá aumentar.

Por favor, diga-me se a hora do meu servidor MQ-demo é a mesma que a minha hora de Moscovo e o que mostra se a hora do servidor não é a mesma que a minha hora local?

Robo

A minha hora local era 17:17:13

 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Bugs, bugs, perguntas

fxsaber, 2017.05.19 22:35

O TimeTradeServer pode devolver todo o tipo de disparates. Por exemplo, um valor inferior ao TimeCurrent. Isto anula completamente a sua aplicação prática.

Se eu entendi a idéia corretamente, o TimeTradeServer deve calcular o tempo decorrido após receber o TimeCurrent e adicionar essa diferença, tipo emular os valores futuros do TimeCurrent.

Agora, depois de gerir o Expert Advisor

#define  TOSTRING(A) #A + " = " + (string)(A) + "\n"

void OnInit()
{
  EventSetTimer(1);
}

void OnTimer()
{
  Comment(TOSTRING(TimeTradeServer()) + TOSTRING(TimeCurrent()));
}

podes ver qualquer disparate.

Anote as datas.

 
fxsaber:

E de quem é a culpa disto, do terminal, ou do CD com as configurações tortas?