Wieso gibt es nur eine Order und danach keine neuen Signale mehr (MA Strategie)

 

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


extern int MA_langperiode=110;
extern int MA_kurzperiode =42;


extern double Lot=0.01;
int Slippage=2;
int LongOrder,ShortOrder;
int MagicNummer=12345;
bool SL_Setzen,TP_Setzen,SL_Setzen2,TP_Setzen2;

static int Ordersiglong,Ordersigshort;

void OnTick()
  {


      double MAlanghandle=iMA(NULL,0,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,0);
      double MAlangVorperiode=iMA(NULL,0,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,1);
      double MAlangVorvorperiode=iMA(NULL,0,MA_langperiode,0,MODE_SMA,PRICE_CLOSE,2);

      double MAkurzhandle=iMA(NULL,0,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,0);
      double MAkurzVorperiode=iMA(NULL,0,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,1);
      double MAkurzVorvorperiode=iMA(NULL,0,MA_kurzperiode,0,MODE_SMA,PRICE_CLOSE,2);

      static datetime lastOrderSend;

      if(Time[0]!=lastOrderSend)
        {
         Comment("works");
         if(MAkurzhandle>MAlanghandle && (MAkurzVorperiode<=MAlangVorperiode /*||MAkurzVorvorperiode<MAlangVorvorperiode*/)) { Print("2works"); Comment("2works"); Ordersigshort=false; Ordersiglong=true;} 
           else {Print("2no");Comment("2no");}
         if((Time[3])!=lastOrderSend && Bid>=MAkurzhandle && Ordersiglong==true)
           {
            LongOrder=OrderSend(Symbol(),OP_BUY,Lot,Bid,10,0,0,"einfach Long",MagicNummer,0,Green);
            Ordersiglong=false;
            lastOrderSend=Time[0];
            Print("3works");Comment("3works");
           }
         else{Print("3no");Comment("3no");}

         //Short
         if(MAkurzhandle<MAlanghandle && (MAkurzVorperiode>=MAlangVorperiode /*||MAkurzVorvorperiode>MAlangVorvorperiode*/)){Print("2works");Comment("2works"); Ordersiglong=false; Ordersigshort=true;}
          else {Print("2no");Comment("2no");}
         if((Time[3])!=lastOrderSend && Ask<=MAkurzhandle && Ordersigshort==true)
           {
            ShortOrder=OrderSend(Symbol(),OP_SELL,Lot,Ask,10,0,0,"einfach Short",MagicNummer,0,Green);
            //ShortOrder++;
            Ordersigshort=false;
            lastOrderSend=Time[0];
            Comment("3works");
           }
         else{Print("3no");Comment("3no");}
        }
      if(Ordersiglong==true){Comment("SigLong");}
      if(Ordersigshort==true){Comment("SigShort");}
 

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ß

 

@Christian

@Carl Schreiber

Habs nochmal verständlicher (& vollständig) aufgeschrieben (und paar leichte änderungen gemacht-> Löst nun allerdings undendlich viele Orders aus), Habt ihr nh idee was ich noch machen kann? (Fehler liegt evtl bei der Verwendung von Time[X], gehe davon aus, dass ich so den Zeitraum einer bestimmten bar erwische (z.B. bei M_30 ->  Time[0] = 15:30 bis 16:00, stimmts?)
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?

  1. 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!

  2. Lass einmal den Styler (Ctrl ,) über Deinen Code laufen!

  3. 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 !

Dateien:
 
Christian:

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.

Programmiergrundlagen: Variablen, Datentypen, Algorithmen
Programmiergrundlagen: Variablen, Datentypen, Algorithmen
  • 2016.04.11
  • Redaktion
  • entwickler.de
Programmierung basiert im Wesentlichen darauf, den richtigen Aufbau des Programms zu wählen (Architektur) und innerhalb dieser Struktur die Lösungen für die Problemstellung richtig, effizient, wartungsfreundlich und gemäß den neusten Erkenntnissen der Informatik umzusetzen. Um Programme zu erstellen, die diesen Anforderungen genügen, ist es...
 
Otto Pauser:

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

Grund der Beschwerde: