EA mischt BUY- und SELL-Aufträge - Seite 3

 
WHRoeder:

int OrderType = OrderType() ist nicht in Ordnung, das eine kann das andere verbergen (lokale Deklarationen verbergen Globale ohne Fehler.) Versuch

int orderType = OrderType()

Der Originalcode lautet......

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

. . . was im Grunde dasselbe ist wie das, was Sie vorschlagen?

Ich glaube, dvarrin meint, dass sein Problem mit seiner Ticketnummer zusammenhängt.

 

Nein, ist es nicht.

Die außerhalb der Schleife deklarierteAuftragsart überträgt den Wert von orderType effektiv auf den nächsten Zyklus, und selbst wenn ein Fehler auftritt, wird dieser Wert in die nächste Bedingung übernommen.

Wenn Sie innerhalb der Schleife deklarieren und den Wert von OrderType() sofort setzen, gibt es keinen Platz für einen solchen Fehler.

(vielleicht ist es nicht das Problem des Auftraggebers, aber es kann andere Probleme verhindern), was ist es, nicht zu versuchen?

Auch eine halbe Sekunde im Schlaf ist ein bisschen übertrieben. While-Schleife sollte in Ordnung sein, mit 10 milisecond Sleep-Timer ohne Hit auf Ihre CPU-Last was auch immer (gut fast :P)

 
forexCoder:

Nein, ist es nicht.

Die außerhalb der Schleife deklarierte Auftragsart überträgt den Wert von orderType effektiv auf den nächsten Zyklus, und selbst wenn ein Fehler auftritt, wird dieser Wert in die nächste Bedingung übernommen.

Wenn Sie innerhalb der Schleife deklarieren und den Wert von OrderType() sofort setzen, gibt es keinen Platz für einen solchen Fehler.

(vielleicht ist es nicht das Problem des Auftraggebers, aber es kann andere Probleme verhindern), was ist es, nicht zu versuchen?

Auch eine halbe Sekunde im Schlaf ist ein bisschen übertrieben. Die While-Schleife sollte mit 10 Millisekunden Schlaf-Timer auskommen, ohne dass die CPU-Last darunter leidet (na ja, fast :P)


Ich vermute, dass das Problem in der Verwendung von "ask manual confirmation" liegt, wenn ich den EA vorwärts teste, aber ich verstehe nicht, was genau passiert.

Ich weiß nur, dass eine Variable mit dem Namen OrderType nicht mit einer Methode mit demselben Namen interferieren kann, und auch der Ort der Deklaration hat nichts mit meinem Problem zu tun.

Das Problem ist, dass OrderTicket(), OrderStoploss(), ... nach der Verwendung von OrderSelect() nicht die Daten für dieselbe Bestellung liefern.

Wenn ich lokale Variablen verwende und sie nach dem Aufruf von OrderSelect() setze, funktioniert es, aber wenn ich direkt OrderTicket() oder OrderStoploss() verwende, gibt es falsche Werte.


Warum gibt OrderStopLoss() in meinem Code den Stoploss einer anderen Order innerhalb der gleichen Iteration der "for"-Schleife zurück?

 

Hier ist der vollständige Code des EA:

Das Problem liegt in der ersten "for"-Schleife der updateFbOrders()-Methode.

Um es zu testen, füge ich die Alligator- und Fraktal-Indikatoren zu einem Diagramm hinzu und suche ein Diagramm, bei dem das letzte obere Fraktal über den Alligator-Linien und das letzte untere Fraktal unter den Alligator-Linien liegt.

Dann sollte er ausstehende Kauf- und Verkaufsaufträge erstellen. Wenn es einen Ausbruch aus einem der Fraktale gab, wird eine sofortige Order eröffnet.

Dann wird der Stoploss jedes Auftrags bei jeder Änderung der Fraktale geändert, aber der Stoploss wird für den falschen Auftrag gesetzt.

Überprüfen Sie die Alarmfenster und suchen Sie nach einer Meldung wie dieser: Anzahl: 1 Stoploss 1.41008000 für Kaufauftrag: 46454014 orderType: 5, und wenn Sie die Order 46454014 überprüfen, werden Sie sehen, dass es sich in Wirklichkeit um eine Verkaufsorder handelt, und die Order wird weiterhin geändert, auch wenn sich der Stoploss nicht ändert, da er das falsche Stoploss-Niveau annimmt.
 

Das ist dumm. Sie fügen nicht den gesamten Code ein.

Du hast eine

areBuyOrdersInProfitAt

Funktion, die wir nicht sehen, bitte fügen Sie sie ein. Es ist mittlerweile sehr wahrscheinlich, dass Sie irgendwo anders einen Fehler gemacht haben. Verwenden Sie die OrderSelect-Funktion irgendwo anders?

Und wo setzen Sie die Variablen longSL und shortSL? Bitte fügen Sie auch diesen Teil des Codes ein.

EDIT: Du hast ihn eingefügt, während ich getippt habe, ich sehe mir jetzt den neuen Beitrag an.

 
forexCoder:

Das ist dumm. Sie fügen nicht den gesamten Code ein.

Du hast eine

areBuyOrdersInProfitAt

Funktion, die wir nicht sehen, bitte fügen Sie sie ein. Es ist mittlerweile sehr wahrscheinlich, dass Sie irgendwo anders einen Fehler gemacht haben. Verwenden Sie die OrderSelect-Funktion irgendwo anders?

Und wo setzen Sie die Variablen longSL und shortSL? Bitte fügen Sie auch diesen Teil des Codes ein.

EDIT: Sie haben ihn eingefügt, während ich getippt habe, ich sehe mir jetzt den neuen Beitrag an.

Hallo forexCoder

ich habe den EA in den vorherigen Beitrag eingefügt.


Aber ich glaube, Sie haben das Problem erkannt: Ich verwende OrderSelect() in der Methode "areBuyOrdersInProfitAt" :-)))))))))))

 

Ja, wie ich dachte.

Die areBuyOrdersInProfitAt Funktion enthält eine andere OrderSelect Funktion und diese überschreibt die Funktion im ursprünglichen Snippet. Wenn diese areBuyOrdersInProfitAt-Funktion zurückkehrt, wird die OrderSelect-Funktion geändert, also auch das Ticket. In diesem Fall sollten Sie hier immer die letzte Bestellung in Ihrer Liste erhalten.

 

Sobald Sie OrderSelect in einer for-Schleife verwenden, die alle Aufträge durchläuft, dürfen Sie keine weitere OrderSelect for-Schleife innerhalb dieser Schleife erstellen, denn wenn die zweite Schleife zurückkehrt, verwenden Sie das Ticket des letzten Auftrags in Ihrem Handelspool.

Ihr Code ist recht umfangreich, so dass ich keine Lust habe, ihn zu korrigieren (sry:P), aber Sie haben jetzt einen Hinweis auf die richtige Richtung.

 
dvarrin:

Aber ich glaube, Sie haben das Problem erkannt: Ich verwende OrderSelect() in der Methode "areBuyOrdersInProfitAt" :-)))))))))))

Schön zu hören, dass Sie auf dem Weg zu einer Lösung sind :-)
 
RaptorUK:
Schön zu hören, dass Sie auf dem Weg zu einer Lösung sind :-)
Herzlichen Dank an alle. Es war wirklich ein dummer Fehler, den ich gemacht habe :-((