|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
||||
Eigene Funktion für Orderaufgabe
Hallo mal wieder
ich versuche mich immer weiter an neuen codes, bzw. schreibe die alten Codes um. Ich habe versucht, meinen ersten Code mal etwas anders zu fassen und ihn so schneller zu machen. Dazu wollte ich eigentlich die verschiedenen Orderaufgaben in eigene Funktionen schreiben. Leider gibt der EA aktuell gar keine Order aus, geschweige denn kommuniziert irgendwie mit dem MT....Könnt ihr mir vielleicht meinen Fehler zeigen? Code:
//+------------------------------------------------------------------+ //| Neuer Versuch neu.mq4 | //| Korbinian Gabriel | //| - | //+------------------------------------------------------------------+ #property copyright "Korbinian Gabriel" #property link "-" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ /*Idee: Wenn ATR unter bestimmten Wert ist, dann werden Trades sofort auf break even gezogen, sobald es möglich ist; Aktuell liegt noch ein Fehler im Ordersendverfahren vor*/ //--- Extern variables extern int Mx=0; extern int abst=3; extern int irsi=14; extern int iboll=20; extern int st1=10; extern double st2=3.0; extern int slippage = 100; extern double takeprofit = 0; extern bool autostoploss = true; extern double manualsl = 20; extern int magicnumber = 1; extern double Lots = 1.0; //--- Intern variables int Oldbar = 0; double st1_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1); double st1_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1); double st2_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2); double st2_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2); double BBUP = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_UPPER,0); double BBDN = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_LOWER,0); double rsi1 = iRSI(NULL,0,irsi,PRICE_CLOSE,1); double rsi0 = iRSI(NULL,0,irsi,PRICE_CLOSE,0); // hier möglicherweise die zahl zu 2 tauschen int autosl,stoploss; //--- Functions int anzTradesLong() { int ord=0; int total = OrdersTotal(); for(int i=0;i<=total-1;i++) { if(OrderSelect(i,SELECT_BY_POS) && OrderType() == OP_BUY && OrderSymbol() == Symbol()) ord++; } return (ord); } int anzTradesShort() { int ord=0; int total = OrdersTotal(); for(int i=0;i<=total-1;i++) { if(OrderSelect(i,SELECT_BY_POS) && OrderType() == OP_SELL && OrderSymbol() == Symbol()) ord++; } return (ord); } bool long_st(){ return st1_long < Close[1] && st1_short > Close[2]; } bool short_st(){ return st1_long > Close[1] && st1_short < Close[2]; } //--- Look for the orderexecution: void execution(){ if(OrdersTotal() > 0) Print("Order successfully placed",OrderMagicNumber(),OrderStopLoss(),OrderSymbol(),OrderType()); else Print("ERROR while placing order occured!", GetLastError()); } //Maybe rsi signal for orderopening!! int ordersend; void OpenLongOrderatBB(){ ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit,"Open Pending Long Order at upper Bollinger Band",magicnumber,0,Green); if(ordersend == 0) Alert("OrderSend ERROR LongOrder NOT opened!", GetLastError()); if(ordersend != 0) Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit()); } void OpenShortOrderatBB(){ ordersend = OrderSend(NULL,OP_SELL,Lots,BBDN,slippage,stoploss,takeprofit,"Open Pending Short Order at lower Bollinger Band",magicnumber,0,Red); if(ordersend == 0) Alert("OrderSend ERROR ShortOrder NOT opened!", GetLastError()); if(ordersend != 0) Print("Opened ShortOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit()); } void OpenLongOrderMarket(){ ordersend = OrderSend(NULL,OP_BUY,Lots,Ask,slippage,stoploss,takeprofit,"Open Market Long Order",magicnumber,0,Green); if(ordersend == 0) Alert("OrderSend ERROR LongOrder NOT opened!", GetLastError()); if(ordersend != 0) Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit()); } void OpenShortOrderMarket(){ ordersend = OrderSend(NULL,OP_BUY,Lots,Bid,slippage,stoploss,takeprofit,"Open Market Short Order",magicnumber,0,Red); if(ordersend == 0) Alert("OrderSend ERROR ShortOrder NOT opened!", GetLastError()); if(ordersend != 0) Print("Opened ShortOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit()); } //--- On expert-advisor initiation int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int start() { if(Oldbar != Bars) { //--- //---Stoplossdefinition if(OrderType() == OP_BUY) autosl = st1_long - abst; if(OrderType() == OP_SELL) autosl = st1_short + abst; if(autostoploss == true) stoploss = autosl; if(autostoploss == false) stoploss = manualsl; //--- Initializing Orders if(st1_long < st2_short) OpenLongOrderatBB(); execution(); if(st1_long < st2_short && Close[1] > BBUP) OpenLongOrderMarket(); execution(); if(st2_long > st1_short) OpenShortOrderatBB(); execution(); if(st2_long > st1_short && Close[1] < BBDN) OpenShortOrderMarket(); execution(); //--- Closing Orders if(rsi1 < 30 && rsi0 > 30) { int total = OrdersTotal(); for(int i=0;i<=total-1;i++) { if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird. if(OrderCommission()+OrderProfit()+OrderSwap()>0) { Print ("Order closing now, because of RSI-Signal!"); bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS),OrderLots(),Ask,10); //Komisch: Wenn ich SELECT_BY_TICKET auswähle, funktioniert der Trailingstop nicht if (result == true) Print ("Orderclosing ",OrderTicket()," succeeded"); else Print ("Orderclosing ",OrderTicket()," failed"); } } } } if(rsi1 > 70 && rsi0 < 70) { int total = OrdersTotal(); for(int i=0;i<=total-1;i++) { if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird. if(OrderCommission()+OrderProfit()+OrderSwap()>0) { Print ("Order closing now, because of RSI-Signal!"); bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS),OrderLots(),Bid,10); //Komisch: Wenn ich SELECT_BY_TICKET auswähle, funktioniert der Trailingstop nicht if (result == true) Print ("Orderclosing ",OrderTicket()," succeeded"); else Print ("Orderclosing ",OrderTicket()," failed"); } } } } } Oldbar = Bars; return(0); } //+------------------------------------------------------------------+ trololotromberino
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter! Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten: www.expert-advisor.com/etsbh |
|
|||
Nur mal grob überflogen.
Die Variablen: double st1_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1); double st1_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1); double st2_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2); double st2_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2); double BBUP = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_UPPER,0); double BBDN = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_LOWER,0); double rsi1 = iRSI(NULL,0,irsi,PRICE_CLOSE,1); double rsi0 = iRSI(NULL,0,irsi,PRICE_CLOSE,0); // hier möglicherweise die zahl zu 2 tauschen kommen alle unter if(Oldbar != Bars) { if(OrderType() == OP_BUY) autosl = st1_long - abst; if(OrderType() == OP_SELL) autosl = st1_short + abst; Dazu muß vorher eine offene Order selektiert sein! void OpenLongOrderatBB(){ ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit,"Open void OpenShortOrderatBB(){ ordersend = OrderSend(NULL,OP_SELL,Lots,BBDN,slippage,stoploss,takeprofit,"Open Hier müssen natürlich auch die entsprechenden PendingOrders eingetragen werden! void OpenShortOrderMarket(){ ordersend = OrderSend(NULL,OP_BUY,Lots,Bid,slippage, Das soll doch eine SellOrder werden!! for(int i=0;i<=total-1;i++) { if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird. if(OrderCommission()+OrderProfit()+OrderSwap()>0) { Print ("Order closing now, because of RSI-Signal!"); bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS) Das wäre falsch! ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit, Hier dürfen nicht die nackten Pipwerte der Marken genommen werden, sondern die tatsächlichen Preise! Wenn ich Dir einen guten Ratschlag geben darf: Beim Programmieren das jeweilige MQL-Wort markieren und F1 drücken und genau die Hilfe durchlesen. Das geht schneller als auf diesem Deinen Weg. Und v.a. sich an fertigen lauffähigen Programmen orientieren. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
Was ich noch nicht ganz verstanden habe, ist, dass wenn ich die Variablen unter das Oldbars schreibe (also auch unter int start), er mir dann sagt, dass diese Variablen für die void Funktionen nicht zur Verfügung stehen (sie sind nicht definiert). Wenn ich aber die void Funktionen noch unter die Variablen schreibe, geht das nicht, weil void nicht in die start Funktion darf.
Kann man void irgendwie ersetzen? Weil ich kann die oldbar Funktion ja auch nicht aus der start Funktion raus nehmen.....
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter! Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten: www.expert-advisor.com/etsbh |
|
||||
Das vorherige Problem konnte ich lösen, indem ich die Variablen vor der Start-Funktion nannte und in dieser dann definierte.
Allerdings bin ich jetzt auf ein neues großes Problem gestoßen: Ich kriege, egal was ich mache, immer einen Fehler Error 4107. F1 oder Google haben nicht geholfen. Ich habe versucht es durch *Point oder auch durch NormalizeDouble(stoploss,Digits()) probiert, aber ich kriege ihn immernoch. Der Code ist sehr umfangreich, ich werde ihn trotzdem mal anheften. Ansonsten sind hier die Dinge, die mit dem Stoploss zu tun haben: Code:
int start(){ .... //---Stoplossdefinition if(OrderType() == OP_BUY || OrderType() == OP_BUYSTOP) stoploss = st1_long - abst; if(OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) stoploss = st1_short + abst; NormalizeDouble(stoploss,Digits()); //--- Trailingstoploss if(OrdersTotal() > 0){Trailingstoploss();} if(OrdersTotal() > 0){ClosingTrades();} OpenLongOrderatBBModify(); OpenShortOrderatBBModify(); } void OpenLongOrderatBB(){ new_del(); ordersend = OrderSend(NULL,OP_BUYSTOP,Lots,NormalizeDouble(BBUP,Digits()),slippage,stoploss*Point,takeprofit,"Open Pending Long Order at upper Bollinger Band",magicnumber,0,Green); if(ordersend < 0) Alert("OrderSend ERROR LongOrder at BB NOT opened! ", GetLastError()); else Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit()); } .... void OpenLongOrderatBBModify(){ for(int i=0;i<=total-1;i++) { if(OrderSelect(i,SELECT_BY_TICKET) && OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderCloseTime()==0 && OrderType()==OP_BUYSTOP ) { if(OrderOpenPrice() < BBUP) { ordermodify = OrderModify(OrderTicket(),NormalizeDouble(BBUP,Digits()),stoploss*Point,takeprofit,0); if (ordermodify == false) Print("Stoploss ",OrderTicket()," NICHT nachgezogen! ERROR!"); else Print("StopLoss ",OrderTicket()," nachgezogen"); } } } } //--- Dieser Teil löscht unausgeführte Pending Orders. int new_del() { int i,a; int total = OrdersTotal(); string comentario,par; for (i=total-1; i >=0; i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if (OrderType()==OP_BUY || OrderType()==OP_SELL) { for (a=total-1; a >=0; a--) { OrderSelect(a,SELECT_BY_POS,MODE_TRADES); comentario=OrderComment(); par=StringSubstr(comentario,0,6); if(OrderType()==OP_SELLSTOP)// && comentario==Symbol()) { OrderDelete(OrderTicket()); Print("Deleting SELL_STOP"," Ordertype:",OrderType()); return(1); } if(OrderType()==OP_BUYSTOP)// && par==Symbol()) { OrderDelete(OrderTicket()); Print("Deleting BUY_STOP"," Ordertype:",OrderType()); return(1); } } } } return(1); } LG
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter! Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten: www.expert-advisor.com/etsbh |
|
||||
Danke, aber ich kann es irgendwie nicht öffnen. Auch wenn ich es umbenenne oder so.
Ich weiß, was der Fehlercode heißt, aber ich weiß nicht, was der Fehler an meinem Code ist. Nach Suche habe ich dann das Beschriebene mit *Point und NormalizeDouble gefunden, aber das hat nicht geholfen (zumindest so, wie ich es angewandt habe). LG
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter! Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten: www.expert-advisor.com/etsbh |
Lesezeichen |
Stichworte |
mql4, order, orderabgabe, orderaufgabe, programmierung, programmierung metatrader |
|
|