Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 75

 
Vitaly Muzichenko:

Ich habe den EA am Samstag auf den Chart gesetzt, aber der EA kann die Zeit des letzten Ticks ermitteln, in Market Watch ist es zum Beispiel 23:58, und meine Ortszeit ist 04:45. Die Serverzeit ist mir nicht bekannt.

Meine Frage ist: Wie viel Zeit ist zwischen dem letzten Tick und der Serverzeit (Terminalzeit) vergangen?

Ich dachte eine Weile nach. Es stellt sich heraus, dass es keinen Unterschied macht, wenn ein EA an ein Diagramm angehängt ist. Solange es keinen echten Tick gibt, können wir den Teil des Programmalgorithmus, der die Echtzeit des Servers nutzt, nicht ausführen.

Wenn Berechnungen erforderlich sind, bevor der Tick eintrifft, dann fragen Sie nach ServerGMTOffset.

Das Problem kann also auch ohne ServerTradeTime() gelöst werden.

 
Ihor Herasko:

Ich habe darüber nachgedacht. Es stellt sich heraus, dass es keinen Unterschied gibt, wenn der EA mit dem Chart verbunden ist. Solange es keinen echten Tick gibt, können wir den Teil des Programmalgorithmus, der echte Serverzeit verbraucht, nicht ausführen.

Wenn Berechnungen erforderlich sind, bevor der Tick eintrifft, dann fragen Sie nach ServerGMTOffset.

Somit kann das Problem auch ohne ServerTradeTime() gelöst werden.

Der Benutzer kennt den Offset des Servers nicht, er kennt ihn nicht.

Es sind nur zwei Werte bekannt, und diese Daten reichen nicht aus, um zu berechnen "wie viel Zeit seit dem letzten Tick bis zur Zeit des Servers(des Terminals) vergangen ist".

Das ist eine sehr merkwürdige Aufgabe, und ich sehe keine Lösung, wie Sie es tun.

 
Vitaly Muzichenko:

Ich habe den EA am Samstag auf den Chart gesetzt, aber der EA kann die Zeit des letzten Ticks ermitteln, in Market Watch ist es zum Beispiel 23:58, und meine Ortszeit ist 04:45. Die Serverzeit ist mir nicht bekannt.

Die Frage ist, wie viel Zeit zwischen dem letzten Tick und der Serverzeit (Terminalzeit) vergangen ist.

Es ist nicht nur eine Zeit, es ist ein Datum. D.h. sowohl Datum als auch Uhrzeit. Die arithmetische Operation mit diesen Daten ergibt also die Differenz in Sekunden, die sich leicht in Tage, Stunden, Minuten und Sekunden umrechnen lässt.

Außerdem müssen Sie prüfen, was TimeTradeServer an Wochenenden anzeigt.

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
Achten Sie auf die Diskrepanz zwischen der Serverzeit und der Ortszeit und dann auf die genaue Übereinstimmung zwischen der Ortszeit und der geschätzten Serverzeit.
 
Für Forex können Sie diesen Code aus vier Teilen neu erstellen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Merkmale der Sprache mql4, Feinheiten und Tricks

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:
Sie können diesen Code für Forex neu erstellen

Danke, ich werde es mir ansehen. Aber es gibt auch andere als Devisensymbole.

Ungünstig ist, dass man nicht einfach und kurz die aktuelle Serverzeit abrufen kann, egal zu welchem Zeitpunkt.

Alexey Viktorov:

Beide sind nicht nur Zeit, sondern auch Datum. Mit anderen Worten: Es ist sowohl Datum als auch Uhrzeit. Die arithmetische Operation mit diesen Daten ergibt also die Differenz in Sekunden, die sich leicht in Tage, Stunden, Minuten und Sekunden umrechnen lässt.

Außerdem müssen wir an Wochenenden überprüfen, was TimeTradeServer anzeigt.

Achten Sie auf die Diskrepanz zwischen den Sekunden der Serverzeit und der Ortszeit und dann auf die genaue Übereinstimmung zwischen der Ortszeit und der Berechnung der Serverzeit.

Ich habe es auf die gleiche Weise ausgedruckt, aber so, dass es am Wochenende verwendet werden kann. Im Allgemeinen sollten die Informationen getestet werden.

Die Aufgabe ist minimal:"Wie viel Zeit ist zwischen dem letzten Tick und der Zeit des Servers (des Terminals) vergangen".

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

Danke, ich werde es mir ansehen. Aber es gibt auch Nicht-Devisen-Symbole.

Wenn der Broker mindestens ein Devisensymbol hat, funktioniert er auch für andere.

Wenn der Broker kein einziges Forex-Symbol hat, stellt sich die Frage der Zumutbarkeit.

 
Vitaly Muzichenko:

Danke, ich werde es mir ansehen. Aber es gibt auch andere als Devisensymbole.

Es ist unpraktisch, dass man nicht einfach und kurz die aktuelle Serverzeit abfragen kann, egal zu welchem Zeitpunkt.

Ich habe es auch ausgedruckt, aber wie soll ich es am Wochenende benutzen? Im Allgemeinen müssen Sie die bereitgestellten Informationen umdrehen.

Die Aufgabe ist minimal:"wie viel Zeit ist seit dem letzten Tick bis zur Server-(Terminal-)Zeit vergangen".

Natürlich müssen wir das überprüfen, aber angesichts der Differenz zwischen TimeCurrent und TimeTradeServer können wir davon ausgehen, dass die Differenz wachsen wird.

Bitte sagen Sie mir, ob die Zeit des MQ-Demoservers die gleiche ist wie in Moskau.

 
Alexey Viktorov:

Es lohnt sich, dies zu überprüfen, aber der Unterschied zwischen TimeCurrent und TimeTradeServer lässt vermuten, dass sich der Unterschied vergrößern wird.

Bitte sagen Sie mir, ob meine MQ-Demo-Serverzeit mit meiner Moskauer Zeit übereinstimmt, und was wird angezeigt, wenn die Serverzeit nicht mit meiner Ortszeit übereinstimmt?

Robo

Meine Ortszeit war 17:17:13

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.05.19 22:35

TimeTradeServer kann allen möglichen Unsinn zurückgeben. Zum Beispiel ein Wert, der kleiner ist als TimeCurrent. Dies macht die praktische Anwendung völlig zunichte.

Wenn ich die Idee richtig verstehe, muss TimeTradeServer die verstrichene Zeit nach dem Empfang von TimeCurrent berechnen und diese Differenz addieren, sozusagen die zukünftigen TimeCurrent-Werte emulieren.

Nachdem Sie nun den Expert Advisor ausgeführt haben

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

void OnInit()
{
  EventSetTimer(1);
}

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

können Sie jeden Unsinn erkennen.

Beachten Sie die Daten.

 
fxsaber:

Und wer ist daran schuld, das Terminal oder der DC mit den krummen Einstellungen?