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

 
Vitaly Gorbunov:

Die Tatsache, dass Sie irgendwo die Anzahl der benötigten Aufträge ermittelt haben, ist gut, aber in diesem Block gehen Sie alle Aufträge noch einmal durch und überprüfen sie!

Zerlegen Sie den Code richtig und Sie werden es sofort sehen!

Sie können es natürlich noch einmal neu berechnen. Aber das macht keinen Unterschied. Der if()-Operator führt nicht "sonst" aus. Dies ist nur ein Fall, und es gab noch andere.
 
for(int h = OrdersTotal()-1; h >= 0; h--)
    {
     if(OrderSelect(h, SELECT_BY_POS))
      {
       if((cnt_OO >= 2))
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
//         break;
        }
       break;
       }
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;
     
        }}

Probieren Sie es so!

Ich sehe nichts anderes in Ihrem Code!

Werfen Sie andere Fälle, mal sehen, was dort falsch ist :)

Nach einem sorgfältigen Studium der Logik habe ich Ihren Code zurückentwickelt.

Das Ergebnis sah ungefähr so aus

if(cnt_OO>0) //Если нет ордеров то и не надо ни чего делать
{
  for(int h = OrdersTotal()-1; h >= 0; h--)
   {
    if(OrderSelect(h, SELECT_BY_POS))
     {
      if(cnt_OO==1)
         {
          //Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
         }
      else
         {
          //Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
         }
     }
   }
   
}
 

Wir können es so machen. In der Anleitung heißt es jedoch, dass, wenn die Bedingung nicht erfüllt ist, die Befehle nach der geschweiften Klammer, die den Block schließt, um die Bedingung des if()-Operators zu verarbeiten, verarbeitet werden. Das ist nicht der Fall.

Es gab noch eine weitere Panne:

     if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots))
      {
       

Wenn ich dem ersten if-Operator eine weitere Bedingung hinzufügte - die nächste - funktionierte es nicht

Ich habe zwei Vorschläge

1. Dummer Strategie-Tester. Da diese Situationen in der Debugging-Phase des Programms auftreten, muss man schon ein kompletter Idiot sein, um sie in einem echten Konto zu überprüfen. Auch auf einem Demokonto, denn es ist schwierig, die Situation des Neustarts zu reproduzieren. Die Tatsache, dass der Tester ein Idiot ist, zeigt uns, dass die Reihenfolge der Schließung von mehreren Aufträgen im MT4-Fenster oft nicht mit der realen Reihenfolge übereinstimmt, wenn die Schließung zu einem Zeitpunkt erfolgt. Dies ist deutlich zu erkennen, wenn Sie die letzten Aufträge im Programm neu berechnen. Aufgrund dieses Fehlers habe ich eine Woche lang versucht, herauszufinden, wer verrückt ist.

Die Logik der Arbeitsweise des Testers, selbst bei der Tick-Historie, ist weit entfernt vom wirklichen Leben. Das ist für meinen Algorithmus sehr wichtig.

2. als Vermutung. Eine Frage an besonders fortgeschrittene Gurus nicht nur in MQL/MT4, sondern auch an Systemspezialisten.

- Ich habe zwei identische EAs für dasselbe Paar in verschiedenen Fenstern. Wenn ich die EAs z. B. am Montag ausführe, nachdem der Computer über das Wochenende ausgeschaltet ist, beginnen beide gleichzeitig zu arbeiten, wenn der erste Tick erscheint. Ich hatte gehofft, dass zuerst der eine und dann der andere den Staat wiederherstellen würde. Wer Glück hatte, arbeitete zuerst.

In der Tat sind die Nachrichten zur Datenwiederherstellung gemischt. Mit anderen Worten: Die Programmausführung wird durch eine Bedingung, z. B. einen System-Timer, unterbrochen und dann fortgesetzt. Interessante Situationen entstehen, wenn man z. B. zu einem anderen Konto wechselt, um zu sehen, wie es läuft. Die Bedingungen für die Überprüfung des Kontos sind am Anfang des Programms und im Moment der Rückkehr zum Ausgangskonto ist das Programm in der Mitte und kümmert sich einen Dreck darum, welches Konto jetzt da ist.

Ich habe einen Ausweg gefunden - zu Beginn eines jeden Blocks überprüfe ich die Kontonummer. Ich bin mir nicht sicher, wo das sein soll.

 

Amon1953 haben Sie sich die erste Version angesehen, die ich korrigiert habe? Funktioniert sie? Genau so, wie es im if()-Handbuch steht, und es funktioniert seit vielen Jahren, wenn man es benutzt. Das Problem ist, dass Sie in Ihrem Code eine Pause in einen falschen Block gesetzt haben.

if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) müssen Sie prüfen, was den Variablen zugewiesen ist.

Zum zweiten Punkt: Da beide Eulen parallel laufen, werden die Nachrichten von beiden gemischt. Um das zu erreichen, was Sie beschreiben, müssen Sie Semaphoring zwischen den Kopien der Eule implementieren. Und es ist sehr interessant, dass etwas Seltsames passiert, wenn man das Konto wechselt. Ich würde sehr gerne OnInit und OnDeinit sehen. Höchstwahrscheinlich liegt das Problem dort.

 
Vitaly Gorbunov:

Amon1953 haben Sie sich die erste Version angesehen, die ich korrigiert habe? Funktioniert sie? Genau so, wie es im if()-Handbuch steht, und es funktioniert seit vielen Jahren, wenn man es benutzt. Das Problem ist, dass Sie in Ihrem Code eine Pause in einen falschen Block gesetzt haben.

if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) müssen Sie prüfen, was den Variablen zugewiesen ist.

Zum zweiten Punkt: Da beide Eulen parallel laufen, werden die Nachrichten von beiden gemischt. Um das zu erreichen, was Sie beschreiben, müssen Sie Semaphoring zwischen den Kopien der Eule implementieren. Und es ist sehr interessant, dass etwas Seltsames passiert, wenn man das Konto wechselt. Ich würde sehr gerne OnInit und OnDeinit sehen. Höchstwahrscheinlich liegt das Problem dort.

Ich habe es nicht überprüft, weil wir die Schleife bei der letzten Bestellung verlassen müssen (sie ist die erste in der Liste).

Ich bin kein erfahrener Programmierer und verstehe die Funktionsweise von OnInit und OnDeinit nicht ganz. Deshalb werden sie in meinem Code nicht verwendet, aber sie scheinen es zu ermöglichen, das Programm ohne Unterbrechung in der Mitte laufen zu lassen.

Ich verstehe Semaphor auch nicht, Berater sind in verschiedenen Fenstern installiert und haben verschiedene Majors

 
Wenn Sie erst vor kurzem mit dem Programmieren begonnen haben, rate ich Ihnen, die Grundlagen der Programmierung noch einmal zu studieren. Nichts für ungut, aber es ist sehr schwierig, mit Ihnen zu kommunizieren.
 
Vitaly Gorbunov:
Wenn Sie erst kürzlich mit dem Programmieren begonnen haben, rate ich Ihnen, sich noch einmal mit den Grundlagen der Programmierung zu befassen. Nichts für ungut, aber es ist sehr schwierig, mit Ihnen zu kommunizieren.
Ich danke Ihnen. Dieser Abschnitt ist für Anfänger gedacht. Auch diese Art der Kommunikation hat mir gut getan. Es ist schwierig, sowohl den EA-Algorithmus als auch den Programmcode zu schreiben (außerdem ist die Programmiersprache für mich ziemlich neu)
 
Amon1953:
Ich danke Ihnen. Dies ist ein Bereich für Anfänger. Auch diese Art der Kommunikation hat mir gut getan. Es ist schwierig, sowohl den EA-Algorithmus als auch den Programmcode zu erstellen (zumal die Programmiersprache für mich recht neu ist).
Es sieht so aus, als müssten Sie die Grundlagen verbessern! Da ich anhand Ihres Codes nicht ganz verstehe, welche Art von Logik Sie implementieren möchten, versuchen Sie, in Worten zu erklären, was Sie tun möchten. Und ich werde versuchen zu erklären, wo Sie einen Fehler haben.
 
Vitaly Gorbunov:
Sieht so aus, als müssten Sie die Basis verschärfen! Da ich anhand Ihres Codes nicht ganz verstehe, welche Logik Sie implementieren wollen, versuchen Sie, in Worten zu erklären, was Sie tun wollen. Und ich werde versuchen zu erklären, wo Sie einen Fehler machen.

Ich habe schon einmal erklärt, was ich brauche. Ich werde versuchen, die Einzelheiten zu klären.

Wenn Sie den EA neu starten, müssen Sie den vorherigen Zustand wiederherstellen, da der Algorithmus eine Kette von Aufträgen ist. Die erste Ordnung ist die Basisordnung, aus der wir die Parameter der nächsten Ordnungen in der Kette berechnen können. Zum Beispiel beträgt das Volumen der zweiten Bestellung 50 % der Basis, die dritte 75 % usw. Wenn wir einen EA neu starten, müssen wir das Volumen des Basisauftrags und des letzten Auftrags kennen, da das Volumen des nächsten Auftrags aus dem letzten Auftrag berechnet wird. Um den nächsten (vierten) Auftrag zu berechnen, müssen wir das Volumen des zuletzt geöffneten Auftrags ermitteln.

Wenn es nur einen Auftrag gibt, bedeutet dies, dass es sich um den Basisauftrag handelt, der uns in diesem Fall nicht interessiert, da er von einer anderen Einheit bearbeitet wird.

Der Algorithmus ist sehr einfach. Es funktioniert jedoch nur mit zwei if()-Operatoren.

 
Amon1953:

Ich habe schon einmal erklärt, was ich brauche. Ich werde versuchen, die Einzelheiten zu klären.

Wenn Sie den EA neu starten, müssen Sie den vorherigen Zustand wiederherstellen, da der Algorithmus eine Kette von Aufträgen ist. Die erste Ordnung ist die Basisordnung, aus der wir die Parameter der nächsten Ordnungen in der Kette berechnen können. Zum Beispiel beträgt das Volumen der zweiten Bestellung 50 % der Basis, die dritte 75 % usw. Wenn wir einen EA neu starten, müssen wir das Volumen des Basisauftrags und des letzten Auftrags kennen, da das Volumen des nächsten Auftrags aus dem letzten Auftrag berechnet wird. Um den nächsten (vierten) Auftrag zu berechnen, müssen wir das Volumen des zuletzt geöffneten Auftrags ermitteln.

Wenn es nur einen Auftrag gibt, bedeutet dies, dass es sich um den Basisauftrag handelt und wir nicht an diesem Fall interessiert sind, da er von einer anderen Einheit bearbeitet wird.

Der Algorithmus ist sehr einfach. Es funktioniert jedoch nur mit zwei if()-Operatoren.

Amon1953:

Ich habe es nicht überprüft, weil wir die Schleife bei der letzten Bestellung verlassen müssen (sie ist die erste in der Liste).

Ich bin kein erfahrener Programmierer und verstehe die Funktionsweise von OnInit und OnDeinit nicht ganz. Deshalb werden sie in meinem Code nicht verwendet, aber sie scheinen es zu ermöglichen, das Programm ohne Unterbrechung in der Mitte laufen zu lassen.

Die Expert Advisors sind in verschiedenen Fenstern installiert und haben unterschiedliche Hauptfunktionen.

Bitte lesen Sie die Dokumentation:

OnInit

Die Funktion OnInit() ist der Init-Event-Handler . Siekann vomTyp void oder intsein und hat keine Parameter:

voidOnInit();

Init-Ereignisse werden unmittelbar nach dem Laden eines Expert Advisors oder Indikators erzeugt. Die Funktion OnInit() wird zur Initialisierung verwendet. Wenn OnInit() den Rückgabewert vom Typ int hat, bedeutet ein Rückgabewert ungleich Null, dass die Initialisierung nicht erfolgreich war, und erzeugt das Ereignis Deinit mit dem DeinitialisierungsgrundREASON_INITFAILED.

Klären Sie auch die Sichtbarkeit der Variablen.

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...
Grund der Beschwerde: