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)
-   -   Probleme mit Orderaufgabe (Pending Order) (http://www.expert-advisor.com/forum/showthread.php?t=3992)

Bucardo 22.12.14 14:56

Probleme mit Orderaufgabe (Pending Order)
 
Hallo zusammen,

ich arbeite seit längerem an meinem eigenen News-Advisor. Nachdem ich vor kurzem das Konzept nochmal umgestellt und neu angefangen habe, stoße ich auf folgendes Problem:

Der EA soll kurz vor einer News zwei Pending-Orders aufgeben und diese bis zum zeitpunkt X an den jeweiligen Preis anpassen. Ab zeitpunkt X wird nicht mehr modifiziert und abgewartet welche Order getroffen wird.
Jetzt zum Problem: Sobald die Order ausgeführt werden soll, erhalte ich die Fehlermeldung "Invalid Trade Parameters". Ich habe den Verdacht, dass es an meiner Definition für den Preis der OrderSend-Funktion liegt, finde den Fehler aber nicht. Vielleicht könnt ihr mir weiterhelfen :)

int BuyStop_Preis = Ask + (PipDifferenz*Point);
int BuyStop_StopLoss = Ask + ((PipDifferenz - StopLoss)*Point);
int BuyStop_TakeProfit = Ask + ((PipDifferenz + TakeProfit)*Point);
int SellStop_Preis = Bid - (PipDifferenz*Point);
int SellStop_StopLoss = Bid - ((PipDifferenz + StopLoss)*Point);
int SellStop_TakeProfit = Bid - ((PipDifferenz - TakeProfit)*Point);


void OpenBuyStop()
{
int ticket,tries;
tries = 0;
if (!GlobalVariableCheck("InTrade"))
{
while (tries < 3)
{
GlobalVariableSet("InTrade", CurTime()); // set lock indicator
ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyStop_Preis,1 ,BuyStop_StopLoss,BuyStop_TakeProfit,"EA Order",NULL,0,Red);
Alert("BuyStop eröffnet, Ticket ="+ticket);
GlobalVariableDel("InTrade"); // clear lock indicator
if(ticket<=0)
{
Alert("Fehler bei der BuyStop-Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError())+" BuyStop @ "+BuyStop_Preis+" SL @ "+BuyStop_StopLoss+" TP @"+BuyStop_TakeProfit);
tries++;
}
else tries = 3;
}
}
}

