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

 
trader781:

Wenn Sie Ihren Code aufgeräumt haben, wird er für Sie besser lesbar sein, ganz zu schweigen von anderen, die Ihre Logik verstehen müssen. Dort werden alle Fehler zu finden sein.

OK, ist das besser?
Löschen Sie nun unnötige gepaarte geschweifte Klammern und ordnen Sie den Rest normal in Blöcken an, und Sie werden sehen, wo Sie Fehler in der Logik haben.
 
Artyom Trishkin:
Entfernen Sie nun die zusätzlichen paarigen geschweiften Klammern und ordnen Sie den Rest normal in Blöcken an, und Sie werden sehen, wo Ihre Logik fehlerhaft ist.
Was sind die zusätzlichen?
 
trader781:
Welche davon sind überflüssig?
Sie haben viele unnötige Klammern in Ihrem Code - verwenden Sie ein Styling-Tool, und Sie werden die unnötigen leeren geschweiften Klammern sofort erkennen.
 
Artyom Trishkin:
Sie haben eine Menge unnötiger geschweifter Klammern in Ihrem Code - verarbeiten Sie den Code mit einem Styler, und Sie werden die zusätzlichen leeren gepaarten geschweiften Klammern sofort sehen.
Erledigt
Dateien:
 
trader781:
Erledigt
Ich schaue es mir später an - es wird mindestens vier Stunden dauern...
 
trader781:
Hergestellt von
1.count++; // Zählen der Ticks ab Programmstart

Besser: if(count<=20) count++; - warum weiter zählen, wenn man nur bis 21 braucht?

2.
   if(count>20) //  если количество тиков больше начинаем работу ... и дальше код эксперта
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
      return;
     }

Und hier ist der Wigwam. Dies prüft nur die Anzahl der Balken und druckt, wenncount>20, der Rest des Codes wird funktionieren, wenncount<=20.

3.

if(OrderSymbol()==Symbol() && OrderType()<2)
            continue;

Wenn Sie nur den Markt berücksichtigen müssen (und das ist es, was Sie vom weiteren Code erwarten), brauchen Sie überhaupt nichtfortzufahren.

4.

         if(y==true && (OrderType()==0)) //+-----покупка
           {
            dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));

              {
               if((dummy==true) && ((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==false))

                  PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               dummy=false;
               ExpertRemove();
              }
           }

Er schließt einen Auftrag ab und eliminiert sich selbst? Und was, wenn es noch mehr von ihnen gibt? Und es schläft eine ganze Minute lang.

Ich habe mir den obigen Code noch nicht angesehen, es gibt noch keine Möglichkeit, ihn zu testen.

 

1 ok, ich werde es korrigieren

2 das ist nicht in Ordnung, die folgenden Blöcke sollten beicount<20 nicht funktionieren

3 OK, ich werde es korrigieren

4 Ja, es handelt sich um eine Minute, aber sie sollte nur gestartet werden, wenn es keine weiteren Marktaufträge für das aktuelle Symbol gibt. Ich habe versucht, es durch ein negatives Ergebnis der Auftragsauswahl zu implementieren, deshalb sollten wir irgendwo Return setzen, aber der Return in void OnTick() sieht nicht so gut aus. Und wieder wird OrdersTotal() ein falsches Ergebnis liefern, wenn wir viele Aufträge für alle Symbole haben.

 
trader781:

2 nicht OK ist, sollten die folgenden Blöcke nicht funktionieren, wenncount<20

Dann müssen wir nach dem Block else return hinzufügen;

4 Ja, es handelt sich um eine Minute, aber sie sollte nur gestartet werden, wenn keine weiteren Marktaufträge für das aktuelle Symbol vorliegen. Ich habe versucht, es durch ein negatives Ergebnis der Auftragsauswahl zu implementieren, deshalb sollten wir irgendwo Return setzen, während der Return in void OnTick() nicht sehr gut aussieht. Und auch hier wird OrdersTotal() das falsche Ergebnis liefern, wenn wir viele Aufträge über alle Symbole haben.

Warum brauchen wir drei Töne?

Nun, wir können alles in zwei Schritten machen: in der ersten Schleife schließen Sie die Aufträge und in der nächsten berechnen Sie alle Marktaufträge neu, um zu prüfen, ob noch welche übrig sind, und wenn es keine gibt, spielen die Fanfaren.

Aber ich verstehe immer noch nicht, was der Trick mit der Musik ist, nachdem die Bestellungen abgeschlossen sind. Nun, man kann einen Ausdruck in die Zeitschrift machen oder eine Nachricht an die Post oder eine Benachrichtigung an das Smartphone senden, aber warum sollte man einen EA in eine Spieluhr verwandeln?
 
Vitalie Postolache:

Dann sollten Sie nach dem else return-Block ein return hinzufügen;

Warum brauchen wir die dreifache Lautstärke?

Sie können aber alles in zwei Schritten erledigen: In der ersten Schleife schließen Sie die Aufträge, und in der nächsten berechnen Sie alle Marktaufträge neu, um zu prüfen, ob es noch nicht geschlossene Aufträge gibt, und wenn es keine gibt, ertönt die Fanfare.

Ich verstehe immer noch nicht, was der Trick mit der Musik ist, wenn die Bestellungen abgeschlossen sind. Nun, wir können es in die Zeitschrift drucken, eine Nachricht an die Post schicken oder auf dem Smartphone benachrichtigen, aber warum sollten wir unseren EA in eine Spieluhr verwandeln?

Wie trennen Sie die Zyklen?

Wie binde ich den Ton an die letzte geschlossene Order? Denn wenn es keine Orders gibt, würde der Expert Advisor keinen Ton auslösen.

Und noch etwas: Ich bin mit der Musik vorerst zufrieden

 
trader781:

Wie kann ich die Zyklen trennen?

Wie bindet man den Ton an den letzten geschlossenen? denn wenn es keine Aufträge gibt, wird der Expert Advisor nicht funktionieren

Und schließlich bin ich im Moment mit der Musik zufrieden.

Was meinen Sie mit "getrennt"? Wir brauchen nichts zu trennen, sondern nur zwei Schleifen (sie sind fast identisch), von denen eine OrderClose() und die andere einen Auftragszähler enthält. Das Auswahlkriterium für den Auftrag ist das gleiche. Wenn der Zähler=0 ist, sind alle Aufträge abgeschlossen und wir können Musik spielen.

Ich habe auch festgestellt, dass die Bedingung

         if(Uslovie1==true) //Bid+ma6
           {
            if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
              {
                 {y=true;}
              }
           }

Sie scheint nicht mit einer bestimmten Reihenfolge verbunden zu sein, wozu dient sie also in der Schleife?

Ich würde das vor der abschließenden Schleife überprüfen.

Grund der Beschwerde: