|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL5 Hier gehts rund ums Programmieren in MQL5. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
EA berechnet zweiten Zeitstempel nicht zur gewünschten Zeit
Hallo zusammen,
ich habe meinen ersten EA geschrieben, bzw. bin dabei und komme bei folgendem Problem nicht weiter: Der EA soll zum Beginn eines neuen Tages den Vortag, also die Kerze vom Vortag, nach bestimmten Kriterien untersuchen und das Ergebnis zunächst mal als Printausgabe im Journal darstellen. Das hat soweit zur vollsten Zufriedenheit geklappt. Ergebnis war stets um 00:05:00 entweder kein Signal oder Long oder Short oder warum kein Signal. Soweit so gut. Nun möchte ich aber einen weitere Aktion zu einer anderen Zeit mir ausgeben - im Beispiel soll um 12:00 Uhr nur dann was im Journal ausgegeben werden, wenn am Vortag auch nur ein Signal vorhanden war. Hier liegt nun mein Problem: Der EA läuft bis zum ersten Signal korrekt - sprich, wenn kein Signal, auch keine Ausgabe "12:00 Uhr". Ab dem ersten Signal kommt diese Ausgabe dann komplett durcheinander. Mal korrekt, mal nicht, und mal doppelt. Wo liegt der Fehler? Hier der Code, der hoffentlich korrekt angezeigt wird und im Anhang ein Bild vom Journal-Ergebnis. Code:
input ENUM_TIMEFRAMES TimeframeSignal = PERIOD_D1; //Zeiteinheit Signal input string TimeSignalApp = "12:00"; //Anwendungszeit Signal input double MinWick = 1.5; //Docht im Verhältnis zum Körper bool noSignal, longSignal, shortSignal; datetime timeSignal; datetime timeSignalApp; int OnInit(){ return(INIT_SUCCEEDED); } void OnDeinit(const int reason){ } void OnTick(){ //---One-time calculation signal if(timeSignal != iTime(_Symbol,TimeframeSignal,0)){ //iTime = Zeitpunkt der Eröffnung einer Bar calcSignal(); } //---One-time calculation signal application if(timeSignalApp != StringToTime(TimeSignalApp)){ calcSignalApp(); } if(TimeCurrent() == timeSignalApp){ if(shortSignal == true || longSignal == true){ Print("12:00 Uhr"); } } Comment("\nServerzeit: ",TimeCurrent()); } void calcSignal(){ timeSignal = iTime(_Symbol,TimeframeSignal,0); //---Candle 1 double open1 = iOpen(_Symbol,TimeframeSignal,1); double high1 = iHigh(_Symbol,TimeframeSignal,1); double low1 = iLow(_Symbol,TimeframeSignal,1); double close1 = iClose(_Symbol,TimeframeSignal,1); double upperWick = high1 - MathMax(open1,close1); double lowerWick = MathMin(open1,close1) - low1; double candleBodySize = MathMax(open1,close1) - MathMin(open1,close1); double upperWickBodyRatio = upperWick / candleBodySize; double lowerWickBodyRatio = lowerWick / candleBodySize; //---Candle 2 double open2 = iOpen(_Symbol,TimeframeSignal,2); double high2 = iHigh(_Symbol,TimeframeSignal,2); double low2 = iLow(_Symbol,TimeframeSignal,2); double close2 = iClose(_Symbol,TimeframeSignal,2); //---Volume long volumeCandle1 = iVolume(_Symbol,TimeframeSignal,1); long volumeCandle2 = iVolume(_Symbol,TimeframeSignal,2); //---Candle 3 double open3 = iOpen(_Symbol,TimeframeSignal,3); double high3 = iHigh(_Symbol,TimeframeSignal,3); double low3 = iLow(_Symbol,TimeframeSignal,3); double close3 = iClose(_Symbol,TimeframeSignal,3); //---No Signal bool outsideBar = (high1 > high2 && low1 < low2); //first -> second candle bool insideBar1 = (high1 <= high2 && low1 >= low2); //first -> second candle bool insideBar2 = ((high1 <= high3 && low1 >= low3) && (high2 <= high3 && low2 >= low3)); //first -> third candle bool volume = volumeCandle1 > volumeCandle2; //lower volume if(outsideBar == true || insideBar1 == true || insideBar2 == true || volume != true){ noSignal = true; Print("no signal (volume ",volume,", outsidebar ",outsideBar,", insidebar1 ",insideBar1," ,insideBar2 ",insideBar2,")"); }else{ noSignal = false; } //---Short Signal bool higherHigh = (high1 > high2 && low1 >= low2); bool upperWickLength = (upperWickBodyRatio >= MinWick); if(higherHigh == true){ if(upperWickLength == true){ shortSignal = true; Print("SHORT SIGNAL"); }else{ shortSignal = false; Print("no short signal - wick length to small"); } } //---Long Signal bool lowerLow = (low1 < low2 && high1 <= high2); bool lowerWickLength = (lowerWickBodyRatio >= MinWick); if(lowerLow == true){ if(lowerWickLength == true){ longSignal = true; Print("LONG SIGNAL"); }else{ longSignal = false; Print("no long signal - wick length to small"); } } } void calcSignalApp(){ timeSignalApp = StringToTime(TimeSignalApp); } murkel |
|
|||
Die Crux liegt in dieser Zeile:
if(TimeCurrent() == timeSignalApp){ Denn hier wird gefordert, dass TimeCurrent auf die Sekunde genau timeSignalApp entspricht. Nun kommt ein Tick z.B. um 11:59:59 und der nächste kommt 12:00:01. Was macht der EA dann also - nichts!!! traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
zwei zeitstempel |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|