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)
-   -   Gleicher Preis einer Pending Order (http://www.expert-advisor.com/forum/showthread.php?t=6281)

Max2018 12.12.18 00:37

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);
}


MA-EA 12.12.18 07:55

Die Pending Order löschen, wenn Eine entsprechend im Markt ist? :confused:

Max2018 12.12.18 09:45

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......:confused:

traderdoc 12.12.18 12:51

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);
}

traderdoc

MA-EA 12.12.18 17:15

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. :rolleyes:

traderdoc 12.12.18 17:27

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

Max2018 13.12.18 15:14

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;
also

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);
}

und unten die Boolische Abfrage

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);
            }
        }
      }
  }

Aber da wirft er mir den Fehler aus -und sagt er kennt price[vv] nicht und da auch meine Frage - wie das mit price[vv] abgeglichen wird.... da müsste ich doch eine Schleife in der Schleife haben :confused: oder nicht und wie macht man das? Er muss doch jeden price[vv] Wert mit den bereits bestehenden PendingOrders OrderOpenPrice() abgleichen. Damit muss er ja 2 Schleifen durchlaufen ...oder nicht? ..und wie baut man das hier ein?

traderdoc 14.12.18 09:39

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

Max2018 16.12.18 13:39

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

:)


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:42 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