-----------------------------------------------------------------+ //| Opening and Closeing.mq4 | //| Copyright © 2010, Ben banta | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Ben banta" //+------------------------------------------------------+ //| Closing My Way | //+------------------------------------------------------+ double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if ( OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol() // with my symbol ) { if(OrderType() == OP_SELL) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() + (ATR*2)) // ATR*2 above Sell. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Blue); Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2)) //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2)) }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc }// END for loop //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0) return(0); }//ENDif (Ask > High[iHighest(NU... etc //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); }//ENDif (ticket>0) else Print ("Error Opening Sell Order :" ,GetLastError()); //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(0); }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) return(0); }//ENDif (OrdersTotal() < 1) }//ENDint start()Sollte Ihre Codeblöcke leichter lesbar machen
if(OrderTicket() == OrderOpenPrice() - (ATR*2))DasAuftragsticket ist eine sehr große ganze Zahl (wahrscheinlich im Milliardenbereich), der Schlüssel zum Auftrag.
OOP - 2ATR ist ein Preis.
Die beiden werden NIEMALS gleich sein
Wenn Sie OrderClosePrice() == OOP-2ATR gemeint haben, werden reale Zahlen fast nie gleich sein. verwenden Sie stattdessen:
if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...
OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()Ihr orderSend setzt keine magische Zahl
Prost
Das Auftragsticket ist eine sehr große ganze Zahl (wahrscheinlich im Milliardenbereich), der Schlüssel zum Auftrag.
OOP - 2ATR ist ein Preis.
Die beiden werden NIEMALS gleich sein
wenn Sie OrderClosePrice() == OOP-2ATR meinten, werden reale Zahlen fast nie gleich sein. verwenden Sie stattdessen:
Ihr orderSend setzt keine magische Zahl
vielen Dank für deinen Blick und die Anregungen. Ich muss aber sagen, dass ich das OOP -2ATR nicht auf Anhieb verstanden habe.
OOP = OrderOpenPrice. Das ist mir zunächst über den Kopf gewachsen. Deine Erklärung ist absolut richtig. Ich hatte mich an dem == Zeichen verfangen. Der OrderClosePrice() könnte niemals dem OrderOpenPrice() minus (ATR*2) entsprechen. Danke, dass Sie das erkannt haben.
Lassen Sie mich sehen, ob ich Ihren Vorschlag verstehe. Ich werde ihn hier neu formulieren. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Das sieht so aus (ich verwende hier willkürliche Zahlen): OCP = 1,4361, OOP = 1,4321, ATR = 20. Der Ausdruck würde also wie folgt aussehen:
if (1.4321 - 1.4361 - (20*2) <= 0), Es tut mir leid, aber ich verstehe es nicht.
Vielleicht kann ich die gleichen Zahlen verwenden, um den Ausdruck umzustellen, um zu zeigen, was ich gemeint habe. Aber auch das hat nicht funktioniert, als ich sie in das Programm eingegeben habe.
Die neue Anordnung sieht wie folgt aus.
if (1,4361 >= 1,4321 + (20*2)).
Wenn der OCP >=OOP + ATR*2 ist, geht die Kontrolle an:
OrderClose (OrderTicket(), OrderLots(), usw.
Ihre andere Beobachtung war, dass OrderSend keine magische Zahl setzt.
Könnte ich diesen Teil einfach aus dem Programm nehmen: && OrderMagicNumber == MagicNumber,
Nochmals vielen Dank, und wenn Sie weitere Verbesserungen sehen, wäre ich Ihnen sehr dankbar.
Vielen Dank
OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;
danke für deine Antwort. Ich hoffe, es geht dir gut.
Die Anregung wurde heute Morgen eingefügt. Leider gefällt dem Compilier nicht, was ich codiert habe. Ich bin mir nicht sicher, welche Anweisung im Programm falsch ist. Die Vorschläge sind meiner Meinung nach in Ordnung. Ich werde das Programm erneut posten und den Bereich kennzeichnen, der meiner Meinung nach das Problem darstellt. Ich werde auch die Strategie für die Schließung angeben.
Die Verkaufsposition wird oberhalb des Eröffnungskurses der Order um Atr*2 gestoppt. Zum Beispiel: OOP ist 1,4321, Atr =20 und OCP = 1,4361.
Also habe ich den Ausdruck wie folgt kodiert,
if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // Bedingung ist erfüllt, Kontrolle geht an....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;
Hinweis: Es gibt keinen StopLoss() oder TakeProfit() in der OrderSend-Anweisung, falls das von Bedeutung ist.
Nochmals vielen Dank für jede Hilfe
Prost
double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if (OrderSelect(index, SELECT_BY_TICKET) // existing orders //&& OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()) // with my symbol { if(OrderType() == OP_SELL) order = OrderTicket(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met, // control then passes to... { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); } } } //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); return(0); } //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Sell Order :" ,GetLastError()); return(0); } return(0); } }
Hallo Huckleberry,
Ich werde dein Programm ein wenig umgestalten.
Tschüss für jetzt
Warum "order = OrderTicket();" und nicht diesen Wert in der Funktion orderclose() verwenden?
Auch wenn die Wahrscheinlichkeit gering ist, dass sich die ausgewählte Bestellung geändert hat, wäre es nicht sicherer, den positiv identifizierten Bestellwert zu verwenden?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() wird das aktuell ausgewählte Ticket sein - in diesem Stadium meines Lernens
Ich kann nicht sagen, welches Orderticket ausgewählt ist, wenn Sie OrderClose() ausführen.
//// Bearbeiten
Ich bin mir nicht sicher, ob "order= OrderTicket()" das Ticket ist, das Sie in der vorangehenden If-Anweisung identifiziert haben.
Warum "order = OrderTicket();" und nicht diesen Wert in der Funktion orderclose() verwenden?
Auch wenn die Wahrscheinlichkeit gering ist, dass sich die ausgewählte Bestellung geändert hat, wäre es nicht sicherer, den positiv identifizierten Bestellwert zu verwenden?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() wird das aktuell ausgewählte Ticket sein - in diesem Stadium meines Lernens
Ich kann nicht sagen, welches Orderticket ausgewählt ist, wenn Sie OrderClose() ausführen.
//// Bearbeiten
Eigentlich bin ich mir nicht sicher, ob "order= OrderTicket()" das Ticket ist, das Sie in der vorangehenden If-Anweisung identifiziert haben.
danke für deine Beobachtung und deinen Vorschlag. Ihre Zeit ist wertvoll.
Ihre Überlegungen machen durchaus Sinn. Ich bin mir nicht so sicher wie Sie, was die gewählte Reihenfolge betrifft. Ich werde Ihre Anregung ausprobieren.
Nochmals vielen Dank.
Zum Wohl
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo an alle
Hoffe, dass die Syntax besser ist als vorher. In der letzten Woche habe ich den Codersguru gelesen.
Das Programm unten hat zwar keine Fehler, der Compiler protokolliert nur einen Auftrag. Aber mein Code wird ihn nicht schließen.
Das Programm sagt --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), ich habe
weder den StopLoss noch den TakeProfit eingefügt, wie Sie sehen können. Grund, es gibt eine StopLoss-Bedingung, die bereits als solche kodiert ist ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Es besteht also keine Notwendigkeit, einen weiteren StopLoss einzufügen, oder? Was den TakeProfit anbelangt
Ich werde diesen Code einfügen, wenn das andere Problem gelöst ist.
Ist es die Art und Weise, wie ich die Schließungsbedingung kodiert habe, oder gibt es wieder Probleme mit der Syntax?
Vielen Dank an alle für Ihre Hilfe, und möge mein Problem anderen helfen,
Prost