|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
||||
link
denn Code hab ich übrigens hier gefunden:
https://www.youtube.com/watch?v=nQFB...ghzenyeOw_Y68T bin mir nicht ganz sicher ob das Problem evtl an meiner MetaEditor Version 5.00 Build 1035 liegt mich würde auch mal Interessieren ob der Code bei jemand anderem Funktioniert möchte das Problem schon gerne gelöst haben ... würde nämlich gerne damit weiter arbeiten und ihn dann noch weiter ausbauen |
|
|||
Code:
//+------------------------------------------------------------------+ //| Signal Dax.mq4 | //| xxx | //| https://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "xxx" #property link "https://www.mql4.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ // --- Variablen vom Benutzer Festlegen: (Global) //+------------------------------------------------------------------+ extern double HandelsLots = 0.1; // Größe der Handels Lots extern double SL_Prozent = 0.5; // StopLoos in Prozent extern double TP_Prozent = 1.5; // TakeProfit in Prozent extern int MagicNummer = 12345; //+------------------------------------------------------------------+ // --- Variablen fest Festlegen: (Global) //+------------------------------------------------------------------+ datetime PeriondenStartZeit; // zum feststellen einer neuen Perionde bool NeuePeriodeBegonnen; bool LongSignal; bool ShortSignal; int LongOrder; int ShortOrder; // --- String für Dax30 festlegen string syDax = "EUREX.FDX"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- PeriondenStartZeit = Time[0]; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function - Ausführen beim Ende von EA | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function (StartZeit | //+------------------------------------------------------------------+ void OnTick() { //--- double StoppLoss; double TakeProfit; bool OrderAngepasst; // Überprüfen ob ein neuer Periodenbeginn vorliegt if (PeriondenStartZeit != Time[0]) { NeuePeriodeBegonnen = true; PeriondenStartZeit = Time[0]; } else NeuePeriodeBegonnen = false; // --- MA20 für Dax Abfragen double maDAX = iMA(syDax,0,20,0,MODE_SMA,PRICE_CLOSE,0); // ---Aktuellen BID Kurs für Dax Abfragen (letzter Kurs?) double bidDax = MarketInfo(syDax, MODE_BID); // Anzeige auf Bildschirm Print("DAX 30 MA Kurve =",maDAX); //+------------------------------------------------------------------+ //| HandelsSignale ermitteln | //+------------------------------------------------------------------+ if (NeuePeriodeBegonnen == true) { // --- Kauf Signal --- if (bidDax>maDAX) { LongSignal = true; } else LongSignal = false; // --- Verkauf Signal --- if (bidDax<maDAX) { ShortSignal = true; } else ShortSignal = false; } else { LongSignal = false; ShortSignal = false; } //+------------------------------------------------------------------+ //| Kauf / Verkauf Signal umsetzen | //+------------------------------------------------------------------+ // Kaufen if(LongSignal == true) { // Evtl Short Order vorher Schließen if(ShortOrder>0) { if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { bool ShortOrderGeschlossen = OrderClose(ShortOrder,OrderLots(),Ask,10,Blue); if (ShortOrderGeschlossen==true) ShortOrder=0; } } // Jetzt erst Long Order eröffnen while(LongOrder<=0) { LongOrder = OrderSend(syDax,OP_BUY,HandelsLots,Ask,10,0,0,"Dax30 LONG",MagicNummer,0,Green); } } // Verkaufen if (ShortSignal == true) { // Evtl Long Order vorher Schließen if (LongOrder>0) { if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { bool LongOrderGeschlossen = OrderClose(LongOrder,OrderLots(),Bid,10,Blue); if (LongOrderGeschlossen==true) LongOrder=0; } } // Verkaufs Order jetzt eröffnen while(ShortOrder<=0) { ShortOrder = OrderSend(syDax,OP_SELL,HandelsLots,Bid,10,0,0,"Dax30 SHORT",MagicNummer,0,Red); } } //+------------------------------------------------------------------+ //|StopLoos und TakeProfit setzen | //+------------------------------------------------------------------+ // SL bei Long Deals setzen if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderStopLoss()==0) { StoppLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow); } } // SL bei Short Deals setzen if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderStopLoss()==0) { StoppLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow); } } // TP bei Long Deals setzen if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderTakeProfit()==0) { TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange); } } // TP bei Short Deals setzen if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderTakeProfit()==0) { TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange); } } // Ticketnummern nach schließen auf 0 zurücksetzen if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { if(OrderTicket()>0 && OrderCloseTime()>0) LongOrder=0; } if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { if(OrderTicket()>0 && OrderCloseTime()>0) ShortOrder=0; } //+------------------------------------------------------------------+ }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Dann nimm das hier:
Code:
//+------------------------------------------------------------------+ //| Signal Dax.mq4 | //| xxx | //| https://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "xxx" #property link "https://www.mql4.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ // --- Variablen vom Benutzer Festlegen: (Global) //+------------------------------------------------------------------+ extern double HandelsLots = 0.1; // Größe der Handels Lots extern double SL_Prozent = 0.5; // StopLoos in Prozent extern double TP_Prozent = 1.5; // TakeProfit in Prozent extern int MagicNummer = 12345; //+------------------------------------------------------------------+ // --- Variablen fest Festlegen: (Global) //+------------------------------------------------------------------+ datetime PeriondenStartZeit; // zum feststellen einer neuen Perionde bool NeuePeriodeBegonnen; bool LongSignal; bool ShortSignal; int LongOrder; int ShortOrder; // --- String für Dax30 festlegen string syDax = "EUREX.FDX"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- PeriondenStartZeit = Time[0]; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function - Ausführen beim Ende von EA | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function (StartZeit | //+------------------------------------------------------------------+ void OnTick() { //--- double StoppLoss; double TakeProfit; bool OrderAngepasst; // Überprüfen ob ein neuer Periodenbeginn vorliegt if (PeriondenStartZeit != Time[0]) { NeuePeriodeBegonnen = true; PeriondenStartZeit = Time[0]; } else NeuePeriodeBegonnen = false; // --- MA20 für Dax Abfragen double maDAX = iMA(syDax,0,20,0,MODE_SMA,PRICE_CLOSE,0); // ---Aktuellen BID Kurs für Dax Abfragen (letzter Kurs?) double bidDax = MarketInfo(syDax, MODE_BID); // Anzeige auf Bildschirm Print("DAX 30 MA Kurve =",maDAX); //+------------------------------------------------------------------+ //| HandelsSignale ermitteln | //+------------------------------------------------------------------+ if (NeuePeriodeBegonnen == true) { // --- Kauf Signal --- if (bidDax>maDAX) { LongSignal = true; } else LongSignal = false; // --- Verkauf Signal --- if (bidDax<maDAX) { ShortSignal = true; } else ShortSignal = false; } else { LongSignal = false; ShortSignal = false; } //+------------------------------------------------------------------+ //| Kauf / Verkauf Signal umsetzen | //+------------------------------------------------------------------+ // Kaufen if(LongSignal == true) { // Evtl Short Order vorher Schließen if(ShortOrder>0) { if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { bool ShortOrderGeschlossen = OrderClose(ShortOrder,OrderLots(),Ask,10,Blue); if (ShortOrderGeschlossen==true) ShortOrder=0; } } // Jetzt erst Long Order eröffnen while(LongOrder<=0) { LongOrder = OrderSend(syDax,OP_BUY,HandelsLots,Ask,10,0,0,"Dax30 LONG",MagicNummer,0,Green); } } // Verkaufen if (ShortSignal == true) { // Evtl Long Order vorher Schließen if (LongOrder>0) { if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { bool LongOrderGeschlossen = OrderClose(LongOrder,OrderLots(),Bid,10,Blue); if (LongOrderGeschlossen==true) LongOrder=0; } } // Verkaufs Order jetzt eröffnen while(ShortOrder<=0) { ShortOrder = OrderSend(syDax,OP_SELL,HandelsLots,Bid,10,0,0,"Dax30 SHORT",MagicNummer,0,Red); } } //+------------------------------------------------------------------+ //|StopLoos und TakeProfit setzen | //+------------------------------------------------------------------+ // SL bei Long Deals setzen if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderStopLoss()==0) { StoppLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow); } } // SL bei Short Deals setzen if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderStopLoss()==0) { StoppLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow); } } // TP bei Long Deals setzen if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderTakeProfit()==0) { TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange); } } // TP bei Short Deals setzen if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { if(OrderCloseTime()==0 && OrderTakeProfit()==0) { TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_Prozent/100)),Digits); OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange); } } // Ticketnummern nach schließen auf 0 zurücksetzen if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { if(OrderTicket()>0 && OrderCloseTime()>0) LongOrder=0; } if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { if(OrderTicket()>0 && OrderCloseTime()>0) ShortOrder=0; } //+------------------------------------------------------------------+ }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
Super danke, hat funktioniert - jetzt weis ich auch woran es wohl lag
Mich würde aber schon noch interessieren ob es MetaEditor Versionen gibt bei denen der ursprüngliche Code so funktioniert hätte Hatte sowas schon mal Zb. Find ich manchmal folgende Schreibweise vor: Double variable1; variable2; variable3 das Funktioniert so bei meiner Version allerdings nicht Double variable1; Double variable2; Double variable3; Hingegen schon |
|
|||
Double variable1; variable2; variable3
funtioniert schon deshalb nicht, weil Double double und das ; ein , sein muß. Und wenn, dann würde diese Schreibweise funktionieren: double variable1, variable2, variable3; Das: Double variable1; Double variable2; Double variable3; geht auch nicht, s.o., sondern: double variable1; double variable2; double variable3; traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
ok, Komma anstatt Semicolon ...
das mit der Kleinschreibung war mir eigentlich klar ... nur die Autokorrektur am Handy macht halt immer was sie will Hab meinen EA jetzt mal auf dem DemoKonto im Testbetrieb laufen dabei fällt mir auf dass das mit dem TP/SL setzen nicht funktioniert bekomm bei jedem Tick folgende Fehlermeldung: 2015.01.26 10:17:02.387 '2715450': modification of order #21925852 sell 0.10 EUREX.FDX at 10691.00 sl: 0.00 tp: 10533.00 -> sl: 10744.46 tp: 10533.00 failed [Invalid S/L or T/P] woran könnte das liegen? Hab das Demokonto bei VarenGold ... könnte es sein das die das nachträgliche anpassen des TP/SL nicht zulassen? oderkönnte evtl was im Code nicht stimmen? |
|
||||
Zitat:
ein TP wird gesetzt (bei 10533.00) sind ca 1,5% von 10691.00 (erkenne ich auch im Chart an einer Roten Linie mit "OrderNummer TP" allerdings scheint es Probleme mit dem SL zu geben obwohl er das ja wohl offensichtlich richtig errechnet "-> sl: 10744.46" sind 0,5% von 10691.00 wenn ich mir aber die laufende Order ansehe, steht da bei SL 0,00 |
|
||||
ok, ich glaub ich hab das Problem schon mal eingekreist ...
mit hilfe dieses Forum Artikels http://www.expert-advisor.com/forum/...treikt-er.html kommt wohl darauf an wie der Broker die Dax-Werte (Kommastellen) liefert, deswegen tritt wohl der invalid SL bzw. TP auf (denn in der regel liefert der Broker Daten als 9120 oder 9120,0 0der 9120,5). Als SL oder TP werden aber sicherlich häufig Werte errechnet, die als Nachkommastelle keine 0 oder 5 haben und das akzeptiert der Broker nicht und verweigert das OrderModify(). in meinem Fall hatte ich beim Take Profit wohl nur Glück das er bei xxxxx,00 lag mein Broker liefert die Daten in 0,25er Schritten ... (0,25 - 0,5 - 0,75 - 0,00) deswegen akzeptiert er auch meinen sl: 10744.46 nicht Dachte eigentlich das NachkommaStellen Problem währe mit dem Befehl: "Digits" erledigt .... das is aber dann wohl leider doch nicht das gelbe vom Ei Jetzt steh ich also vor dem Problem wie ich das ganze auf 0,25 oder gerne auch auf 0,5 Werte nach dem Komma bekomme |
Lesezeichen |
Stichworte |
code, error, error mql4, fehler, mql4, programmierung, programmierung metatrader |
|
|