Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   EA berechnet zweiten Zeitstempel nicht zur gewünschten Zeit (http://www.expert-advisor.com/forum/showthread.php?t=7391)

murkel 13.02.24 18:41

EA berechnet zweiten Zeitstempel nicht zur gewünschten Zeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
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);
 
}

Schon jetzt vielen Dank für eure Hilfe. :-)

murkel

traderdoc 14.02.24 11:36

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

murkel 27.02.24 19:16

Dies ist nun mein dritter Versuch, mich bei traderdoc für seine Antwort zu bedanken. Die ersten beiden Versuche wurden leider nicht veröffentlicht.


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:50 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum