Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 441
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Können Sie mir bitte sagen, was ich falsch mache?
Ich muss berechnen, wie viele Balken seit dem letzten Überschreiten des MA durch den Kurs vergangen sind - ohne den Null-Balken.
if(Bars>1400)
{
int Stop;
double MATcycle;
for(int i=0;i!=1000 || Stop!=1; i++)
{
MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
if(MATcycle<High[i+1] && MATcycle>Low[i+1])
{
Stop=1;
Print("MATcycle=",MATcycle," i=",i);
}
else return (0);
}
Können Sie mir bitte sagen, was ich falsch mache?
Sie müssen - zählen, wie viele Balken seit dem letzten Überschreiten des MA vergangen sind - den Null-Balken nicht mitgerechnet.
if(Bars>1400)
{
int Stop;
double MATcycle;
for(int i=0;i<1000 || Stop==1; i++)
{
MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
if(MATcycle<High[i+1] && MATcycle>Low[i+1])
{
Stop=1;
Print("MATcycle=",MATcycle," i=",i);
}
else return (0);
}
Soweit ich das verstanden habe, wird der Zyklus sofort verlassen, sobald Sie die Kreuzung identifiziert und Stop=1 gesetzt haben. Ok, dann müssen Sie noch weiter gehen und sich die Nummer der Kerze merken, bei der der Übergang stattgefunden hat. D.h.
Es ist einfacher, sie selbst zu schreiben:
Das heißt, Sie haben die Nummer der Kerze ermittelt. Wenn die Zahl = 2 und berücksichtigen Sie nicht die aktuelle, dann seit der Kreuzung eine Kerze gebildet wurde (oder interpretieren Sie es, wie Sie wollen).
Soweit ich das verstanden habe, wird der Zyklus sofort verlassen, sobald Sie den Crossover identifiziert und Stop=1 gesetzt haben. OK, dann müssen Sie weiter gehen und sich die Nummer der Kerze merken, bei der der Crossover aufgetreten ist. D.h.
Es ist einfacher, sie selbst zu schreiben:
Das heißt, Sie haben die Nummer der Kerze ermittelt. Wenn die Zahl = 2 und ignorieren Sie die aktuelle, dann eine Kerze hat sich seit der Kreuzung (gut, oder interpretieren Sie es, wie Sie wollen).
Danke, so hat es bei mir funktioniert.
int Stop=0;
if(Bars>1400)
{
double MATcycle;
for(int i=1;(i!=1000 || Stop==0); i++)
{
MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
if(MATcycle<=High[i] && MATcycle>=Low[i])
{
Print("MATcycle=",MATcycle," i=",i);
Stop=i;
break;
}
}
}
Können Sie mir sagen, ob dies eine realistische Testerfigur ist? Und ist das ein gutes oder schlechtes Ergebnis für ein Jahr mit einem 3.000-Dollar-Depo?
Danke, so hat es bei mir auch funktioniert.
int Stop=0;
if(Bars>1400)
{
double MATcycle;
for(int i=1;(i!=1000 || Stop==0); i++)
{
MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
if(MATcycle<=High[i] && MATcycle>=Low[i])
{
Print("MATcycle=",MATcycle," i=",i);
Stop=i;
break;
}
}
}
Sie sollten es nicht so schreiben, denn wenn es während der letzten 1000 Takte keinen Crossover gab, wird erstens die Schleife fortgesetzt, und zweitens kann es zu einer Schleife/einem Fehler kommen, denn wenn die Geschichte endet und es keinen Crossover gibt, gibt es keinen Ausstieg aus der Schleife, weil Stop = 0. Es ist besser, es so zu schreiben, wie ich es oben erwähnt habe.
Sie sollten es nicht so schreiben, denn wenn es während der letzten 1000 Takte keinen Crossover gab, wird erstens der Zyklus fortgesetzt und zweitens kann es zu einer Schleife/Fehler kommen, denn wenn die Geschichte endet und kein Crossover auftritt, gibt es keinen Ausstieg aus dem Zyklus, weil Stop = 0. Es ist besser, es so zu schreiben, wie ich es oben erwähnt habe.
Funktioniert das "oder"-Zeichen nicht - die Bedingung besagt, dass entweder 1000 Balken erreicht oder das Programm beendet wird, sobald das gewünschte Ergebnis gefunden wird. Oder wird es vor 1000 Balken vorbei sein, wenn das gewünschte Ergebnis, d.h. das Kreuzen des MA?
|| bedeutet, dass die Schleife wiederholt wird, wenn mindestens eine der Bedingungen in den Klammern wahr ist, d. h. selbst wenn i >= 1000, aber stop = 0 ist, wird die Schleife fortgesetzt, i wird weiter erhöht, was zu einem falschen MA-Wert führt (falls es einen Ausreißer in der Historie gibt). Und der Break-Operator ist für die Beendigung der Schleife zuständig, wenn das gewünschte Ergebnis gefunden wurde;
Hallo 2015.09.19_02:13AM MSC. In der Funktion ArrayResize() schreibt der Compiler ohnehin
gegenüber der Größe des Arrays - Komma erwartet, ob Sie int schreiben oder nicht. Wenn Sie nicht int schreiben, heißt es: "-.
Ich habe es ohne Schrift geändert. Und ich habe & Referenz und eckige Klammern entfernt - es hat funktioniert!
Warnungen: wenn es normal geschrieben wurde, -- Compiler schrieb: versteckt Bezeichner
Erklärung auf globaler Ebene. Und als ich die Bezeichner-Deklaration auf globaler Ebene entfernte, - schrieb
schreibt er: "Fehler, nicht deklarierter Bezeichner. Und ich habe die Arrays High[] und Low[] in HighP[] und LowP[] geändert. Nicht
geholfen. Der Compiler schreibt dasselbe. 02:27 MSC. Ich hänge eine Screenshot-Datei an.
Hallo 2015.09.19_02:13AM MSC. In der Funktion ArrayResize() schreibt der Compiler ohnehin
gegenüber der Größe des Arrays - Komma erwartet, ob Sie int schreiben oder nicht. Wenn Sie nicht int schreiben, heißt es: "-.
"ohne Typ. Und ich habe & Referenz und eckige Klammern entfernt - das hat geholfen!
Warnungen: wenn es normal geschrieben wurde, -- Compiler schrieb: versteckt Bezeichner
Erklärung auf globaler Ebene. Und als ich die Bezeichner-Deklaration auf globaler Ebene entfernte, - schrieb
schreibt er: "Fehler, nicht deklarierter Bezeichner. Und ich habe die Arrays High[] und Low[] in HighP[] und LowP[] geändert. Nicht
geholfen. Der Compiler schreibt dasselbe. 02:27 MSC. Ich hänge die Screenshot-Datei an.
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Fragen von Anfängern
Karputov Vladimir, 2015.09.17 18:46