Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Erkennen ob Position augestoppt wurde (http://www.expert-advisor.com/forum/showthread.php?t=2432)

MarkusW 20.09.12 22:38

Erkennen ob Position augestoppt wurde
 
Hi, bin noch nicht so vertraut mit der mq4-programmierung.

In meiner Strategie eröffne ich gleichzeitig eine long- und eine shortposition. Je nachdem welche Position der beiden durch StopLoss geschlossen wird, soll sich der EA anders verhalten. Ich öffne die Positionen so:

Code:

ticket_long=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Opening Position....",12345,0,Green);   
            if(ticket_long>0)
            {
              if(OrderSelect(ticket_long,SELECT_BY_TICKET,MODE_TRADES))
              Print("BUY order opened : ",OrderOpenPrice());
              trade_aktiv=1; 
            }
            else
            {
              Print("Error opening BUY order : ",GetLastError());
            }
       
            // Short Position öffnen
            ticket_short=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"Opening Position....",12345,0,Red);
            if(ticket_short>0)
            {
                if(OrderSelect(ticket_short,SELECT_BY_TICKET,MODE_TRADES))
                Print("SELL order opened : ", OrderOpenPrice());
                trade_aktiv=1; 
            }
            else
            {
            Print("Error opening SELL order : ",GetLastError());
            }

Ich habe jetzt auf zwei wegen versucht herauszufinden, ob die jeweilige Position noch offen ist, oder ob sie bereits geschlossen wurde. Hier am beispiel der long Position:

Variante 1:
Code:

if(!(OrderSelect(ticket_long,SELECT_BY_TICKET,MODE_TRADES)))  // wenn long Position ausgestoppt wurde
        {
            Print("!! Long Position Ausgestoppt !!");
        }

Variante 2:

Code:

OrderSelect(ticket_long,SELECT_BY_TICKET,MODE_TRADES);
        closeTime=OrderCloseTime();
       
        if (closeTime!=0)
        {
            Print("!! Long Position Ausgestoppt !!");
        }

So bei Variante 1 sagt er immer die Position währe geschlossen, auch wenn sie offen ist.

Bei Variante 2 erkennt er nicht das sie geschlossen wurde.

Was mache ich falsch ? :(

Programmierer 24.09.12 19:41

also die erste Variante kann schonmal nicht funktionieren. Denn auch geschlossene Orders kann man selektieren (wäre auch doof, wenn nicht :))

Die zweite ist grundsätzlich die richtige Herangehensweise. Überprüfe am besten auf if(OrderCloseTime() > 0). Wenn das true ist, dann ist die Position geschlossen.

Hast du denn die Var. ticket_long auf EA-Ebene definiert oder in der Funktion? Letzteres wäre fatal.

Mehr fällt mir so in der Theorie nicht ein. Am besten poste den EA, dann nehmen wir uns den mal uns können praktisch testen, was damit falsch läuft.

MarkusW 24.09.12 20:00

Danke für die Antwort.

Ja klar die erste Variante war schon blöd ... also die Variable ticket_long ist in der start Funktion als erstes definiert. Es spielt sich auch alles in der Start Funktion ab von daher sollte es damit keine Probleme geben.

Ja die zweite Variante müsste doch so gehen, denn eine offene Position hat ja bei Close Time eine 0 als Wert. Ich versuchs gleich nochma bissi anders abzufragen, so wie du es geschrieben hattest.

Programmierer 24.09.12 20:11

ah, ok, da haben wir den Fehler! Du hast die Variable für die Tickets in der start()-Methode definiert! Wenn du das machst, dann ist die Var. jedes Mal leer, wenn die startMethode neu aufgerufen wird. Und das passiert bei jedem Tick. In deinem Fall ist eröffnung und mögliche Schließung der Position aber nicht im gleichen Tick.

D.h. es wird eröffnet um z.B. 16.00, dann hält die Var. für diesen Durchlauf der start()Methode den Ticketwert. Ab dem nächsten Tick ist der variablenwert wieder null.

Du musst also ticket_long und -short außerhalb der Methoden deklarieren. Dann behalten sie den Wert, solange der EA nicht neu gestartet wird.


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:26 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum