[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 656

 
artmedia70:
Was kann einen Stapelüberlauf verursachen? Wenn Sie eine Position mit einem großen Take eröffnen (der Take wird aus der Volatilität berechnet und mit 100 multipliziert, die Größe ist 41*100), dann wird ein Stack Overflow in das Log geschrieben und... ... nehmen Sie es einfach. Es werden keine weiteren Positionen eröffnet, bis diese geschlossen wird, und diese wird natürlich nicht geschlossen, weil der riesige TP... Und der EA arbeitet überhaupt nicht korrekt, denn er sollte alle Positionen schließen, wenn der vordefinierte Gesamtgewinn der offenen Positionen erreicht ist... Aber das passiert nicht, obwohl diese eine Position seit langem riesige Gewinne erzielt hat, etwa zweitausend Punkte... Wie bekämpfe ich sie? Man kann sich nicht dagegen absichern, dass alle offenen Positionen den Stapel überlaufen lassen und alles auf den Kopf gestellt wird...


der Stapel kann nicht einfach mit einer Zahl überlaufen, die außerhalb des Typbereichs liegt - es wird ein weiterer Fehler auftreten

Daten, die an eine Funktion übergeben werden, oder ein rekursiver Funktionsaufruf ohne Beendigung können den Stack überlaufen lassen.

start() ist auch eine Funktion - vielleicht haben Sie dort eine Menge Variablen.

der Stack ist ein Speicherbereich, in dem Zwischenwerte (lokale Variablen) einer Funktion gespeichert werden; Sie könnten den Stack selbst zerstören, wenn Sie dynamische Arrays verwenden und den Array-Bereich nicht korrekt überprüft haben, d. h., Sie schreiben Daten nicht in ein Array, sondern in einen Speicherbereich, der direkt nach dem Array kommt

Versuchen Sie, einige der Arrays in globale Variablen zu verschieben - setzen Sie sie an den oberen Rand der Tafel

ZS: zumindest ist es in allen Programmiersprachen gleich - ich glaube, in mql ist es auch so

 
IgorM:


der Stapel kann nicht einfach mit einer Zahl überlaufen, die außerhalb des Typbereichs liegt - es wird ein weiterer Fehler auftreten

Daten, die an eine Funktion übergeben werden, oder ein rekursiver Funktionsaufruf ohne Beendigung können den Stack überlaufen lassen.

start() ist auch eine Funktion - vielleicht haben Sie dort eine Menge Variablen.

der Stack ist ein Speicherbereich, in dem Zwischenwerte (lokale Variablen) einer Funktion gespeichert werden; Sie könnten den Stack selbst aufbrechen, wenn Sie dynamische Arrays verwenden und den Array-Bereich nicht korrekt überprüft haben, d. h., Sie schreiben Daten nicht in ein Array, sondern in einen Speicherbereich, der direkt nach dem Array kommt

Versuchen Sie, einige der Arrays in globale Variablen zu verschieben - setzen Sie sie an den oberen Rand der Tafel

Lf: zumindest ist es in allen Programmiersprachen gleich - ich denke, es ist auch in mql gleich

Igor, du weißt, dass ich die Verwendung von Arrays bisher vermieden habe... Ich habe nur ein paar Arrays in meinem Code - ein Array der Aufträge vor dem Tick und ein Array der Aufträge nach dem Tick. Ich habe sie im Bereich der globalen Variablen definiert. Das Komische daran ist, dass ich den Code zum Öffnen dieser Positionen an eine andere Stelle im EA verschoben habe und der Fehler verschwand. Es sieht so aus, als gäbe es einen rekursiven Aufruf zum Öffnen von Aufträgen, obwohl ich mich nicht wirklich darum gekümmert habe. Ich habe einfach beschlossen, dass es nicht angemessen wäre, die Eröffnung unmittelbar nach dem Schließen aller Positionen in den Code zu setzen, um zu prüfen, ob der Gesamtgewinn erreicht wurde und alle Positionen geschlossen wurden... Ich habe es vermasselt... :)
 
artmedia70:
Igor, du weißt, dass ich die Verwendung von Arrays bisher vermieden habe... Ich habe nur ein paar Arrays in meinem Code - ein Array der Aufträge vor dem Tick und ein Array der Aufträge nach dem Tick. Ich habe sie im Bereich der globalen Variablen definiert. Das Komische daran ist, dass ich den Code zum Öffnen dieser Positionen an eine andere Stelle im EA verschoben habe und der Fehler verschwand. Es sieht so aus, als gäbe es einen rekursiven Aufruf zum Öffnen von Aufträgen, obwohl ich mich nicht wirklich darum gekümmert habe. Ich habe einfach beschlossen, dass es nicht angemessen wäre, die Eröffnung unmittelbar nach dem Schließen aller Positionen in den Code zu setzen, um zu prüfen, ob der Gesamtgewinn erreicht wurde und alle Positionen geschlossen wurden... Ich habe es vermasselt... :)

Ich habe eine Vorlage für die Erstellung eines EA - wenn eine Bestellung platziert wird, wird die Flagge einer solchen Bestellung sofort gesetzt und danach, vor dem Öffnen einer neuen Bestellung dieses Typs, ich immer die Flagge überprüfen - ob die Bestellung vorhanden ist, aber ich schreibe EAs mit nur einer Bestellung
 
IgorM:

Ich habe vor langer Zeit eine Vorlage für die Erstellung eines EA - wenn ich eine Bestellung, ich sofort ein Zeichen (Flag), dass eine solche Bestellung existiert, und dann vor dem Öffnen einer neuen Bestellung dieser Art, die ich immer überprüfen Sie die Flagge - ob eine solche Bestellung existiert, aber ich schreibe EAs mit nur einer Bestellung
Nun, ich, und ich denke auch alle anderen, haben ihre eigenen Entwicklungen, Vorlagen und andere Goodies. Das ist nicht der Punkt. Ich kämpfe immer noch mit Drawdowns und probiere verschiedene Methoden, Funktionen und Ähnliches aus. Wenn ich strikt mit dem Trend arbeite, kann ich nicht verstehen, wie man eine Trenderschöpfung erkennen kann, wenn auf einem, dem älteren TF, der Trend bereits in eine Flaute übergegangen ist, während er auf dem jüngeren TF noch vorhanden ist, sich aber dem Ende zuneigt. Bei der Eröffnung einer Position in einer niedrigen Ordnung ist die Wahrscheinlichkeit hoch, dass sie einen Drawdown verursacht und nicht rechtzeitig geschlossen werden kann. Ich versuche jetzt, mit 4-Stunden-Charts zu arbeiten, ausgehend vom 4-Stunden-Chart, wo wir die Richtung festlegen und nur in dieser Richtung bei allen Tiefstständen arbeiten. Den Zeitpunkt des Übergangs vom Trend zum Flat habe ich mehr oder weniger identifiziert, wir werden uns die Ergebnisse ansehen.
 
Craft:


Ja, ich habe "0", aber was soll ich tun? Ich kann es nicht tun, beide Möglichkeiten (ich habe sogar versucht, gleiche Perioden), ich habe versucht, beide Print("NormalizeDouble(c1b_1..."), aber ich bekam Nullen (nur c1b[i] zeigt den Wert, alle anderen einschließlich c1s[i] sind Nullen), kann mir helfen, eine von ihnen zu einem Arbeitszustand zu bringen oder teilen Sie einen Hinweis, wenn Sie irgendwelche Fehler bemerken?

Neu:

Alt:

Ganzes:


Yuri, in Zukunft, wenn Code mindestens zweimal wiederholt wird, sollte er einer Methode zugewiesen werden, und Sie brauchen nicht Haufen von Arrays, die den Code durcheinander bringen.
Hier ist eine Methode für Sie:

//+------------------------------------------------------------------+
double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize(array,ma_period + ma_shift);
   for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+

Ich denke, mit den Parametern ist alles klar. Geben Sie die Daten ein und ändern Sie den Parameter ma_shift, um die gewünschte Verschiebung zu erhalten. Beachten Sie, dass diese Methode als Vorlage verwendet werden kann, ändern Sie einfach die Zugriffsmethoden für die Indikatoren i...(...) oder iCustom(...). Jetzt sieht Ihr Block von Handelsentscheidungen so aus, wie er sein sollte:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

Dementsprechend gibt es jetzt keinen Bedarf mehr für "alte" und "neue" Varianten, die Trades werden nach vorgegebenen Kriterien eröffnet (soweit ich verstanden habe, haben Sie ein Drei-Balken-Muster von Tops/Trögen geglättet iCC). Es gibt eine korrigierte Variante in der Datei.

Dateien:
21_2.mq4  14 kb
 

Hallo.

Können Sie mir bitte den Code geben, um die Preise seit der Eröffnung der Bestellung in das Array zu schreiben.

Wie wird jeder neue Preis dem Array hinzugefügt?

 
zelek:

Hallo.

Können Sie mir bitte den Code geben, um die Preise seit der Eröffnung der Bestellung in das Array zu schreiben.

Wie wird jeder neue Preis dem Array hinzugefügt?


Bitte formulieren Sie Ihre Frage genauer

Wenn Sie am aktuellen Preis zum Zeitpunkt der Bestellung interessiert sind, können Sie einen Aufruf in den Code einfügen, der für die Speicherung des aktuellen Preises im globalen Array verantwortlich ist und den Array-Indexzähler ändert, den Sie später von jedem Punkt im Code aus einsehen können.

 

wie kann ich die Leistung eines EA überprüfen - ich möchte nur die Code-Ausführungszeit in Millisekunden anzeigen

Wie viel besser ist die Leistung von MT5 gegenüber MT4?

 
IgorM:

wie kann ich die Leistung eines EA überprüfen - ich möchte nur die Code-Ausführungszeit in Millisekunden anzeigen

Wie viel besser ist die Leistung von MT5 gegenüber MT4?


GetTickCount würde helfen https://docs.mql4.com/ru/common/GetTickCount
 


Dank ja es ist, was ich gesucht habe, hat jemand die Geschwindigkeit der gleichen Art von Code für mt4 und mt5 gemessen?