Bitte erklären Sie mir, was an dieser Funktion falsch sein könnte? - Seite 4

 
Alexey Viktorov:

Vladimir, das Problem tritt im Testgerät nicht auf... Wie kommt es, dass es ein solches Problem gibt? Oder weil es nur einen einzigen Expert Advisor im Testprogramm gibt?

Ich habe auch in der SD vorgeschlagen, dass die einzige Änderung darin besteht, den zweiten EA auf ein anderes Paar zu setzen...

Die gesamte Handelsumgebung im Testgerät wird im Voraus vorbereitet. Alles ist auf einem Teller. Keine Sorge. Die reale Handelsumgebung ist anders, und bei nicht standardmäßigem Verhalten (Arbeit mit einem anderen Zeitrahmen und/oder einem anderen Symbol) müssen wir uns Gedanken über die Relevanz der Handelsumgebung machen.
 
Karputov Vladimir:
In einem Terminal (auf dem M15-Zeitrahmen gab es EAs) funktionierte es bei einem Symbol nicht - ich bin mir zu 99% sicher, dass das Problem darin liegt, dass man bei der Verwendung eines anderen Zeitrahmens die ganze Zeit an der Historie "ruckeln" muss. Ich denke, es ist besser, dies über CopyTime() zu tun.
Und CopyRates() ruckelt in der Geschichte. Es gibt Zeit in der Struktur...
 
Karputov Vladimir:

Dies ist kein Fehler. Sie arbeiten nach dem Zeitplan eines anderen. In einem solchen Fall müssen Sie sich selbst um die Daten eines anderen Zeitraums kümmern, um sicherzustellen, dass sie auf dem neuesten Stand sind.

Ich persönlich sehe keine Alternativen.

Es ist keine Tatsache, dass wir nicht wissen, wieSERIES_LASTBAR_DATE funktioniert. Es kann sein, dass keine Aktualisierung erforderlich ist, weil die Zeit des letzten Balkens mit TimeCurrent() des angegebenen Symbols berechnet werden kann. Wir müssen die Entwickler fragen.

Aber bis jetzt ist eine klare, unbestreitbare Tatsache, dass, wenn zwei Variablen auf wahr gesetzt werden, diese Variablen zusammen (bei der Überprüfung von &&) auch wahr ergeben.

 

Das Problem, dass die anderen Tools/TF-Cache abfallen, besteht.

Das Prüfen auf Fehler und das Warten auf das Laden in der Schleife hilft nicht immer. Wir haben mit dem Service Desk gesprochen, aber MQ hat keine Fortschritte gemacht, nur einen Hinweis gegeben:

Support Team 2016.02.29 11:45

Der Verdacht liegt nahe, dass die historischen Daten durch Timeout entladen werden.

Es gibt 2 Lösungen:

1. häufiger als einmal alle 3 Minuten auf die Daten zugreifen

2. einige sehr einfache Indikatoren auf Daten anwenden. Volumen, zum Beispiel. Es findet keine Berechnung statt, nur ein Puffer ist belegt. Die Verfügbarkeit des Indikators sorgt dafür, dass der historische Cache unabhängig von der Zugriffshäufigkeit im Speicher bleibt.

Der 2. Tipp funktioniert nicht, die Indikatoren werden ständig aufgerufen, aber irgendwann versagt der Cache und es wird unmöglich, Daten zu erhalten.

Andrey Khatimlianskii2016.03.18 13:41

Ich habe das Problem mit dieser Krücke gelöst - ich rufe diesen Code alle 150 Sekunden für alle beteiligten Instrumente/FTs auf:

bool CheckTimeSeries( string symbol, ENUM_TIMEFRAMES period )
{
   double array[];
   if ( CopyClose( symbol, period, 1, 1, array ) <= 0 )
   {
                int err = GetLastError();
                Print( " * Can't refresh timeseries (", symbol, ", ", period, ")! ERROR #", err, "!!!" );
                return(false);
   }
   return(true);
}

