Fehler, Irrtümer, Fragen - Seite 1234

 
Tapochun:
Dann diese Frage. Wenn der Indikator auf M15 läuft. Eine neue Kerze wird gebildet. Sollten bei der Anforderung von Daten für M15 und M30 diese gleichzeitig verfügbar sein?

Ja.

Nach der Erstellung eines Indikators(der in den normalen Verarbeitungszyklus aufgenommen wurde) und dem Eintritt in den normalen Tick-Verarbeitungszyklus (Ontik) sind die Daten mit hoher Wahrscheinlichkeit verfügbar. Aber vergessen Sie nicht, dass es keine Garantie gibt, weil die Geschichte möglicherweise für andere Symbole heruntergeladen wird.

Überprüfen Sie also immer die Ergebnisse von Indikatordatenanforderungen. Wenn Sie Daten in der Ontika abfragen und diese nicht verfügbar sind, verlassen Sie diese sofort, um beim nächsten Tick nachzusehen.

Machen Sie nicht den typischen Fehler "alles ist immer bereit, ich denke nicht über technische Prozesse der Datenlieferung und Berechnung nach, das sollte mich nicht betreffen, ich bin immer glücklich". Implementieren Sie immer eine träge Initialisierungslogik und Datenkontrolle.

Stellen Sie sicher, dass Sie Ihre Programme auf einer leeren Kartenbasis testen. In der Regel reicht es aus, das Terminal mit einer manuell gelöschten Verlaufsdatenbank neu zu starten, um eine Vielzahl von Zugriffsfehlern durch falschen Index oder Division durch Null zu erhalten.

Wenn Sie einen m15-Balken auf einem Symbol haben, dann gibt es definitiv einen m30-Balken auf demselben Symbol.

 
Renat:

Ja.

Eine andere Frage. Verhält sich die Funktion BarsCalculated() gleich, wenn sie von einem EA und einem Indikator aufgerufen wird?
 
Tapochun:
Eine andere Frage. Verhält sich die Funktion BarsCalculated() gleich, wenn sie von einem EA und einem Indikator aufgerufen wird?
Was ist daran falsch?
 
Renat:
Was ist los?

Ich habe nur mit verschiedenen Informationen experimentiert. So wie ich es verstehe, sollten sie auf die gleiche Weise funktionieren. Aber das tun sie nicht. Da heute Sonntag ist, gibt es keine Möglichkeit, die aktuelle Zeit zu überprüfen. Aber auch im Tester funktionieren sie anders. Hier sind zwei Codebeispiele. Der Kern der Sache ist folgendermaßen. Wir versuchen, Daten von sieben TFs zu erhalten. Wir starten ihn (sowohl den Berater als auch den Indikator) nicht mit der wichtigsten TF. Zum Beispiel von М15. Wenn der aktuelle Tick die Bildung einer neuen Kerze und den Empfang von Daten zu dieser Kerze über BarsCalculated() synchronisiert hat - dann erfassen wir die Anzahl der berechneten Bars mit BarsCalculated() und die Zeit der aktuellen Kerze. Siehe Einzelheiten im Code.

Der Indikator.

Erstes Häkchen.

Für jede TF wird eine neue Kerze gebildet. Aber auf TF M1, M5, M15 gibt BarsCalculated() 0 zurück, aber auf TF M30, H1, H4, D1 gibt es -1 zurück. Hier stellt sich die Frage, warum die Funktion anders funktioniert. Dementsprechendgibt BarsCalculated() für den TF M1, M5, M15, M30 denWert 0 und für den TF H1, H4, D1 den Wert -1 zurück, wenn wir es auf den TF M30 anwenden.Daraus können wir schließen, dass für die höhere TF die Daten zunächst nicht verfügbar sind.

Das zweite Häkchen.

Gemäß der Codelogik, Synchronisierung, d.h. Schreiben von Parametern (alles gemäß den Protokollen der Proben);

Das dritte und das nächste Häkchen.

Wir erhalten einen neuen Balken durch den Indikator für TF M30, H1, H4, D1. Allerdings scheinen die Daten bereits erhoben worden zu sein. Und es stellt sich heraus, dass die Zahl auf TF, die größer ist als die aktuelle, um 1 größer ist. Sehr seltsames Verhalten. In der Zukunft (im aktuellen Beispiel) werden wir nicht in der Lage sein, eine Synchronisation zu erreichen.

Sachverständiger Berater.

Das erste Häkchen.

Die Synchronisierung wird sofort durchgeführt. Der neue Wert von BarsCalculated() wird synchron mit der Bildung einer neuen Kerze empfangen.

Zweiter und weiterer Tick.

Logisches Verhalten der Funktion. Alles ist synchronisiert.

Führen Sie beide Beispiele im Tester durch, dann werden Sie es selbst sehen. Das aktuelle Verhalten der Funktion ist für Expert Advisors und Indikatoren unterschiedlich. Auch die von den Indikatoren gelieferten Daten sind für höhere Zeiträume verzögert. Daher denke ich, dassbei der Anforderung von Daten für M15 und M30 diese nicht gleichzeitig verfügbar sein werden. Die aktuellen Daten sind es definitiv nicht!

Wenn ich mich irre, geben Sie bitte an, wie man die Indikatordaten aus der älteren TF korrekt erhält. Ich danke Ihnen.

 
//+------------------------------------------------------------------+
//| Search position of an element in a sorted list                   |
//+------------------------------------------------------------------+
CObject *CList::QuickSearch(CObject *element)
  {
   int      i,j,m;
   CObject *t_node=NULL;
//--- check
   if(m_data_total==0)
      return(NULL);
//--- check the pointer is not needed
   i=0;
   j=m_data_total;
   while(j>=i)
     {
      //--- ">>1" is quick division by 2
      m=(j+i)>>1;
      if(m<0 || m>=m_data_total)
         break;
      t_node=GetNodeAtIndex(m);
      if(t_node.Compare(element,m_sort_mode)==0)
         break;
      if(t_node.Compare(element,m_sort_mode)>0)
         j=m-1;
      else
         i=m+1;
      t_node=NULL;
     }
//--- result
   return(t_node);
  }
Standard-CList-Bibliothek
Warum zweimalCompare anrufen? Dies kann eine teure Operation sein (wenn wir die Gleichheit von großen Objekten und nicht die Gleichwertigkeit einiger Felder prüfen müssen).
Man kann einfach das Ergebnis nach dem ersten Aufruf vonCompare speichern.
 
Renat:
Soll ich hier auf Ihre Antwort warten? Oder soll ich es zum Service bringen?
 

Woher kommen diese Symbole am unteren Rand des Diagramms?

Es gibt keinen Indikator auf dem Diagramm, aber die Symbole erscheinen jedes Mal. Ich bin es leid, sie zu löschen. Wie kann ich diesen Mist abstellen? Ich kann in den Terminaleinstellungen nichts darüber finden.

 
meat:

Woher kommen diese Symbole am unteren Rand des Diagramms?

Es gibt keinen Indikator auf dem Diagramm, aber die Icons erscheinen jedes Mal. Ich bin es leid, sie zu löschen. Wie kann ich diesen Mist abstellen? Ich kann in den Terminaleinstellungen nichts dazu finden.

Es handelt sich um Ereignisse auf der Registerkarte "Kalender". Zum Löschen: Klicken Sie mit der rechten Maustaste auf die Registerkarte "Kalender" -> "In Diagrammen anzeigen" -> "Alle Ereignisse löschen".

P. S. Und deaktivieren Sie die Option "Automatische Aktualisierung". Jetzt werden neue Kalenderereignisse nicht mehr in der Tabelle angezeigt.

 
crOss:
Nehmen Sie einen beliebigen Expert Advisor (aus den MetaQuotes-Beispielen), führen Sie ihn unter Build 975 für einen bestimmten Zeitraum und mit denselben Parametern aus,
Erhalten Sie die Ergebnisse, d.h. die Renditekurve und die Tabelle der Geschäfte.


Führen Sie nun denselben EA unter Build 1010 für denselben Zeitraum und mit denselben Parametern aus, erhalten Sie völlig andere Ergebnisse...

P.S. Metatester ist 32-bit

Welches der Ergebnisse ist richtig? In der 975er Version oder in der 1010er Version?
 

Hallo zusammen) Bitte helfen Sie mir, den Timer zu starten:

int OnInit()

{

bool setTimer=EventSetTimer(60);

Print("setTimer");

}

void OnTimer()

{

Print("Die Zeit vergeht");

}

Frage: Warum funktioniert es nicht? Das hat mich umgehauen...(((.