void OpenSellStop()
{
int ticket,tries;
tries = 0;
if (!GlobalVariableCheck("InTrade")) {
while (tries < 3)
{
GlobalVariableSet("InTrade", CurTime()); // set lock indicator
ticket = OrderSend(Symbol(),OP_SELLSTOP,Lots,SellStop_Preis ,1,SellStop_StopLoss,SellStop_TakeProfit,"EA Order",NULL,0,Red);
Alert("SellStop eröffnet, Ticket ="+ticket);
GlobalVariableDel("InTrade"); // clear lock indicator
if(ticket<=0) {
Alert("Fehler bei der SellStop-Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError())+" BuyStop @ "+SellStop_Preis+" SL @ "+SellStop_StopLoss+" TP @"+SellStop_TakeProfit);
tries++;
} else tries = 3;
}
}
}


Danke & Gruß,
Bucardo

traderdoc 22.12.14 18:14

Code:


int Slippage = 3;
double Pt;
int M;

M = 1;
if (MarketInfo(Symbol(), MODE_PROFITCALCMODE) == 0) {
  if (Digits == 3 || Digits == 5) M = 10;
  if (Digits == 6) M = 100; 
  if (Digits == 7) M = 1000;
  Pt = Point*M;
} else Pt = 1.0;

int BuyStop_Preis = Ask + (PipDifferenz*Pt);
int BuyStop_StopLoss = Ask + ((PipDifferenz - StopLoss)*Pt);
int BuyStop_TakeProfit = Ask + ((PipDifferenz + TakeProfit)*Pt);
int SellStop_Preis = Bid - (PipDifferenz*Pt);
int SellStop_StopLoss = Bid - ((PipDifferenz + StopLoss)*Pt);
int SellStop_TakeProfit = Bid - ((PipDifferenz - TakeProfit)*Pt);
 
Slippage *= M;

void OpenBuyStop() {
  int ticket, tries;
  tries = 0;
  if (!GlobalVariableCheck("InTrade")) {
      while (tries < 3) {
        GlobalVariableSet("InTrade", CurTime()); // set lock indicator
        ticket =OrderSend(Symbol(), OP_BUYSTOP, Lots, BuyStop_Preis, Slippage, BuyStop_StopLoss, BuyStop_TakeProfit, "EA Order", 0, 0, Red);
        if (ticket > 0) {
            Alert("BuyStop eröffnet, Ticket ="+ticket);
            GlobalVariableDel("InTrade"); // clear lock indicator
            break;
        } else {
            Alert("Fehler bei der BuyStop -Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError()) + " BuyStop @ "+BuyStop_Preis + " SL @ " + BuyStop_StopLoss + " TP @" + BuyStop_TakeProfit);
            tries++;
        }
      }
  }
}

void OpenSellStop() {
  int ticket, tries;
  tries = 0;
  if (!GlobalVariableCheck("InTrade")) {
      while (tries < 3) {
        GlobalVariableSet("InTrade", CurTime()); // set lock indicator
        ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, SellStop_Preis, Slippage, SellStop_StopLoss, SellStop_TakeProfit, "EA Order", 0, 0, Red);
        if (ticket > 0) {
            Alert("SellStop eröffnet, Ticket ="+ticket);
            GlobalVariableDel("InTrade"); // clear lock indicator
            break;
        } else {
            Alert("Fehler bei der SellStop-Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError()) + " BuyStop @ " + SellStop_Preis + " SL @ " + SellStop_StopLoss + " TP @" + SellStop_TakeProfit);
            tries++;
        }
      }
  }
}

Über M, Digit, Point und Pt wird automatisch festgestellt, ob mit einem 4- oder 5-Digitbroker gehandelt wird. Das ist für die Festlegung des SL, TP und der Slippage eminent wichtig!
Die Slippage war vorher fix mit 1 angegeben. Bei einem 5-Digitbroker hätte das bedeutet, dass nur eine Slippage von 0.1 Pip möglich gewesen wäre - viel zu wenig.
Die Magicnumber wurde als 0 eingesetzt.
Falls Order geöffnet wurde - kurze Alertmeldung und dann mit break Sprung aus der while-Schleife.

traderdoc

Bucardo 22.12.14 19:00

Danke traderdoc für die schnelle Hilfe! Ich habe den Code entsprechend verändert und es funktioniert einwandfrei :)

Leider hat sich beim Testen gleich ein neues Problem aufgetan. Meine OrderModify-Funktion läuft nicht mehr. Ich hatte eben kurz eine Version, die funktionierte, war kurz abgelenkt und finde jetzt nicht mehr den Fehler...

Letztendlich soll die Order mit Preis, SL und TP so modifiziert werden, dass sie über einen definierten Zeitraum mit den aktuellen Preisen mitläuft. Im Moment bleiben die Parameter aber unverändert so, wie sie bei der Orderaufgabe festgelegt wurden.

Hier der Code:

void DoModify()
{

for (int i = 0; i < OrdersTotal(); i++)
{
ph2=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol() &&(OrderType()==OP_BUYSTOP))
{
if ((OrderOpenPrice()>BuyStop_Preis) || (OrderOpenPrice()<BuyStop_Preis))
{
Alert("BuyStop OrderModifikation ausgeführt, BuyStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(BuyStop_Preis,5));
ph3 = OrderModify(OrderTicket(),Ask + PipDifferenz*Point,(Ask + PipDifferenz*Point) - StopLoss*Point,(Ask + PipDifferenz*Point) - StopLoss*Point,0,Red);
}
}
if (OrderSymbol()==Symbol() && (OrderType()==OP_SELLSTOP))
{
if ((OrderOpenPrice() > SellStop_Preis) || (OrderOpenPrice() < SellStop_Preis))
{
/*Alert("SellStop OrderModifikation ausgeführt, SellStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(SellStop_Preis,5));*/
ph4 = OrderModify(OrderTicket(),Bid - PipDifferenz*Point,(Bid - PipDifferenz*Point) + StopLoss*Point,(Bid - PipDifferenz*Point) - TakeProfit*Point,0,Red);
}
}

}
}


Gruß Bucardo

traderdoc 22.12.14 19:21

Code:

void DoModify() {
  for (int i = 0; i < OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP) {
            if (OrderOpenPrice() != BuyStop_Preis) {
              ph3 = OrderModify(OrderTicket(), Ask + PipDifferenz*Pt, Ask + (PipDifferenz - StopLoss)*Pt, Ask + (PipDifferenz + TakeProfit)*Pt, 0, Red);
            }
            if (ph3) {
              Alert("BuyStop OrderModifikation ausgeführt, BuyStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(BuyStop_Preis,5));
              continue;
            }
            if (OrderSymbol() == Symbol() && OrderType() == OP_SELLSTOP) {
              if (OrderOpenPrice() != SellStop_Preis) {
                  ph4 = OrderModify(OrderTicket(), Bid - PipDifferenz*Pt, Bid - (PipDifferenz + StopLoss)*Pt, Bid - (PipDifferenz - TakeProfit)*Pt, 0, Red);
              }
              if (ph4) {
                  Alert("SellStop OrderModifikation ausgeführt, SellStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(SellStop_Preis,5));
              }
            }
        }
      }
  }
}


Rob 15.06.15 15:24

Hallo Bucardo,
seit einigen Wochen verfolge ich auch die Strategie zum Newstrading, bzw. habe ein EA dazu erstellt. Leider bin ich erst jetzt auf Dein Programm gestoßen :rolleyes:

Mein EA ist auch so aufgebaut, dass ich 20-10 Sek vor der Nachricht 2 PendingOrder platziere und kurz danach manuell wieder aussteige.

Werden Deine Pending Order immer sofort platziert? Bei mir passiert es manchmal, dass eine Order nicht gesetzt wird und meine CPU-Leistung nach oben geht.

Mich würde wirklich brennend interessieren, ob Du damit schon positive Erfolge erzielen konntest? :D

Gruß Rob


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