Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 13.02.24
murkel murkel ist offline
Neues Mitglied
 
Registriert seit: Feb 2024
Beiträge: 8
murkel befindet sich auf einem aufstrebenden Ast
Standard 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);
   
}
Schon jetzt vielen Dank für eure Hilfe. :-)

murkel
Angehängte Grafiken
Dateityp: jpg Screenshot_1.jpg (180,7 KB, 4x aufgerufen)
Mit Zitat antworten