Funktioniert schnell genug, Fehler 4806 scheint nach diesem Update zu verschwinden.

 

Bitte äußern Sie sich zu einem weiteren Missverständnis.

Bars

Gibt die Anzahl der Balken in der Historie nach dem entsprechenden Periodensymbol zurück. Es gibt 2 Varianten der Funktion.


Nur die zweite Option ist von Interesse.

Abfrage der Anzahl der Balken in einem bestimmten Intervall
int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time        // по какую дату
   );

Text des Expertenberaters

/*******************Expert initialization function*******************/
int OnInit()
{
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
  datetime dtarr[], date = D'2016.06.22';
  ArraySetAsSeries(dtarr, true);
  CopyTime(_Symbol, PERIOD_D1, 0, 5, dtarr);
  Print(dtarr[0]);
  Print(" ", Bars(_Symbol, PERIOD_D1, date, dtarr[0]));
  Print(" ", Bars(_Symbol, PERIOD_D1, date+1, dtarr[0]));
   
}/*******************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
}/*******************************************************************/

Ich verstehe, dass die Zeit 00:00:00 zum Tag gehört, genau wie die Zeit 00:00:01

Aber ... Die vorgeschlagenen Drucke sind damit nicht einverstanden.

2016.06.24 22:18:56.450 TestTime (EURUSD,M15)    2
2016.06.24 22:18:56.450 TestTime (EURUSD,M15)    3
2016.06.24 22:18:56.450 TestTime (EURUSD,M15)   2016.06.24 00:00:00

Es stellt sich heraus, dass es zwischen 2016.06.22 00:00:00 und 2016.06.24 00:00:00 drei Tagesbalken gibt und zwischen 2016.06.22 00:01 und 2016.06.24 00:00:00 nur zwei...

Oder habe ich etwas falsch verstanden?

Dateien:
TestTime.mq5  2 kb
 

Und wenn Sie eine Sekunde zur Zeit des aktuellen Taktes hinzufügen

  Print(" ", Bars(_Symbol, PERIOD_D1, date, dtarr[0]+1));
  Print(" ", Bars(_Symbol, PERIOD_D1, date+1, dtarr[0]+1));

erhalten Sie Folgendes

2016.06.24 22:26:48.602 TestTime (EURUSD,M15)    3
2016.06.24 22:26:48.602 TestTime (EURUSD,M15)    4
2016.06.24 22:26:48.602 TestTime (EURUSD,M15)   2016.06.24 00:00:00

Die Zeit 2016.06.24 00:00:01 scheint zum nächsten Takt zu gehören oder was?

 
Die obere Zeitgrenze ist nicht in dem Intervall enthalten, in dem die Anzahl der Takte ermittelt wird.
 
Dmitry Fedoseev:
Die obere Zeitgrenze wird nicht in das Intervall einbezogen, in dem die Anzahl der Takte ermittelt wird.

Dimitri, ist das nicht seltsam? Ein neuer Balken ist aufgetaucht, aber wir werden ihn noch nicht zählen.

Ist das nicht der Grund für dieses Verhalten von SeriesInfoInteger(_Symbol, PERIOD_D1, SERIES_LASTBAR_DATE); ? Neuer Balken erschienen, tick available code wird ausgeführt, aber die Zeit wird noch nicht berücksichtigt.

 

Nun, der Schlagzeuger hat keine Luft mehr... Und er wird völlig ignoriert...?

Vladimir, kannst du wenigstens diese Frage beantworten?

Alexey Viktorov:
Zieht CopyRates() die Story? Es gibt Zeit in der Struktur...?
 
Alexey Viktorov:

Nun, der Buhmann hat die Luft rausgelassen... Und er wurde völlig ignoriert...

Vladimir, kannst du wenigstens diese Frage beantworten?

Sagen Sie uns lieber, was man Ihnen am Service Desk geraten hat - haben Sie dort nicht weiter mit ihnen gesprochen?