Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43252
Benutzer: 7.220
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: JosephTK
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 9 Stunden
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 3 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 451
Gesamt: 452
Team: 0
Team:  
Benutzer:  murkel
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 22.12.14
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard 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
  #2 (permalink)  
Alt 22.12.14
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 22.12.14
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard

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
  #4 (permalink)  
Alt 22.12.14
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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));
               }
            }
         }
      }
   }
}
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #5 (permalink)  
Alt 15.06.15
Rob Rob ist offline
Neues Mitglied
 
Registriert seit: May 2015
Beiträge: 8
Rob befindet sich auf einem aufstrebenden Ast
Standard

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

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?

Gruß Rob
Thema geschlossen

Lesezeichen

Stichworte
abgabe order, mql4, order, orderaufgabe, pending order, programmierung, programmierung metatrader

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------