Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1738

 
Nikolay Ivanov #:

Ihr Code druckt 0, nicht -1...

Vielleicht wird -1 irgendwo anders gedruckt, wahrscheinlich ist der gesamte Code in den Druckern...

Ja, du hast Recht, jeder Schritt ist vorgedruckt, um zu sehen, wo er "steckengeblieben" ist.

Beispiel ist falsch, sorry, der Code selbst ist groß.

Aber Konstantins Lösung hat das Problem gelöst! Wirklich vertauscht i-- und Nullprüfung überall, und jetzt die Logik funktioniert, wie es sollte, anstelle von -1 es 0 oder 1 ausgibt. (vor 0 oder -1, wobei letzteres sofort einen Fehler darstellt).

 
Nikolay Ivanov #:

Ihr Code druckt 0, nicht -1...

Es ist möglich, dass -1 an einer anderen Stelle gedruckt wird, höchstwahrscheinlich befindet sich der gesamte Code in den Druckern...

Bevor wir versuchen, das Problem zu lösen, müssen wir es identifizieren... Vergewissern Sie sich, dass er da ist, und finden Sie ihn, bevor Sie ihn lösen...

Nehmen Sie einen Stift und ein Blatt Papier. Und schreibe auf, wie die Schleife zählt. In diesem Code.

void OnStart()
  {
int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

Print(i);
  }

Überprüfung

if (i==0) break;

wird in diesem Code niemals funktionieren. Es sei denn, Sie setzen zunächst

int i=11;

einen ungeraden Wert. Wenn sie gerade ist, wird dieser Code

int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

zu

if (i==0) break;

wird einen ungeraden Wert haben.

 
Nikolay Ivanov #:

Bevor Sie versuchen, ein Problem zu lösen, müssen Sie es identifizieren... Vergewissern Sie sich, dass das Problem vorhanden ist, lokalisieren Sie es und lösen Sie es dann...

Ich verstehe, was Sie meinen.

 
Konstantin Nikitin #:

Nehmen Sie einen Stift und ein Blatt Papier. Und schreiben Sie auf, wie der Zyklus zählt. In diesem Code.

Warum sollte ich Stift und Papier nehmen, wenn die Bedingung besagt, dass der Druck =-1 ist, aber in Wirklichkeit (ich habe es überprüft) als 0 gedruckt wird, d. h. das Beispiel ist falsch angegeben. Und es ist unmöglich, eine richtige Antwort auf ein falsches Beispiel zu geben...

 
Nikolay Ivanov #:

Warum sollte ich Stift und Papier nehmen, wenn die Bedingung besagt, dass der Druck =-1 ist, aber in Wirklichkeit (ich habe es überprüft) als 0 gedruckt wird, so dass das Beispiel falsch ist. Und es ist unmöglich, eine richtige Antwort auf ein falsches Beispiel zu geben...

Null wird ab dieser Zeile gedruckt

for (i; i>0; i--)

und nicht von der Check- und Break-Ausgabe.

Im Allgemeinen ist die korrekte Art und Weise, ein Array zu übergeben, das Schreiben von

for (i; i>= 0; i--)

weil Arrays mit einem Null-Index beginnen

 
Konstantin Nikitin #:

Null wird ab dieser Zeile gedruckt

nicht von der Pausenkontrolle und dem Ausgang.

In dieser Zeile wird 0 gedruckt, für den Code, der angegeben wurde...

Print(i);

Die Frage war nicht, warum break nicht funktioniert, die Frage war, warum der Drucker -1 druckt... das ist alles. Und es spielt keine Rolle, ob der i-Start gerade oder ungerade ist, er druckt niemals -1...

 
Können Sie mir bitte sagen, wie ich Ticks oder Kerzen über einen längeren Zeitraum hinweg zählen kann? (z. B. ein Jahr).

Versucht Close[], aber der Index ergibt nicht mehr als 5000.
 
Ivan Butko #:
Können Sie mir bitte sagen, wie man Ticks oder Kerzen über einen längeren Zeitraum berechnet? (z. B. ein Jahr).

Ich habe es mit Close[] versucht, aber der Index ergibt nicht mehr als 5000.

Zecken oder Kerzen machen einen so großen Unterschied, dass es gelinde gesagt beängstigend ist...

 
Alexey Viktorov #:

Es gibt so viele Unterschiede zwischen Zecken und Kerzen, dass es schon beängstigend ist, das zu sagen...

Zum Beispiel, ein EA, wenn Sie einen beliebigen Zeitraum für sie angeben, in der Tester wird es von Ticks oder von M1 Bars gehen, jeder wird es berücksichtigen.

Aber wenn Sie einen EA, der auf die lange Geschichte in Echtzeit geht und nimmt Daten von dort, ich verstehe nicht, wie es zu organisieren. Das Terminal gibt nicht mehr als 5000 Kerzen aus.


UPD
Ich werde versuchen, dieses Ding zu benutzen, der Code ist im Netz

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
Strange. Plötzlich funktioniert es. Auch der millionste Balken wird geprüft. Habe nichts getan, Dokumentation gelesen, Tee getrunken. Ich habe es gerade noch einmal ausgeführt und es hat funktioniert. Ich hatte den ganzen Tag Fehler, obwohl ich gestern die Historie heruntergeladen und die Einstellungen geändert hatte.
Es war also auch nicht nötig, den zusätzlichen Code (oben) zu überprüfen.
MT4 ist etwas temperamentvoll. Oder vielleicht hat Forex Chif eine solche Funktion. Ich muss die Standardversion anstelle der Maklerversion verwenden.

 
Ivan Butko #:

Wenn Sie z. B. einen Expert Advisor für einen beliebigen Zeitraum angeben, wird er durch den Tester nach Ticks oder nach M1-Balken gehen, jeder wird das berücksichtigen.

Aber wenn Sie einen Expert Advisor nehmen, der im Echtzeitmodus in die lange Historie geht und Daten von dort nimmt, verstehe ich nicht, wie man das organisieren kann. Das Terminal gibt nicht mehr als 5000 Kerzen aus.


UPD
Ich werde versuchen, dieses Ding zu benutzen, der Code ist im Netz

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
Strange. Plötzlich funktioniert es. Auch der millionste Balken wird geprüft. Habe nichts getan, Dokumentation gelesen, Tee getrunken. Ich habe es gerade noch einmal ausgeführt und es hat funktioniert. Ich hatte den ganzen Tag Fehler, obwohl ich gestern die Historie heruntergeladen und die Einstellungen geändert hatte.
Es war also auch nicht nötig, den zusätzlichen Code (oben) zu überprüfen.
MT4 ist etwas temperamentvoll. Oder vielleicht hat Forex Chif eine solche Funktion. Ich muss die Standardvariante angeben, nicht die Maklervariante.

Der erste Aufruf von CopyRates() hat das Pumpen historischer Daten in Gang gesetzt (führen Sie es eine Woche lang nicht aus, und Sie werden das Gleiche noch einmal erhalten, nun, vielleicht nicht eine Woche, aber einige Zeit).
Sie müssen nur prüfen, wie viele Daten auf dem Server vorhanden sind, und die verfügbare Menge mit dem Expert Advisor vergleichen. Wenn es weniger ist als erforderlich - lassen Sie den EA bis zum nächsten Tick. Prüfen Sie beim nächsten Häkchen erneut. Wenn nach einer bestimmten Anzahl von Versuchen der erforderliche Verlauf nicht erreicht wird, sollte dieser Fehler wie erforderlich bearbeitet werden.

Grund der Beschwerde: