[SERVICE DESK] Fehler beim Abrufen der Zeit der älteren TF im Timer! - Seite 12

 
Taras Slobodyanik:

Ich sehe das Problem nicht. Eine neue Kerze erscheint - wir berechnen die letzte Kerze im Indikator/Advisor neu.
Es gibt mehr als eine neue Kerze - wir führen eine komplette Neuberechnung des Indikators/Ratgebers durch.
Dies ist dasselbe - eine neue Kerze erscheint.

Eine weitere Sache - die erforderlichen Zeiträume sollten ständig "gezogen" werden, um sie zu aktualisieren.
Wenn niemand an der Symbol-Periode arbeitet (Anführungszeichen werden nicht überprüft, der Indikator läuft nicht), dann "schläft" er, weil er als nicht benötigt wird.

Wir ziehen, wir ziehen, wir ziehen. Wir stellen eine Anfrage, bekommen einen Fehler und verschwinden. Aber hier zeigt sich eine weitere "Besonderheit" - der Fehler wird nach dem Zurücksetzen nicht zurückgesetzt. Wenn es so wäre, gäbe es kein Problem. Aber die Rückgabe falscher Daten ist das Problem. Und ich kann es sehr deutlich sehen.

Das gesamte System der Fehlerprüfung geht bei diesem Beispiel den Bach runter.

 

Woher weiß das Terminal, dass die letzten Daten nicht mehr aktuell sind?
Denn die Geschichte ist da - sie ist da.
Die Anfrage wird an den Makler gesendet... so schnell wie möglich.

Ein neuer Balken erscheint - die Daten werden aktualisiert.

 
Taras Slobodyanik:

Woher weiß das Terminal, dass die letzten Daten nicht mehr aktuell sind?
Schließlich gibt es eine Geschichte - es gibt sie.
Anfrage an den Makler wird gesendet... Sobald dies der Fall ist.

Ein neuer Balken erscheint - die Daten werden aktualisiert.

Die Kommunikation mit dem Server ist hergestellt. Bei der Anforderung von Senior-TF-Daten, wenn die Daten nicht bereit sind - Fehler oder Rückgabe 0. Wenn die Daten bereit sind - NUR aktuelle Daten zurückgeben. Das ist alles. Wenn die Daten lange Zeit nicht bereit sind, soll ein Fehler oder 0 zurückgegeben werden.

 
Taras Slobodyanik:

Übrigens haben Sie Ihre Frage nach der Terminalversion nicht beantwortet.

 
Alexey Kozitsyn:

Übrigens, Sie haben die Frage nach der Terminalversion nicht beantwortet.

Was hat die Terminalversion überhaupt damit zu tun? Neue Daten sind entweder da oder nicht. Und keine Version wird sie speichern, wenn sie nicht vom Server stammen.
Der Indikator startet einfach, bevor die neuen Daten eintreffen. Alternativ können Sie die Prüfungen in OnCalculate verschieben , das ausgelöst wird, wenn ein neuer Tick empfangen wird.

 
Konstantin Nikitin:

Alternativ können Sie die Prüfungen in OnCalculate verschieben , das ausgelöst wird, wenn ein neuer Tick empfangen wird.

es wurde bereits mehrfach vorgeschlagen, und auch die Verwaltung hat

im Indikator wirdOnCalculate() beim Start des Indikators gestartet, aber das zweite Mal wird OnCalculate() beim Erhalt des Ticks gestartet - hier ist es notwendig, den Timer zu starten und neue OHLC-Daten herunterzuladen

 
Igor Makanu:

es wurde ihm mehrmals angeboten, ebenso wie der Verwaltung

der Indikator startet OnCalculate() beim Start des Indikators, aber beim zweiten Mal wird OnCalculate() beim Tick-Empfang gestartet - hier müssen Sie den Timer aktivieren und neue OHLC-Daten herunterladen

Schauen Sie sich meinen letzten veröffentlichten Code an. Es geht nicht um Timer, alles wurde bereits in OnCalculate() verschoben. Beim Starten des Terminals funktioniert es immer noch nicht.

 
//--- Проверяем связь с сервером
if(firstrun)
{
 firstrun=false;                // первый запуск индикатора
 return(0);
}   
if(!IsConnected())                              // Если не удалось установить связь с сервером
     {
      //--- Сбрасываем флаг соединения с сервером
      _isConnected=false;
      //--- Выходим
      return( 0 );
     }
Ich würde auch GetTickCount() überprüfen, um dem Terminal Zeit zu geben, um zu laden, Graphen zu erzeugen und die Kommunikation mit dem Server herzustellen; Sie müssen auch den Neustart des Terminals verfolgen, ich weiß nicht, wie man es verfolgt, aber Sie müssen Zeit geben
 
Alexey Kozitsyn:

Schauen Sie sich den letzten von mir veröffentlichten Code an. Es ist nicht mehr der Timer, alles ist bereits zu OnCalculate() verschoben. Beim Starten des Terminals funktioniert es immer noch nicht.

Überspringen Sie den ersten Durchgang beim Starten

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static bool res = false;
   if( !res )
     {
      res = true;
      return( rates_total );
     }
   /* работаем */
   return( rates_total );
  }
 
Konstantin Nikitin:

Überspringen Sie den ersten Durchgang beim Start

Lesen Sie Punkt 1.