Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 75

 
Vitaly Muzichenko:

Ho messo l'EA sul grafico di sabato, ma l'EA può ottenere il tempo dell'ultimo tick, è per esempio in Market Watch 23:58, e la mia ora locale è 04:45. Il tempo del server non lo so.

La mia domanda è: quanto tempo è passato dall'ultimo tick all'ora del server (ora del terminale)

Pensato per un po'. Si scopre che non c'è differenza quando un EA è collegato a un grafico. Finché non c'è un tick reale, non possiamo eseguire quella parte dell'algoritmo del programma che utilizza il tempo reale del server.

Se i calcoli sono richiesti prima che il tick arrivi, allora chiedete ServerGMTOffset.

Quindi, il problema può essere risolto anche senza ServerTradeTime().

 
Ihor Herasko:

Ci ho pensato un po'. Si scopre che non c'è differenza quando l'EA è attaccato al grafico. Finché non c'è un tick reale, non possiamo eseguire quella parte dell'algoritmo del programma che usa il tempo reale del server.

Se i calcoli sono richiesti prima che il tick arrivi, allora chiedete ServerGMTOffset.

Così, il problema può essere risolto anche senza ServerTradeTime().

L'utente non conosce l'Offset del server, non lo conosce.

Solo due valori sono noti, e questi dati non sono sufficienti per calcolare"quanto tempo è passato dall'ultimo tick all'ora del server(terminale)".

Questo è un compito molto particolare e non vedo una soluzione, come voi.

 
Vitaly Muzichenko:

Ho messo l'EA sul grafico di sabato, ma l'EA può ottenere il tempo dell'ultimo tick, è per esempio in Market Watch 23:58, e la mia ora locale è 04:45. Il tempo del server non lo so.

La domanda è quanto tempo è passato dall'ultimo tick all'ora del server (ora del terminale)

Non è solo un'ora, è una data. Cioè sia la data che l'ora. Quindi, l'operazione aritmetica con questi dati darà la differenza in secondi, che non è difficile da tradurre in giorni, ore, minuti e secondi.

Inoltre, è necessario controllare cosa mostrerà TimeTradeServer nei fine settimana.

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
Fate attenzione alla discrepanza tra l'ora del server e l'ora locale, e poi alla corrispondenza esatta tra l'ora locale e l'ora stimata del server.
 
Per il forex potete rifare questo codice da quattro

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Caratteristiche del linguaggio mql4, sottigliezze e trucchi

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:
Puoi rifare questo codice per il forex

Grazie, darò un'occhiata. Ma poi di nuovo, ci sono simboli non forex.

Ciò che non è conveniente è che non si può ottenere semplicemente e brevemente l'ora corrente del server, in qualsiasi momento.

Alexey Viktorov:

Entrambi non sono solo tempo, sono datetime. In altre parole, è sia data che ora. Quindi, l'operazione aritmetica con questi dati darà la differenza in secondi, che non è difficile da tradurre in giorni, ore, minuti e secondi.

Inoltre, dobbiamo controllare nei fine settimana ciò che TimeTradeServer mostra.

Fate attenzione alla discrepanza tra i secondi dell'ora del server e l'ora locale, e poi l'esatta corrispondenza tra l'ora locale e il calcolo dell'ora del server.

L'ho stampato allo stesso modo, ma come può essere usato nel fine settimana. In generale, le informazioni dovrebbero essere testate.

Il compito è minimo:"quanto tempo è passato dall'ultimo tick all'ora del server (terminale)".

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

Grazie, darò un'occhiata. Ma ci sono anche simboli non forex.

Se il broker ha almeno un simbolo forex, funzionerà per gli altri.

Se il broker non ha un solo simbolo Forex, si pone la questione della ragionevolezza.

 
Vitaly Muzichenko:

Grazie, darò un'occhiata. Ma poi di nuovo, ci sono simboli non forex.

Non è conveniente che non si possa ottenere semplicemente e brevemente l'ora corrente del server, in qualsiasi momento.

L'ho anche stampato, ma come usarlo nel fine settimana. In generale, è necessario ruotare le informazioni fornite.

Il compito è minimo:"quanto tempo è passato dall'ultimo tick all'ora del server (terminale)".

Naturalmente dobbiamo controllarlo, ma a giudicare dalla differenza tra TimeCurrent e TimeTradeServer possiamo supporre che la differenza crescerà.

Per favore, ditemi se l'ora del server MQ-demo è la stessa di Mosca.

 
Alexey Viktorov:

Vale la pena controllare, ma la differenza tra TimeCurrent e TimeTradeServer suggerisce che la differenza si amplierà.

Per favore, ditemi se l'ora del mio server MQ-demo è la stessa dell'ora di Mosca e cosa mostra se l'ora del server non è la stessa dell'ora locale?

Robo

La mia ora locale era 17:17:13

 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2017.05.19 22:35

TimeTradeServer può restituire ogni sorta di assurdità. Per esempio, un valore inferiore a TimeCurrent. Questo annulla completamente la sua applicazione pratica.

Se ho capito bene l'idea, il TimeTradeServer deve calcolare il tempo trascorso dopo aver ricevuto TimeCurrent e aggiungere questa differenza, una sorta di emulazione dei valori futuri di TimeCurrent.

Ora, avendo eseguito l'Expert Advisor

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

void OnInit()
{
  EventSetTimer(1);
}

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

si può vedere qualsiasi sciocchezza.

Notate le date.

 
fxsaber:

E chi è da biasimare per questo, il terminale o il DC con le impostazioni storte?

Motivazione: