|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Gleicher Preis einer Pending Order
Hi,
ich möchte prüfen, ob es bereits eine andere geöffnete PendingOrder mit dem gleichen Startpreis gibt und wenn dies der Fall ist, eröffne ich die Position NICHT. Wie kann ich das hier machen ? irgendeine if Abfrage mit einem break? Aber wie? Code:
for (int vv = 0; vv <= 300; vv++) { price[vv] = NormalizeDouble(ObjectGetDouble(0,vv,OBJPROP_PRICE2),NACHKOMMA); priceSL[vv] = NormalizeDouble(ObjectGetDouble(0,vv,OBJPROP_PRICE1),NACHKOMMA)-NormalizeDouble(spreadReal,NACHKOMMA); // da spreadReal negativ hier minus ! priceZIEL[vv] =NormalizeDouble(price[vv]-((priceSL[vv]-price[vv])*MARGE),NACHKOMMA); result[vv]=OrderSend(Symbol(),OP_SELLSTOP,Lots,price[vv],Slippage,0,0,"X"+MARGE+"_"+MagicNumber,MagicNumber,0,Blue); TheStopLoss=priceSL[vv]+AufschlagSL; TheTakeProfit=priceZIEL[vv]-AufschlagSL; if(StopLoss>0) TheStopLoss=priceSL[vv]+AufschlagSL; OrderSelect(result[vv],SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green); } |
|
|||
Die Pending Order löschen, wenn Eine entsprechend im Markt ist?
|
|
|||
Nein, die neue Pending Order soll nicht gesetzt werden.
also ich vergleiche price[vv] mit allen bereits gesetzten SELLSTOPS und hat einer bereits einen Preis in genau dieser Höhe , dann setze ich einen break, also wird die neue Pending Order nicht platziert. Aber wie mache ich das, da ich ja dann eine Schleife in der Schleife habe und alle bereits gesetzten SellStops abgleichen muss...... |
|
|||
Ach @MA-EA, richtig lesen ist schon eine Kunst!
Prinzipiell läuft das so: Code:
bool PO_Check() { for(int i = OrdersTotal()-1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){ if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) { if (OrderOpenPrice() == Vergleichspreis) return(false); } } } } return(true); } //oder über die TicketNumber: bool PO_Check() { if (OrderSelect(TicketNumber, SELECT_BY_TICKET)) { if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) { if (OrderOpenPrice() == Vergleichspreis) return(false); } } return(true); }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Nach welchem Prinzip werden die Stop-Orders gesetzt? Wie funktioniert das ganze System?
Der einfachste Weg wäre eben, die Stop-Order zu löschen. Wenn dann gar nichts mehr investiert ist, neue Stop-Order setzen. Dann brauch man nicht nach irgendwelchen Preisen suchen. |
|
|||
Er will aber die alten PendingOrders nicht löschen, wenn sie bereits gesetzt wurden, und damit sie nicht zweimal gesetzt werden, z.B. bei Grid-Systemen, werden die gesetzten POs dahingehend gecheckt.
Das ist doch ganz einfach. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi,
super Danke.... ABER es gibt da noch ein Problem aus der Ausgangsfrage ich habe jetzt in die Formel eingefügt: Code:
if (PO_Check()==true)break; Code:
for (int vv = 0; vv <= 300; vv++) { price[vv] = NormalizeDouble(ObjectGetDouble(0,vv,OBJPROP_PRICE2),NACHKOMMA); priceSL[vv] = NormalizeDouble(ObjectGetDouble(0,vv,OBJPROP_PRICE1),NACHKOMMA)-NormalizeDouble(spreadReal,NACHKOMMA); // da spreadReal negativ hier minus ! priceZIEL[vv] =NormalizeDouble(price[vv]-((priceSL[vv]-price[vv])*MARGE),NACHKOMMA); if (PO_Check()==true)break; result[vv]=OrderSend(Symbol(),OP_SELLSTOP,Lots,price[vv],Slippage,0,0,"X"+MARGE+"_"+MagicNumber,MagicNumber,0,Blue); TheStopLoss=priceSL[vv]+AufschlagSL; TheTakeProfit=priceZIEL[vv]-AufschlagSL; if(StopLoss>0) TheStopLoss=priceSL[vv]+AufschlagSL; OrderSelect(result[vv],SELECT_BY_TICKET); OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green); } Code:
bool PO_Check() { for(int i = OrdersTotal()-1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){ if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) { if (OrderOpenPrice() == price[vv]) return(false); } } } } |
|
|||
Ja klar wird er die Variable nicht kennen, da sie dafür nicht am richtigen Ort deklariert wurde.
Das sollte auf jeden Fall gehen: if (PO_Check(price[vv]) break; Und dann bool PO_Ckeck(double price) { ... if (OrderOpenPrice() == price) ... } Damit sollte auf jeden Fall der aufgetretene Compilerfehler beseitigt sein. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi,
SUUUUPER DANKE - traderdoc Du bist ein Genie.... was würde das Forum ohne Dich machen, das würde jämmerlich dahin vegetieren Wirklich absolut SPITZE DU BIST ABSOLUT GENIAL DANKE und schöne Feiertag Geändert von Max2018 (16.12.18 um 13:50 Uhr) |
Lesezeichen |
|
|