Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 207

 

Hallo zusammen. Ich brauche Hilfe.

In meinem EA wird eine Reihe von Aufträgen in der im Parameter MaxOrders angegebenen Anzahl eröffnet. Nachfolgend habe ich ein Beispiel dafür angeführt, wie dies aussieht, urteilen Sie nicht nach Losen

1-Bestellung-Los=128

2-Los-Bestellung-Los=256

3-Lose-Bestellung=512

4-Ordnung-Los=1024

5-Ordnung-Los=2048

Das brauchen Sie für Ihr Prüfgerät.

MaxOrders=5, und 5 Aufträge sind offen. Das Problem ist, dass in der Broker-Tester, Lot begrenzt auf 1000 ist 4 und 5 Aufträge werden nicht öffnen, wie erforderlich.

Ich habe im Internet nach einer Möglichkeit gesucht, diesen Parameter im Strategietester zu ändern, aber ich habe nicht herausgefunden, wie man das macht.

Daher habe ich beschlossen, dieses Problem mit Hilfe der Programmierung zu lösen. Ich habe beschlossen, mehrere Aufträge für 4 Aufträge zu eröffnen und zwei zu erhalten

4-Bestellung-Los=1000

4-Ordnung-Los=24

für 5 Aufträge 3:

5-Bestellung-Los=1000

5-Bestellung-Los=1000

5-Ordnung-Los=48

aber es gibt zwei Probleme,

- wie man das MM richtig aufteilt, so dass es in Lose entsprechend der maximalen Losgröße aufgeteilt wird

- Wie kann man zusätzliche Aufträge öffnen, ohne den Auftrag zu stören, d.h. es wird mehr Aufträge geben als in maxOrders angegeben, aber die zusätzlichen Aufträge, die geöffnet werden, um das Volumen zu halten, werden nicht berücksichtigt.

 
solnce600:

Alexej! Guten Tag!

Unsere Kommunikation geht mir nicht aus dem Kopf...... und hier ist der Grund.....

Ich habe mehr als einmal Kommentare über das Fehlen von Logik in meiner Kodierung gehört.

Gestern haben Sie mir erklärt, dass es sich um Boolesche Algebra handelt. Dieses Thema ist sehr umfangreich und sehr tiefgründig.

Tatsache ist, dass ich kein Mathematiker bin und schon gar nicht ein Algebraiker.

Ich verstehe einige nicht so komplizierte mathematische Dinge.... , aber nicht auf Anhieb und komplexe Dinge nimmt mein Gehirn überhaupt nicht wahr.

Vor über sechs Monaten, bevor ich mit dem Studium des MCL-Programmierlehrbuchs begonnen habe, habe ich mich gefragt

ob ich es ohne mathematische Fähigkeiten verstehen könnte.

Aber Herr Kozlov sagte im Vorwort zu seinem Lehrbuch, dass es eigentlich viel einfacher ist, als es auf den ersten Blick aussieht.

auf den ersten Blick.

Und tatsächlich denke ich, dass ich 60-70% seines Tutorials jetzt verstehen kann (wahrscheinlich nicht zum ersten Mal) und als Ergebnis kann ich bereits etwas programmieren.

Bis gestern schien es mir, dass all die komplexen mathematischen Berechnungen (die ich nicht verstehen kann) das Programm macht, und ich muss nur die Regeln kennen, nach denen

das Programm funktioniert und führt die Berechnungen durch.

Aber unser gestriges Gespräch hat mich auf die Idee gebracht, dass meine Codes ohne Logik sein werden, wenn ich keine Boolesche Algebra lerne.

Wenn meinen Codes die boolesche Logik fehlt, werden meine Programme nicht richtig oder gar nicht funktionieren.

Aber ich habe gestern einen Blick auf Wikipedia geworfen und festgestellt, dass Boolesche Algebra und wahrscheinlich auch Logik nichts für meinen Verstand sind!

Gestern haben Sie bei einem flüchtigen Blick auf ein Fragment meines Codes schnell festgestellt, dass es ihm an boolescher Logik fehlt.

Wenn es Ihnen nichts ausmacht, könnten Sie bitte den Verlauf Ihrer Argumentation erläutern, die Ihrer Schlussfolgerung über die fehlende Logik in diesem Fragment vorausging.

Wenn ich es verstehe, werde ich weitermachen. Wenn ich es nicht verstehe....., werde ich wahrscheinlich zu dem Schluss kommen, dass Programmieren etwas ist, das meine Fähigkeiten weit übersteigt.

Ich danke Ihnen.

wenn (ot==0)
wenn (Gebot==Preis)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Andrej, so tragisch ist das gar nicht! Verwenden Sie einfach das, was Sie verstehen! Alles andere wird sich mit der Zeit ergeben!

Nachdem Sie z.B. mit der Funktion von Kim die Schließung durch Stop überprüft haben, müssen Sie eine zusätzliche Variable Lots einführen und vor der Eröffnung einer neuen Position mit einem verdoppelten Lot die folgende Zeile schreiben: Lots = Lot*2.0 und das ist alles! Und Sie setzen ein normales Lot, wo Sie keine Verdoppelung brauchen!

Warum braucht man komplexe Codes für einfache Dinge? Um der Wissenschaft willen, damit niemand sie verstehen kann? Eine Art Schutz vor "Plagiaten"!

 
borilunad:

Andrej, so tragisch ist das gar nicht! Verwenden Sie einfach das, was Sie verstehen! Alles andere wird zu gegebener Zeit kommen!

Wenn Sie zum Beispiel die Schließung durch Stop überprüft haben, müssen Sie eine zusätzliche Variable Lots einführen, und bevor Sie eine neue Position mit einem verdoppelten Lot eröffnen, müssen Sie folgende Zeile schreiben: Lots = Lot*2.0 und das ist alles! Und Sie setzen ein normales Lot, wo Sie keine Verdoppelung brauchen!

Warum braucht man komplexe Codes für einfache Dinge? Um der Wissenschaft willen, damit niemand sie verstehen kann? Eine Art Schutz vor "Plagiaten"!

Boris! Danke für die Ermutigung. Du hast mich ein wenig beruhigt....

Aber ich leide immer noch unter den wiederholten Bemerkungen über die fehlende Logik in meinen Codes.

Und was mich am meisten ärgert, ist, dass ich nicht verstehen kann, wovon ich eigentlich rede.

Mir scheint, dass das Fehlen boolescher Logik im Code wichtig ist.

Aber woher weiß ich, ob sie existiert oder nicht?

Alexey hat mir gesagt, dass ich wegen dieses Fragments Probleme haben könnte (obwohl das Testgerät in Ordnung ist).

wenn (ot==0)

wenn (Gebot==Preis)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Im Falle eines Kodierungsfehlers ist alles klar - entweder MetaEditor sagt es mir oder Terminal Log.

Und wenn ich die Logik übersehe ....... wie kann ich das wissen? Nur mit einem Hinweis von erfahreneren Kollegen.

Aber auch nach deren Aufforderung verstehe ich nicht, worum es genau geht.

Das Studium der Booleschen Algebra ist für mich unwirklich.

 

Vergessen Sie die Boolesche Algebra und bringen Sie sie nicht mehr zur Sprache.

Eine Anekdote:

Ein Psychiatrieprofessor besuchte ein Krankenhaus für psychisch Kranke und fragte den Chefarzt, wie er feststellt, ob ein Patient genesen ist oder noch krank ist.

- Wir füllen die Badewanne mit Wasser, stellen eine Teetasse mit einem Löffel auf den Rand und bieten dem Patienten an, das Wasser zu entfernen.

- Wir müssen davon ausgehen, dass der Patient, wenn es ihm gut geht, die Tasse nimmt und nicht den Löffel?

- Wenn der Patient gesund ist, zieht er den Korken in der Wanne.

* * *

Sie sollten in der Lage sein, sich selbst eine Antwort auf die Frage zu geben, ob die Aktionen, die Sie im Code durchführen wollen, vernünftig sind, und das ist gar nicht so schwierig.

Open[1]-Close[1] kann negativ sein. Für den Fall Schließen>Öffnen gibt es also eine Option, für den Fall Schließen<Öffnen gibt es eine andere Option. Oder Sie sollten die Größe des Körpers so berechnen, dass sie nicht von der Richtung der Kerze abhängt.

 
solnce600:

Boris, ich danke dir für deine Unterstützung, du hast mich ein wenig beruhigt....

Trotzdem wurde mir immer wieder gesagt, dass meine Codes keine Logik enthalten.

Und was mich am meisten ärgert, ist, dass ich nicht verstehe, wovon genau ich rede.

Mir scheint, dass das Fehlen boolescher Logik im Code wichtig ist.

Aber wie kann ich wissen, ob es eine gibt oder nicht?

Alexey sagte, dass es in diesem Fragment nicht vorhanden ist und dass ich wegen dieses Fragments Probleme haben könnte (obwohl der Tester OK ist).

wenn (ot==0)

wenn (Gebot==Preis)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Im Falle eines Fehlers in der Kodierung ist alles klar - entweder MetaEditor sagt es mir oder Terminal Log.

Aber woher soll ich wissen, dass ich die Logik übersehe .......? Nur durch einen Hinweis von erfahreneren Kollegen.

Aber auch nach deren Aufforderung verstehe ich nicht, wovon ich spreche.

Boolesche Algebra zu lernen, ist für mich unvorstellbar.

"Zuerst mache ich Ihren Code lesbar, entferne unnötige Klammern und Bedingungen, und dann können Sie mir sagen, warum Sie diese Bedingungen brauchen!

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

"Zuerst mache ich Ihren Code lesbar, entferne unnötige Klammern und unnötige Bedingungen, und dann sagen Sie mir, warum Sie diese Bedingungen brauchen!

Ich sage Ihnen, warum ich diese unnötigen Bedingungen brauche.

Ich brauche die Bedingungen, die Sie an den Ofen geschickt haben, damit das Programm die spezifischen Parameter der Kerze mit einem Abstand von 1 Punkt berechnet.

D.h. eine bärische Kerze mit einer bestimmten Größe ihres Körpers, mit einer bestimmten Größe zwischen dem Eröffnungs- und dem Tiefstkurs, mit der bestimmten Größe des Abstands zwischen Tiefst- und Schlusskurs.

Wenn ich mich nicht irre, können Sie zu diesem Zweck auch NormalizeDouble (MathAbs ()) verwenden, aber ich habe keinen Unterschied zwischen dieser Variante und der von mir verwendeten festgestellt.

 
solnce600:

Ich sage Ihnen, wofür ich diese zusätzlichen Bedingungen brauche.

Die Bedingungen, die Sie mir geschickt, um den Ofen, ich brauche das Programm, um die spezifischen Parameter der Kerze zu berechnen +, - 1 Punkt.

D.h. eine bärische Kerze mit einer bestimmten Größe ihres Körpers, mit einer bestimmten Größe zwischen dem Eröffnungs- und dem Tiefstkurs, mit der bestimmten Größe des Abstands zwischen dem Tiefst- und dem Schlusskurs.

Ich verstehe, dass für diesen Zweck, wenn ich mich nicht irre, können Sie auch NormalizeDouble (MathAbs ()), aber ich habe nicht bemerkt, einen Unterschied zwischen dieser Version und die, die ich verwendet.

Dann siehe oben, korrigiert!
 
Integer:

Vergessen Sie die Boolesche Algebra und bringen Sie sie nicht mehr zur Sprache.

Eine Anekdote:

Ein Psychiater besuchte ein Krankenhaus für psychisch Kranke und fragte den Chefarzt, wie er feststellt, ob ein Patient genesen ist oder noch krank ist.

- Wir füllen die Wanne mit Wasser, stellen eine Teetasse mit einem Löffel auf den Rand und bieten dem Patienten an, das Wasser zu entfernen.

- Wir müssen davon ausgehen, dass der Patient, wenn es ihm gut geht, die Tasse nimmt und nicht den Löffel?

- Wenn der Patient gesund ist, zieht er den Korken in der Wanne.

* * *

Sie sollten in der Lage sein, sich selbst eine Antwort auf die Frage zu geben, ob die Aktionen, die Sie im Code durchführen wollen, vernünftig sind, und das ist gar nicht so schwierig.

Open[1]-Close[1] kann negativ sein. Für den Fall Schließen>Öffnen gibt es also eine Option, für den Fall Schließen<Öffnen gibt es eine andere Option. Oder Sie sollten die Körpergröße so berechnen, dass sie nicht von der Richtung der Kerze abhängt.

Danke für die Anekdote.....von nun an werde ich versuchen, nur noch an den Stecker zu denken.

Aber trotzdem ... wenn angesehene Leute aus dieser Branche wiederholt und gleichzeitig über die Abwesenheit der Logik in meinem Code.... sagen, wie es sich später herausstellt, Boolesche Algebra - es bedeutet, auf die Autorität der ernsthaften Fachleute aus dieser Branche zu spucken..... werde ich mich nicht sofort dazu erheben.... und kann mich überhaupt nicht erheben..... habe ich noch nicht versucht.

 
borilunad:
Dann siehe oben, korrigiert!

Ich hatte also eine Menge zusätzlicher Klammern? Sind sie schädlich?!

Nun, wenn der Compiler bei der Eingabe dieser Klammern keine Fehlermeldung ausgibt .... , dachte ich, alles sei in Ordnung.

Ich dachte bis vor kurzem, wenn der Compiler sich nicht beschwert und der EA im Strategy Tester gemäß seinem Code funktioniert, dann ist er in Ordnung.

Sieht aus, als wäre es nicht ganz so.....

 
solnce600:

Boris, ich danke dir für deine Unterstützung, du hast mich ein wenig beruhigt....

Trotzdem wurde mir immer wieder gesagt, dass meine Codes keine Logik enthalten.

Und was mich am meisten ärgert, ist, dass ich nicht verstehe, wovon genau ich rede.

Mir scheint, dass das Fehlen boolescher Logik im Code wichtig ist.

Aber wie kann ich wissen, ob es eine gibt oder nicht?

Alexey sagte mir, dass es in diesem Fragment fehlt und dass ich wegen dieses Fragments Probleme haben könnte (obwohl das Testgerät in Ordnung ist).

wenn (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Im Falle eines Fehlers in der Kodierung ist alles klar - entweder MetaEditor sagt es mir oder Terminal Log.

Aber woher soll ich wissen, ob ich die Logik übersehe .......? Nur durch einen Hinweis von erfahreneren Kollegen.

Aber auch nach deren Aufforderung verstehe ich nicht, wovon ich spreche.

Das Studium der Booleschen Algebra ist für mich unwirklich.


Man muss kein Experte in Boolescher Algebra sein, um die Begriffe klar zu formulieren...

Ich will es Ihnen ein wenig leichter machen... Ersetzen Sie if durch das übliche if, else durch otherwise, && durch and, || durch or , usw... Dann können Sie in Ihren eigenen Worten lesen, was geschrieben steht, oder entscheiden, was Sie schreiben wollen.

Was Sie geschrieben haben (lassen wir die falsche Beschreibung der Bedingungen einmal beiseite):

1. if (ot==0) Wenn es keine Market Orders gibt (weder Market Orders überhaupt, noch schwebende, noch von diesem EA, einem anderen EA oder manuell geöffnet)... Wenn ja, wird Zeile 2 ausgeführt, wenn nein, gehen wir zu Zeile 3.

2. if (Bid==Price) Wenn der Preis gleich dem Eröffnungskurs der aktuellen Kerze ist... Wenn ja, wird Zeile 3 ausgeführt, wenn nicht, gehen wir zu Zeile 4.

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point)) Wenn der Eröffnungskurs der ersten Kerze um mehr als 100 Punkte und weniger als 120 Punkte über dem Schlusskurs der ersten Kerze liegt... Wenn ja, gehen Sie zu Zeile 4, wenn nicht, gehen Sie zu Zeile 5.

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point)) Wenn der Höchststand der ersten Kerze um mehr als 40 Punkte und weniger als 60 Punkte über dem Eröffnungskurs der ersten Kerze liegt... Wenn ja, führen wir Zeile 5 aus, wenn nicht, gehen wir zu Zeile 6.

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point)) Wenn der Schlusskurs der ersten Kerze um mehr als 40 Punkte und weniger als 60 Punkte über dem Tiefstkurs der ersten Kerze liegt. Wenn ja, wird Zeile 6 ausgeführt, wenn nicht, geht es weiter mit Zeile 7.

6.

7.

Wie Sie aus dieser Zerlegung ersehen können, werden entweder alle Codezeilen nacheinander ausgeführt (falls jede Zeile true zurückgibt), oder Sie überspringen die Zeile, die auf die Zeile folgt, die false zurückgibt.

Um Verwirrung in Ihren Begriffen zu vermeiden und Ihre Logik korrekt zusammenzusetzen, schließen Sie alle Anweisungen in geschweifte Klammern ein, unabhängig davon, ob eine einzelne Zeile nach dem Wahrheitswert oder ein ganzer Block ausgeführt werden soll.

Zum Beispiel:

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
Versuchen Sie also, Ihren Code in Komponenten zu zerlegen, und entfernen Sie zusätzliche Klammern, die in diesem Fall unnötig sind...