Fehler, Irrtümer, Fragen - Seite 2450

 
Alexey Navoykov:

Aber wir werden uns das natürlich ansehen. Ich bin mir nicht sicher, ob Sie dieses Projekt noch entwickeln.

Die Entwicklung dieses Projekts hat noch ein riesiges Potenzial, vor allem in Bezug auf die Verbesserung der Sprache mit Ihren eigenen Ressourcen, weil viele Dinge in MQL noch nicht implementiert worden sind und viele Dinge schlecht funktionieren (Bugs) und die Entwickler, so wie ich es verstehe, haben keine Pläne, etwas in der Sprache selbst zu verbessern.

Um Makros zu verarbeiten, muss ich eine zusätzliche Schicht irgendwo in der Nähe des Beginns der gesamten Kette implementieren - beschreiben Makros Grammatik, parsen sie in der Quelle undinterpretieren (erhalten Ergebnis Quelle/Wert für jedes Makro). Dies ist kompliziert, und die Anwendung ist nur für einige MQL-Programmierer erforderlich, so dass es keine Entwicklung gibt.

Was die Verwendung von Hash zum Erkennen von Änderungen an Produkten betrifft, so halte ich dies nicht für eine Lösung (oder ich habe keine Ahnung, von welchem Anwendungsfall wir sprechen). Normalerweise braucht man ein oder zwei Jahre nach der Erzeugung einer Ex-Datei, um zu verstehen, welche Version ein bestimmtes eingebettetes Modul hatte und woher es stammt. Dazu müssen Sie wahrscheinlich den Build-Prozess mit Versionskontrollsystemen verknüpfen. Hashing ist keine Option.

 
Igor Zakharov:

Helfen Sie mir mit OnTradeTransaction() weiter. Ist das unten beschriebene Verhalten normal? Ich habe es im Tester überprüft - es ist so :( Und auf einem "Live"-Konto?

OnTick() hat eine Schleife, die die Positionen der Reihe nach schließt.

Mit OnTradeTrancaction() wird die Anzahl der offenen Positionen berechnet.

Der Expert Advisor geht folgendermaßen vor: Er schließt zuerst die Schleife bis zum Ende, dann geht er zu OnTradeTransaction und führt die Berechnungen in derselben Reihenfolge durch.

Mit anderen Worten, es gibt keine

а

d.h. er arbeitet sequentiell statt parallel.

Wenn das oben beschriebene normal ist, stellt sich heraus, dass OnTradeTransaction() nur in Expert Advisors, die nur eine Order öffnen/schließen, sicher verwendet werden kann. Wenn es ein Raster oder ein Raster mit mehreren Symbolen gibt (oder ein Raster mit mehreren Symbolen, wie es hier zu finden ist :) ) - bricht der Algorithmus zusammen.

Zitat aus der Dokumentation

Eine Handelsanfrage, die manuell vom Terminal oder über die OrderSend()/OrderSendAsync()-Funktionen gesendet wird, kann mehrere aufeinanderfolgende Handelstransaktionen auf dem Handelsserver erzeugen. Außerdemist die Reihenfolge des Eintreffens dieser Transaktionen auf dem Terminal nicht garantiert, so dass wir unseren Handelsalgorithmus nicht darauf aufbauen können , dass wir auf das Eintreffen einer Handelstransaktion nach der anderen warten.

Folglich wird alles berechnet, aber nicht in der erwarteten Reihenfolge.

Können Sie erklären, warum Sie beschlossen haben, die Anzahl der Positionen in OnTradeTrancaction() zu zählen? Wenn die Berechnung nicht korrekt organisiert ist, können wir nicht ausschließen, dass es zu unnötigen Operationen kommt. Wenn Sie mehrere Positionen in der Schleife schließen, ist es nicht notwendig, alle Positionen nach dem Schließen neu zu berechnen. Es reicht aus, sie einmal zu zählen, nachdem die Schleife beendet ist. Oder ordnen Sie in OnTradeTrancaction() so an, dass sich die Menge um 1 erhöht, wenn der Typ IN gesetzt wird, und sich verringert, wenn der Typ OUT gesetzt wird. Und selbst in diesem Fall muss berücksichtigt werden, wenn die Position nicht vollständig geschlossen ist.

 
Alexey Viktorov:

Können Sie erklären, warum Sie beschlossen haben, die Anzahl der Positionen in OnTradeTrancaction() zu zählen?

Wenn man auf jeden Tick zählt, ist das ressourcenintensiv, was sich besonders im Strategietester bemerkbar macht. Wäre es nicht korrekter, nur zum Zeitpunkt des Handelsereignisses zu zählen, d.h. wenn sich etwas in der Liste der offenen Positionen tatsächlich ändert? Mit OnTradeTransaction() ist es einfacher, Benutzereingriffe in den EA zu kontrollieren. (Es gibt einige Präzedenzfälle :)

