Frage zu meinem EA

 

Hallo,

ich habe neu angefangen mit mql4. Kämpfe mich gerade ein wenig durch die Materie.

Ich habe eine EA erstellt, bei dem eingestellt werden kann an welchen Tagen und zu welcher Uhrzeit ein Trade abgesetzt werden soll. Seitdem ich die Tagesfilterung eingebaut habe, können keine Trades mehr abgesetzt werden. Die Zeitfilterung alleine funktiert.

Vllt hat jmd Lust mir kurz unter die Arme zu greifen - komme nicht mehr weiter.

// Input Variable
input int OpeningHour = 12;
input int OpeningMinute = 0;
input int ClosingHour = 13;
input int ClosingMinute = 0;

input int Monday    = 1;
input int Tuesday   = 1;
input int Wednesday = 1;
input int Thursday  = 1;
input int Friday    = 1;

// Global Variable
int Ticket;


int OnInit()
{
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
   
}
void OnTick()
{

               datetime ExecutionTime = iTime(_Symbol,PERIOD_D1,0) + PeriodSeconds(PERIOD_H1) * OpeningHour + PeriodSeconds(PERIOD_M1) * OpeningMinute;
               datetime ClosingTime = iTime(_Symbol,PERIOD_D1,0) + PeriodSeconds(PERIOD_H1) * ClosingHour + PeriodSeconds(PERIOD_M1) * ClosingMinute;
               
               MqlDateTime dt;
               TimeToStruct(TimeCurrent(), dt);
               
                 if ((dt.day_of_week == 1)        && (Monday) ||
                     (dt.day_of_week == 2)        && (Tuesday) ||
                     (dt.day_of_week == 3)        && (Wednesday) ||
                     (dt.day_of_week == 4)        && (Thursday) ||
                     (dt.day_of_week == 5)        && (Friday))
                {
                  if(Ticket <= 0){
                     if(TimeCurrent() == ExecutionTime){
                        Ticket = OrderSend(_Symbol,OP_BUY,0.01,Ask,1000,0,0,"Order Comment",clrBlue);
                     }
                  }                
                }
                
               if(TimeCurrent() == ClosingTime){
                  if(OrderSelect(Ticket, SELECT_BY_TICKET)){
                        if(OrderClose(Ticket,OrderLots(),Bid,1000,clrYellow)){
                                 Ticket = 0;
                        }
                  }
               }
               
                     

}

Nach dem Kompilen kommen diverse Fehlermeldungen:

check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       39      63
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       40      51
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       40      64
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       41      51
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       41      66
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       42      51
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       42      65
check operator precedence for possible error; use parentheses to clarify precedence     DateTime Test.mq4       43      51

Der EA läuft im MT4 Strategytester durch - Order absetzen endet in einer Fehlermeldung

2018.12.16 06:01:27.861 2018.01.04 12:00:00  DateTime Test EURUSD,H1: OrderSend error 131


wäre dankbar über ein wenig Hilfe

Gruß

 
  1. Herzlich Willkommen und viel Erfolg!
  2. Allgemeiner Tipp:
    Erst suchen! Es gibt fast nix, was nicht schon für Mt4/5 programmiert wurde!
    Warum das Rad neu erfinden, wenn es in der CodeBase liegt, bereit zum abkupfern?
    Daher vielleicht zuerst suchen in der CodeBase, Foren, Artikeln, Google (zB. "mt4 orderSend time of day"
  3. Deine Compiler-Fehlermeldung ist eine Warnung, weil Du && und || mischt und es unklar ist welches 'zuerst kommen soll' => ganz einfach Klammern richtig setzen, dann ist das weg.
  4. Zum 131 Fehler: Über F1 und Suche 131 kommst DU zu den Fehlercodes. 131 = ERR_INVALID_TRADE_VOLUME = falsches Volumen
  5. Prüfe den Programmablauf mit dem Debugger, mit ihm kannst Du 'lve' verfolgen wie sich die Variablenwerte entwickeln...


 

Hallo,


bin jetzt kein MT4 Experte mehr aber das sieht doch ein wenig kompliziert aus

in MT4 gibts ja die fixen Punkte

DayOfWeek();
Hour();
Day();
Minute();
Sekunde();

damit sparst Du dir auch das Umrechnen der datetime.

Auf die Werkte kannst Du direkt zugreifen

if (DayOfWeek() == 1 && Hour() ==xx && Minute() == xx)
{
was immer du auch machen willst ;
}


ausserdem würde ich die Wochentage als bool definieren, dann gibts nur true oder false.

 

@Carl Schreiber & amando

Dankeschön. ich schaue es mir mal an.

Ich google seit 3 Tagen wie verrückt. Konnte dazu nicht wirklich was finden. Das was ich gefunden hab, funktionierte nicht.

den Code von @amando hab ich auch schon ausprobiert.. der funktioniert nicht

 
sYsinho:

@Carl Schreiber & amando

Dankeschön. ich schaue es mir mal an.

Ich google seit 3 Tagen wie verrückt. Konnte dazu nicht wirklich was finden. Das was ich gefunden hab, funktionierte nicht.

den Code von @amando hab ich auch schon ausprobiert.. der funktioniert nicht

zum einen ist mal der Block falsch

                 if ((dt.day_of_week == 1)        && (Monday) ||
                     (dt.day_of_week == 2)        && (Tuesday) ||
                     (dt.day_of_week == 3)        && (Wednesday) ||
                     (dt.day_of_week == 4)        && (Thursday) ||
                     (dt.day_of_week == 5)        && (Friday))

hier stimmt die Klammersetzung nicht.

Du musst die Abfragen mit Klammern seperat trennen, deine Klammer sind, ich sags ungern, sinnlos. Du klammerst einen einzelnen Ausdruck. Das mag zwar zum ansehen schön sein, bringt aber programmteschnisch nichts.

Wenn ich deinen Code so ansehe, musst Du die Klammern in den Zeilen setzen 

 
amando:

zum einen ist mal der Block falsch

hier stimmt die Klammersetzung nicht.

Du musst die Abfragen mit Klammern seperat trennen, deine Klammer sind, ich sags ungern, sinnlos. Du klammerst einen einzelnen Ausdruck. Das mag zwar zum ansehen schön sein, bringt aber programmteschnisch nichts.

Wenn ich deinen Code so ansehe, musst Du die Klammern in den Zeilen setzen 

So sehe ich das ebenso. Die Klammern müssten meines Erachtens so gesetzt werden, um sinnvoll zu sein:

if ((dt.day_of_week == 1       && Monday) ||

     (dt.day_of_week == 2      && Tuesday) ||

     (dt.day_of_week == 3      && Wednesday) ||

     (dt.day_of_week == 4      && Thursday) ||

     (dt.day_of_week == 5      && Friday))