Indikatoren: Event-Handler Neuer Balken für Indikatoren

 

Event-Handler Neuer Balken für Indikatoren:

Im Vergleich zur OnCalculate() werden die Daten des Indikators nur dann neu berechnet, wenn sich ein neuer Balken auf dem Chart bildet.

Autor: Konstantin Gruzdev

 
datetime new_time=TimeCurrent()/period_seconds*period_seconds; // Öffnungszeit des Balkens im aktuellen Diagramm

Hier liegt ein Fehler vor. Ist der Zeitraum eine Woche oder ein Monat.

Wenn der Zeitraum eine Woche ist, dann ist der Wochenanfang Mittwoch, weil 1970.01.01 Donnerstag ist.

Wenn der Zeitraum ein Monat ist und der aktuelle Monat keine 30 Tage hat, wird er ebenfalls falsch gezählt, weil period_seconds 30 Tagen entspricht.

 
Maratori:

Hier liegt ein Fehler vor. Wenn der Zeitraum eine Woche oder ein Monat ist.

Wenn der Zeitraum eine Woche ist, ist der Beginn der Woche der Mittwoch, da 1970.01.01 ein Donnerstag ist.

Wenn der Zeitraum ein Monat ist und der aktuelle Monat keine 30 Tage hat, zählt er ebenfalls falsch, da period_seconds 30 Tagen entspricht.

Einverstanden. Sie können dies in OnNewBarCalculate.mqh für diese Zeiträume verwenden:

//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//---
   // Wenn ein neuer Balken erscheint, wird der NewBar-Eventhandler ausgeführt
   if(current_chart.isNewBar()>0) 
      OnNewBarCalculate(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread);
   return(rates_total);
  }
 

Ein bisschen für andere Zwecke, aber ich benutze eine Funktion wie diese für jetzt:

datetime getHTFTime(datetime time, ENUM_TIMEFRAMES highTimeFrame) {
  int periodSeconds = PeriodSeconds(highTimeFrame);
  if(periodSeconds <= 60*60*24) return datetime(time/periodSeconds*periodSeconds);
  
  MqlDateTime sTime;
  TimeToStruct(time, sTime);
  
  if(highTimeFrame == PERIOD_W1) {
    TimeToStruct(time - datetime(sTime.day_of_week * 24 * 60 * 60), sTime);
    sTime.hour = 0;
    sTime.min = 0;
    sTime.sec = 0;
  } else if(highTimeFrame == PERIOD_MN1) {
      sTime.day = 1;
      sTime.hour = 0;
      sTime.min = 0;
      sTime.sec = 0;
    }
  return StructToTime(sTime);
}

Als Eingabe wird ein Datum/Uhrzeit und ein Zeitrahmen angegeben. Am Ausgang erhalten wir die Startzeit des Balkens auf diesem Zeitrahmen, der diese Zeit enthält.

Wenn Sie Vorschläge zur Optimierung des Codes haben, nehme ich diese gerne entgegen.

Natürlich kann man es auch so machen:

datetime timeOut[1];
CopyTime(_Symbol, highTimeFrame, timeIn, 1, timeOut);

Aber in diesem Fall hatte ich ein Synchronisationsproblem. Ich muss warten, bis die Historie geladen ist.

 

Vielen Dank für Ihre benutzerdefinierte Indikator, aber wenn ich diese verwenden, ich nur einmal alarmieren und stoppen Debuggen! Bitte helfen Sie mir!

Wenn ich stattdessen OnTick verwende (und die Funktionen OnInit und OnCaculate entferne), wie in diesem Artikel https://www.mql5.com/de/articles/159, läuft es gut, aber der Indikator wird nicht im Navigatorfenster angezeigt. Und es nicht laufen, wenn ich OnInit und OnCaculate Funktionen hinzufügen. Wenn ich die Funktionen OnInit und OnCaculate hinzufüge, wird der Indikator in den Navigationsfenstern angezeigt?

Danke