In diesem Roboter habe ich die Möglichkeit getestet, das Raster nach dem Schema: Verlust + Gewinn > X zu schließen, und dann beide zu schließen (normalerweise auf verschiedenen Symbolen). Aber es kommt zu einem Fehler, denn obwohl sie abgeschlossen sind, ist sich der Prüfer dessen nicht bewusst und fährt mit der nächsten Iteration fort, wobei er fälschlicherweise die vorhandenen mit den bereits abgeschlossenen "paart". Das heißt, ich musste nach jedem Abschluss eine Neuberechnung vornehmen.

Ich habe Neuberechnung mit einem Reset-Zähler und über alle offenen zuerst, nicht +1 / -1

Alexey Viktorov:

Zitat aus der Dokumentation

Ich stimme zu, dass es anfangs zu riskant war , OnTradeTransaction() zu verwenden. Eigentlich würde ich es in Fällen, in denen Anfragen nicht asynchron sind, wahrscheinlich ablehnen - es gibt nur Probleme damit.

 
fxsaber:

Für ein Raster mit mehreren Symbolen ist die Asynchronität gut. Deshalb würde ich mich für die zweite Option entscheiden.

Ich denke bereits in diese Richtung ;)

 
Igor Zakharov:

***

In diesem Roboter habe ich die Möglichkeit getestet, Gitter nach dem Schema zu schließen: Verlust + Gewinn > X , dann beide schließen (normalerweise auf verschiedenen Symbolen).

***

Wenn Sie wissen, dass Sie genau diese beiden Positionen schließen wollen, ist es besser, sich die Tickets für diese Positionen zu merken und sie zu schließen, bis Sie sie schließen (ACHTUNG: kein while und Sleep - geben Sie den Befehl zum Schließen, verlassen Sie OnTick, prüfen Sie, ob es weitere Positionen mit diesen Tickets gibt - wenn ja, versuchen Sie erneut zu schließen und verlassen Sie OnTick).

 
Vladimir Karputov:

Wenn Sie wissen, dass Sie genau diese beiden Positionen schließen müssen, ist es besser, sich die Ticker dieser Positionen zu merken und sie zu schließen, bis Sie sie schließen (HINWEIS: kein while und Sleep - geben Sie Aufträge zum Schließen, beenden Sie OnTick, prüfen Sie, ob es weitere Positionen mit diesen Tickern gibt - wenn ja, dann versuchen Sie erneut zu schließen und beenden Sie OnTick).

Dies ist eine wertvolle Idee. Vielleicht bildet OnTick() ein Array mit dem Ticket und versucht, es einmal zu schließen, und OnTimer() prüft, ob es noch mehr davon gibt und schließt, wenn ja.

Zwischen den Ticks können mehrere Minuten liegen, also übergeben wir die Aufgabe an den Timer
 
Igor Zakharov:

Wertvolle Idee. Vielleicht so: OnTick() erzeugt ein Array mit Tickets und versucht, sie einmal zu schließen, während OnTimer() prüft, ob sie noch vorhanden sind und schließt, wenn dies der Fall ist.

Zwischen den Ticks können mehrere Minuten vergehen, also übergeben wir die Aufgabe an einen Timer

Ich würde ALL while, Sleep und OnTimer für die Aufgabe der Positionsschließung aufgeben. Ich würde Folgendes tun: Aufträge zum Schließen abfeuern - OnTick beenden, beim nächsten Tick würde ich prüfen, ob die Positionen mit den benötigten Tickets noch am Leben sind - erneut Aufträge zum Schließen abfeuern, und so weiter durch die Schleife über Entry/Exit zu OnTick.

Die Logik ist wie folgt: Das Schließen einer Position hat oberste Priorität, also steht die Schließungsschleife ganz am Anfang von OnTick. Und die Bildung eines geschlossenen Ticketfeldes kann an jeder beliebigen Stelle vonTick erfolgen - sogar ganz am Ende.


Igor Zakharov:

***

Zwischen den Ticks können mehrere Minuten liegen, also übergeben wir die Aufgabe an den Timer

Wir können also nichts tun - wir müssen einfach auf eine neue Zecke warten.

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Zakharov:

OnTick() erzeugt ein Array mit Tickets und versucht, sie einmal zu schließen, und OnTimer() prüft, ob sie noch vorhanden sind, und schließt sie, wenn ja.

Eine weitere Option (für die reale Welt - das ist die beste) ist es, die EA in einer virtuellen Umgebung laufen (es ist eine perfekte Ausführung), und in der realen Welt nur Synchronisation mit dem virtuellen ein.

 
Vladimir Karputov:

Sie können also nichts tun - warten Sie einfach auf das nächste Häkchen.

Wenn zum Beispiel ein Netzausfall auftritt, ist das Warten auf den nächsten Tick eine verpasste Gelegenheit zum Abschluss.

 
fxsaber:

Kommt es beispielsweise zu einem Netzausfall, verpasst man durch das Warten auf den nächsten Tick eine Gelegenheit zum Abschluss.

Netzausfall == Unterbrechung der Verbindung? Wenn es kein Internet gibt, kann auch nichts geschlossen oder geöffnet werden - was für eine verpasste Chance ist das?

Im Allgemeinen, wenn das Handelssystem ist sehr empfindlich auf jeden Niesen (ein Verbindungsfehler oder etwas) - dann schrauben Sie ein solches Handelssystem.