Hallo Bayne
solche langen Ifs erschweren die eigene Fehlersuche sowie die deren du damit beauftragst :-)
if(MAkurzhandle>MAlanghandle && (MAkurzVorperiode<=MAlangVorperiode /*||MAkurzVorvorperiode<MAlangVorvorperiode*/)) { Print("2works"); Comment("2works"); Ordersigshort=false; Ordersiglong=true;} else {Print("2no");Comment("2no");}
schreibe kurze Ifs..bsp:
if (MAshort_h > MAlong_h && MAshortPre <= MAlongPre ) { Print("2works"); Comment("2works"); Ordersigshort=false; Ordersiglong=true; } else { Print("2no"); Comment("2no"); }
Schreibstiel hin oder her aber diese ellenlangen zeilen sind ungern gesehen.
So kannst du viel besser mit dem Debugger arbeiten weil er ja zeilenweise arbeitet.
Und als Letztes ...deine Code ist unvollständig.
Es geht schneller den selber im Debugger zu jagen als ihn "zu Verstehen" .... verstehst du ?
Grundregel in Code Foren .....
immer lauffähigen Code schicken
...das mögen die Problelöser :-)
Gruß
extern int MA_langperiode=110; extern int MA_kurzperiode =42; static int LongOrder, ShortOrder; extern double SL_prozent=0.21,TP_prozent=0.28; bool SL_Setzen,TP_Setzen,SL_Setzen2,TP_Setzen2; double StopLossShort,StopLossLong,TakeProfitShort,TakeProfitLong; static bool siglong,sigshort; static datetime lastOrderlong,lastOrdershort,lastSig; double Lot = 0.01; int MagicNummer =12345; int Slippage=2; int Handelsbeginntag=0,Handelsendetag=5,HandelsbeginntagUhrzeit=23,HandelsendetagUhrzeit=23; extern int HandelsbeginnUrhzeit=13,HandelsendeUhrzeit=17; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- double MAlanghandle =iMA (NULL,PERIOD_M30,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,0); double MAkurzhandle = iMA(NULL,PERIOD_M30,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,0); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() {//Order Auslösen //Long //if (DayOfWeek()==0 && Hour()<23 && DayOfWeek()==5 && Hour()<23){return(0);} if(DayOfWeek()==Handelsbeginntag && Hour()<HandelsbeginntagUhrzeit && DayOfWeek()==Handelsendetag && Hour()<HandelsendetagUhrzeit){return;} //else if (DayOfWeek()==5 && Hour()>23){return(0);}//lohnt sich nur bei backtesting ab 6 Monaten else if(Hour()>HandelsbeginnUrhzeit && Hour()<HandelsendeUhrzeit) { double MAlang=iMA(NULL,0,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,0); double MAlangVor=iMA(NULL,0,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,1); double MAlangVorvor=iMA(NULL,0,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,2); double MAkurz=iMA(NULL,0,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,0); double MAkurzVor=iMA(NULL,0,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,1); double MAkurzVorvor=iMA(NULL,0,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,2); // erstes Signal if (MAkurz>MAlang && (MAkurzVor>MAlangVor || MAkurzVor> MAlangVor || (Time[0]|| Time[1]) == (lastOrderlong||lastOrdershort))) {Comment("nodamnsig");} //wenn ma schon länger darüber liegt (=darüber aber davor auch schon, bzw kein frisches crossing)|| Letzte Order vorhin ausgefürht wurde.=> kein sig else if (MAkurz>=MAlang && MAkurzVor<=MAlangVor && (Time[0]|| Time[1]) != lastOrderlong) {sigshort=false;siglong=true;lastSig=Time[0];} //wenn Makurz frisch MAlang von unten nach oben durchkreuzt => neues sig (altes verfällt falls da) else if (MAkurz<=MAlang && MAkurzVor>=MAlangVor && (Time[0]|| Time[1]) != lastOrdershort) {siglong=false;sigshort=true;lastSig=Time[0];}//wenn Malang frisch MAkurz von oben nach unten durchkreuzt => neues sig (altes verfällt falls da) // wenn 2tes signal (Preis über/unter MAkurz => Einstieg. if (siglong ==true && (Time[3]||Time[2]||Time[1] || Time[0])!= lastOrderlong && Bid>=MAkurz){ // Wenn sig + Letzte Order länger als 3 kerzen her + Bid endlich über dem dem MAkurz (2tes Signal) => Einstieg LongOrder=OrderSend(Symbol(),OP_BUY,Lot,Bid,10,0,0,"einfach Long",MagicNummer,0,Green);//Einstieg siglong=false; //erstes Signal => false setzen, da es nur einmal verwendet werden soll. lastOrderlong =Time[0];// => letzte Ordersetzungszeit aktualisieren } if (sigshort ==true && (Time[3]||Time[2]||Time[1]|| Time[0])!=lastOrdershort && Ask<=MAkurz){//Wenn sig + Letzte Order länger als 3 kerzen her + Bid endlich über dem dem MAkurz (2tes Signal) => Einstieg ShortOrder=OrderSend(Symbol(),OP_SELL,Lot,Ask,10,0,0,"einfach Short",MagicNummer,0,Green);//Einstieg sigshort=false; // erstes Signal => false setzen, da es nur einmal verwendet werden soll. lastOrdershort =Time[0];// => letzte Ordersetzungszeit aktualisieren } //------------------------------------------------------------------------------- //SL & TP für LongOrder setzen if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true && OrderCloseTime()==0) { //SL if(OrderStopLoss()==false)//Order noch nicht geschlossen & SL nochnicht gesetzt { StopLossLong=NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits); SL_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),StopLossLong,OrderTakeProfit(),0,Yellow);GetLastError(); } //TP if(OrderTakeProfit()==false) //Order noch nicht geschlossen & TP nochnicht gesetzt { TakeProfitLong=NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits); TP_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfitLong,0,Orange);GetLastError(); } } //SL & TP für ShortOrder setzen if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true && OrderCloseTime()==0) { if(OrderStopLoss()==false) //Order noch nicht geschlossen & SL nochnicht gesetzt { StopLossShort=NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits); SL_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),StopLossShort,OrderTakeProfit(),0,Yellow);GetLastError(); } if(OrderTakeProfit()==false) //Order noch nicht geschlossen & TP nochnicht gesetzt { TakeProfitShort=NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits); TP_Setzen=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfitShort,0,Orange);GetLastError(); } } //--- } } //+------------------------------------------------------------------+
ich wurschtel mich da nicht durch.
MQL4 können andere besser
Gruß
Ps: Immernoch sehr sehr sehr unleserlich Bayne
Bayne, wieso quälst Du Dich so?
- Es gibt sicher dutzende EAs, die Deine Idee handeln oder leicht dahingehend abgewandelt werden können!
Beginne mal mit "Moving Average.mq4" in \Experts\.
Ich glaube das ist Teil des Standardpaketes des MT4!
Sonst such in der CodeBase oder unter den Artikeln (siehe oben!)
Bedenke: Es gibt fast nix, was nicht schon für MT4/MT5 programmiert wurde! - Lass einmal den Styler (Ctrl ,) über Deinen Code laufen!
- Wenn zu viele Positionen eröffnet werden ist der Debugger das Mittel der Wahl!!
Setz den Haltepunkt bei der Ordereröffnung und gehe dann Schrittweise weiter und beobachte die entscheidenden Variablen.
2 Min mit dem MQl5 Wizard.
Fertig ist der MACD Ea !
if (MAkurz>MAlang && (MAkurzVor>MAlangVor || MAkurzVor> MAlangVor || (Time[0]|| Time[1]) == (lastOrderlong||lastOrdershort))) {Comment("nodamnsig");} //wenn ma schon länger darüber liegt (=darüber aber davor auch schon, bzw kein frisches crossing)|| Letzte Order vorhin ausgefürht wurde.=> kein sig else if (MAkurz>=MAlang && MAkurzVor<=MAlangVor && (Time[0]|| Time[1]) != lastOrderlong) {sigshort=false;siglong=true;lastSig=Time[0];} //wenn Makurz frisch MAlang von unten nach oben durchkreuzt => neues sig (altes verfällt falls da) else if (MAkurz<=MAlang && MAkurzVor>=MAlangVor && (Time[0]|| Time[1]) != lastOrdershort) {siglong=false;sigshort=true;lastSig=Time[0];}//wenn Malang frisch MAkurz von oben nach unten durchkreuzt => neues sig (altes verfällt falls da)
Ich würde mich ja gerne mehr einbringen, bin aber gerade in wärmeren Gefielden und erst ab Dezember wieder am PC.
Und mit dem Tablet ist es eine Qual da was zu posten.
Obiger Codeblock ist viel zu kompliziert aufgebaut. (Time[0]|| Time[1]) gibt für mich keinen Sinn,
Die Abfrage boolscher Variablen wie if(boolwert==true) deuten auf Unerfahrenheit. if(boolwert) wäre korrekt.
Das beeinflusst den Programmablauf aber nicht.
if(!boolwert) entspricht if(boolwert==false)
So ist das Otto wenn einem einfachste Programmiergrundlagen fehlen.
Bayne stöber doch mal ein wenig hier : https://entwickler.de/online/development/einfuehrung-programmierung-grundlagen-teil-1-197189.html
und dann hier : https://entwickler.de/online/development/einfuehrung-programmierung-variablen-datentypen-algorithmen-197249.html
Kannst auch in der Bahn oder am Strand üben , apps fürs Handy sind mitlweweile auch sehr einfach .
https://www.sololearn.com/ macht sehr schöne Tutorials Apps besser als jedes Buch weil der Compiler schon mit dabei ist.
Einfach immer wenn du etwas Zeit hast.
- 2016.04.11
- Redaktion
- entwickler.de
Ich würde mich ja gerne mehr einbringen, bin aber gerade in wärmeren Gefielden und erst ab Dezember wieder am PC.
Und mit dem Tablet ist es eine Qual da was zu posten.
Obiger Codeblock ist viel zu kompliziert aufgebaut. (Time[0]|| Time[1]) gibt für mich keinen Sinn,
Die Abfrage boolscher Variablen wie if(boolwert==true) deuten auf Unerfahrenheit. if(boolwert) wäre korrekt.
Das beeinflusst den Programmablauf aber nicht.
if(!boolwert) entspricht if(boolwert==false)
@@otto, ich bin ja auch oldscool, also ich verwende immer die langversion =true, ich tu mir einfacher mit dem lesen
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo liebe MQL Erfahrene,
Ein Problem in folgendem Code:
Eigentlich sollte ein Signal (Long/Short) gesetzt werden, wenn der kleine MA über den Großen kommt.
dieses Signal sollte so lange als true gelten, bis der Kurs über den Kleinen MA kommt. Danach sollte dann eine Order ausgelöst werden.
(wenn dies nicht der Fall ist, und irgendwann ein entgegengesetztes Signal aufkommt (z.b.short) dann soll das bisherige Signal =false gesetzt werden und das andere = true)
Mein Problem: das ganze klappt anscheinend nur bei der ersten Order, danach macht der EA nichts mehr, (habe mit Commet() und Print() funktionen gesetzt, damit man sehen kann wo genau der EA nicht durch kommt. Es kommt nichtmal ein Signal, wenn ich das MA Crossing klar im chart erkennen kann.
Jmd nh idee wieso da kein neues signal erkannt wird?
Thx