[SERVICE DESK] Fehler beim Abrufen der Zeit der älteren TF im Timer! - Seite 15

 
Taras Slobodyanik:

Ihr Indikator verfolgt die Datenaktualisierung nicht.
Es kommen neue Barren vom Broker und Sie überprüfen sie nicht.
Ich habe ein paar Zeilen hinzugefügt, um zu zeigen, dass bei der Überprüfung alles korrekt angezeigt wird.

Es ist eine Arbeitssituation - wir testen die neue Bar.

Was Sie nicht sagen! Wie kommen Sie darauf, dass ich neue Balken im Auge behalten muss? Steht das in der Dokumentation? Ich meine, dass ich den Wert der Funktion erhalten MUSS, und dann muss ich ihn unbedingt mit dem vorherigen Wert vergleichen? Es gibt eine Funktion, die so konzipiert ist, dass sie mit hohen Zeitrahmen arbeitet. Die Funktion kann einen Fehler zurückgeben, wenn sie keine Daten hat, oder einen falschen Wert zurückgeben (in diesem Fall gleich 0). Das ist alles. Die Programmierer müssen nichts tun, um einen 100%ig korrekten Wert zu erhalten.

Aber schauen Sie, was ich in der Dokumentation für SeriesInfoInteger() gefunden habe:

Um zusätzliche Informationen über den Fehler zu erhalten, müssen Sie die Funktion GetLastError() aufrufen.

Sehen Sie GetLastError() in meinem Code? Hier ist der Scheck. Diese Kontrolle muss notwendig und WIRKLICH notwendig sein! Alles andere sind Krückenlösungen.
 
Alexey Kozitsyn:

Und schauen Sie sich meinen allerersten Beitrag an. Sehen Sie dort den Fehler 4066? Dann tritt der Fehler 0 auf und es werden falsche Daten zurückgegeben. Warum prüft die Funktion (in diesem Fall SeriesInfoInteger()) nicht auf Relevanz, bevor sie die Daten sendet? Warum wird das Fehlerflag nicht gesetzt? Ich warte lieber ein bisschen länger, bis die internen Prüfungen bestanden sind, als später nach Fehlern zu suchen.

Aber danach habe ich eine Menge Ratschläge bekommen, mit denen ich immer noch kein Ergebnis erzielt habe. Und es stellte sich heraus, dass es nicht einmal um den Timer ging.

Ok, lesen Sie die Hilfe)

SeriesInfoInteger

Gibt Informationen über den Zustand der historischen Daten zurück.

Was bedeutet das Wort "historisch"?
Wenn die Historie geladen ist, tritt kein Fehler auf.


Alexey Kozitsyn:

Niemals! Und wie kommen Sie darauf, dass ich unbedingt neue Bars verfolgen sollte? Steht das in der Dokumentation? Ich meine, ich MUSS den Wert der Funktion erhalten, und dann muss ich ihn unbedingt mit dem vorherigen vergleichen? Es gibt eine Funktion, die so konzipiert ist, dass sie mit hohen Zeitrahmen arbeitet. Die Funktion kann einen Fehler zurückgeben, wenn sie keine Daten hat, oder einen falschen Wert zurückgeben (in diesem Fall gleich 0). Das ist alles. Die Programmierer müssen nichts tun, um einen 100%ig korrekten Wert zu erhalten.

Aber schauen Sie, was ich in der Dokumentation für SeriesInfoInteger() gefunden habe:

In meinem Code siehe GetLastError()? Hier ist ein Scheck. Diese Kontrolle muss notwendig und ECHT sein! Alles andere sind Krückenlösungen.

Sie brauchen nichts zu tun).
...Makler schickt Ihnen aktualisierte Daten - wenn Sie wollen, verwenden Sie diese für die Berechnung, wenn nicht - kein Problem, verwenden Sie die vorhandene Historie).


ps. es ist Wochenende, der Markt ist geschlossen, Sie haben falsche Daten in Ihrem Terminal!
und es liegt kein Fehler vor!!!)

 
Taras Slobodyanik:

ok, lesen Sie die Hilfe)

Was bedeutet das Wort Geschichte?
Wenn der Verlauf geladen ist, tritt kein Fehler auf.


Sie sind nichts schuldig.)
...der Makler sendet Ihnen aktualisierte Daten - wenn Sie diese zur Berechnung verwenden wollen, wenn nicht - kein Problem, verwenden Sie History)

Jede Zecke, die am Terminal eintrifft, ist bereits eine Geschichte. Und ich möchte die tatsächlichen Werte oder Fehler erhalten. Wenn Ihnen das passt - ok.

 
Alexey Kozitsyn:

Jede Zecke, die am Terminal eintrifft, ist bereits eine Geschichte. Und ich möchte die aktuellen Werte oder Fehler erhalten. Wenn das für Sie in Ordnung ist, ist das in Ordnung.

Ja, der Verlauf ist das, was bereits heruntergeladen wurde oder was in der Vergangenheit heruntergeladen wurde.
Und was erst jetzt (nach dem letzten Zitat) aktualisiert wird, ist nicht die Geschichte, sondern sind die neuen Rohdaten.

 
Taras Slobodyanik:

Überprüfen Sie die Kerzenzeit, nicht die Berechnung der Balken.
Auf diese Weise wird sie korrekt aktualisiert (überprüft).

Taras, hier ist das Ergebnis deines Codes:

2018.10.08 11:11:39.080 test_isNewDayInOnCalculate GBPUSD,M1: initialized
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия недельного бара = 2018.09.30 00:00. Ошибка #0
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущей недели = 2018.10.01 00:00. Ошибка #0
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего дня = 2018.10.05 00:00. Ошибка #0
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего дня = 2018.10.05 00:00. Ошибка #0
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего часа = 2018.10.05 23:00. Ошибка #0
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего часа = 2018.10.05 23:00. Ошибка #0
2018.10.08 11:11:39.788 test_isNewDayInOnCalculate GBPUSD,M1: OnCalculate: Данные старших ТФ загружены!
 
Alexey Kozitsyn:

Taras, hier ist das Ergebnis deines Codes:

Ja, es ist der erste Tick, derjenige, der die fertige Geschichte hervorbringt, derjenige, der verfügbar ist.
Nach diesem Tick (wenn es neue Balken gibt), kommt sofort der zweite Tick, in dem mein Code Ihre Variablen aktualisiert und sie die richtigen Daten anzeigen.

ps. Sie können Ihre eigene Funktion einfügen, um den neuen Balken zu überprüfen, es wird die gleiche sein.

Ich selbst überprüfe ständig die Anzahl der Balken, wenn sich die Zahl um mehr als 1 geändert hat, bedeutet das, dass man alles neu berechnen muss, wenn sich die Zahl um 1 geändert hat, bedeutet das nur einen neuen Balken. Und ich überprüfe nur die kritischsten Fehler, und ich sehe diesen Verzögerungs-Fehler nicht.

 
Taras Slobodyanik:

Ja, das ist das erste Häkchen, das die fertige Geschichte angibt.
Nach diesem Tick (wenn es neue Balken gibt), kommt sofort der zweite Tick, in dem mein Code Ihre Variablen aktualisiert und sie die richtigen Daten anzeigen.

Hat sich die Zahl um mehr als 1 geändert, so handelt es sich um einen neuen Balken.

Ich selbst überprüfe ständig die Anzahl der Balken, wenn sich die Zahl um mehr als 1 geändert hat, bedeutet das, dass man alles neu berechnen muss, wenn sich die Zahl um 1 geändert hat, bedeutet das nur einen neuen Balken. Und ich überprüfe nur die kritischsten Fehler, und ich sehe diesen Verzögerungs-Fehler nicht.

Dies ist übrigens ein weiteres Argument, das dafür spricht, dass der Fehler passiert ist. Es handelt sich um einen Fehler in der Berechnung des Indikators! Ich habe einen Expert Advisor geschrieben:

#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _weekOpenTime = 0;
datetime _hourOpenTime = 0;
datetime _dayOpenTime=0;
//--- Вести лог журнала
const bool inpFileLog=true;
//--- Количество секунд в одном дне
const int SEC_PER_DAY=86400;
//--- Флаг работоспособности индикатора
bool _isWorking=true;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())
bool _isConnected=false;
//---
bool _firstLaunch = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Устанавливаем флаг первого запуска
   _firstLaunch = true;
//--- Сбрасываем время открытия текущего часа, дня и недели
   _weekOpenTime= 0;
   _dayOpenTime = 0;
   _hourOpenTime= 0;
//--- Устанавливаем флаг работоспособности
   _isWorking=true;
//--- Сбрасываем флаг установки соединения
   _isConnected=false;
////--- Запускаем таймер
//   if(!EventSetMillisecondTimer(20))
//     {
//      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 не установлен!");
//      //--- Устанавливаем флаг неработоспособности индикатора
//      _isWorking=false;
//     }
//--- Запрос данных
   SeriesInfoInteger(_Symbol,PERIOD_W1,SERIES_LASTBAR_DATE);
   SeriesInfoInteger(_Symbol,PERIOD_D1,SERIES_LASTBAR_DATE);
   SeriesInfoInteger(_Symbol,PERIOD_H1,SERIES_LASTBAR_DATE);
//---
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
////--- Выключаем таймер
//   EventKillTimer();
  }
////+------------------------------------------------------------------+
////|                                                                  |
////+------------------------------------------------------------------+
//void OnTimer()
//  {
////---
//   if(!_isWorking)
//      return;
////---
//   if(!_isConnected)
//      return;
////---
//   Print(__FUNCTION__,": Данные старших ТФ загружены!");
////--- Отключаем таймер
//   EventKillTimer();
//  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверяем связь с сервером
   if(!IsConnected())                              // Если не удалось установить связь с сервером
     {
      //--- Сбрасываем флаг соединения с сервером
      _isConnected=false;
      //--- Выходим
      return;
     }
        //--- Проверяем первый запуск эксперта
        if( _firstLaunch )
                {
            //--- Проверяем, записано ли время открытия текущей недели
            if(!CheckCurrentWeekOpenTime())                              // Если время не записано
              return;                                                // Выходим
            //--- Проверяем, записано ли время открытия текущего дня
            if(!CheckCurrentDayOpenTime())                              // Если время не записано
              return;                                                // Выходим
            //--- Проверяем, записано ли время открытия текущего часа
            if(!CheckCurrentHourOpenTime())                              // Если время не записано
              return;                                                // Выходим
            ////--- Устанавливаем флаг соединения с сервером для запуска таймера
            //_isConnected=true;
            //---
            Print(__FUNCTION__,": Данные старших ТФ загружены!");
            //--- Сбрасываем флаг первого запуска
            _firstLaunch = false;
                }
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущей недели             |
//+------------------------------------------------------------------+
bool CheckCurrentWeekOpenTime()
  {
//--- Проверяем, записано ли время
   if(_weekOpenTime==0) // Если время не записано
     {
      //--- Получаем время открытия недельного бара
      ResetLastError();
      const datetime weekBarOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_W1,SERIES_LASTBAR_DATE);
      const int err=GetLastError();
      //---
      if(inpFileLog)
        {
         Print(__FILE__,": Время открытия недельного бара = "+TimeToString(weekBarOpenTime)+". Ошибка #",err);
        }
      //--- Проверяем, получено ли время открытия недельного бара
      if(weekBarOpenTime==0 || err!=0) // Если время бара не получено или история обновляется
         return(false);                              // Возвращаем ложь
      //--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
      _weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
      //---
      if(inpFileLog)
        {
         Print(__FILE__,": Актуальное время открытия текущей недели = "+TimeToString(_weekOpenTime)+". Ошибка #",err);
        }
      //--- Возвращаем истину
      return( true );
     }
//--- Время открытия недели ранее записано. Возвращаем истину
   return( true );
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего дня                  |
//+------------------------------------------------------------------+
bool CheckCurrentDayOpenTime()
  {
//--- Проверяем, записано ли время
   if(_dayOpenTime==0) // Если время не записано
     {
      //--- Получаем время открытия дневного бара
      ResetLastError();
      const datetime tempDayOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_D1,SERIES_LASTBAR_DATE);
      const int err=GetLastError();
      //---
      if(inpFileLog)
        {
         Print(__FILE__,": Время открытия текущего дня = "+TimeToString(tempDayOpenTime)+". Ошибка #",err);
        }
      //--- Проверяем, получено ли время открытия дневного бара
      if(tempDayOpenTime==0 || err!=0) // Если время бара не получено
         return(false);                                 // Возвращаем ложь
      //--- Сохраняем в глобальную переменную значение открытия текущего дня
      _dayOpenTime=tempDayOpenTime;
      //---
      if(inpFileLog)
        {
         Print(__FILE__,": Актуальное время открытия текущего дня = "+TimeToString(_dayOpenTime)+". Ошибка #",err);
        }
      //--- Возвращаем истину
      return( true );
     }
//--- Время открытия дня ранее записано. Возвращаем истину
   return( true );
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего часа              |
//+------------------------------------------------------------------+
bool CheckCurrentHourOpenTime()
  {
//--- Проверяем, записано ли время
   if(_hourOpenTime==0) // Если время не записано
     {
      //--- Получаем время открытия часового бара
      ResetLastError();
      const datetime tempHourOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_H1,SERIES_LASTBAR_DATE);
      const int err=GetLastError();
      //---
      if(inpFileLog)
        {
         Print(__FILE__,": Время открытия текущего часа = "+TimeToString(tempHourOpenTime)+". Ошибка #",err);
        }
      //--- Проверяем, получено ли время открытия часового бара
      if(tempHourOpenTime==0 || err!=0) // Если время бара не получено
         return(false);                                 // Возвращаем ложь
      //---
      _hourOpenTime=tempHourOpenTime;
      //---
      if(inpFileLog)
        {
         Print(__FILE__,": Актуальное время открытия текущего часа = "+TimeToString(_hourOpenTime)+". Ошибка #",err);
        }
      //--- Возвращаем истину
      return( true );
     }
//--- Время открытия часа ранее записано. Возвращаем истину
   return( true );
  }
//+------------------------------------------------------------------+

Läuft auf demselben Diagramm wie der Indikator. Schauen wir uns die Ergebnisse an:

2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: OnTick: Данные старших ТФ загружены!
2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего часа = 2018.10.09 06:00. Ошибка #0
2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего часа = 2018.10.09 06:00. Ошибка #0
2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего дня = 2018.10.09 00:00. Ошибка #0
2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего дня = 2018.10.09 00:00. Ошибка #0
2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущей недели = 2018.10.08 00:00. Ошибка #0
2018.10.09 08:45:42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия недельного бара = 2018.10.07 00:00. Ошибка #0
2018.10.09 08:45:41.479 test_isNewDayInOnTick GBPUSD,M1: initialized

2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentHourOpenTime: Время открытия текущего часа = 2018.10.08 11:00
2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentDayOpenTime: Время открытия текущего дня = 2018.10.08 00:00
2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentWeekOpenTime: Время открытия текущей недели = 2018.10.08 00:00
2018.10.09 08:45:40.064	GBPUSD,M1: initialized

2018.10.09 08:45:40.022 Expert Other\test_isNewDayInOnTick GBPUSD,M1: loaded successfully

Was wir sehen. Wir sehen, dass alles in Ordnung ist. Alle geladen, und beachten Sie, dass es keine Fehler gibt, werden die Daten sofort aktualisiert! Die Hauptfrage ist, warum die GMT-Daten normal erhalten werden können, während der Indikator "mit Diamanten spielen" muss. Sollten die Programme nicht gleich funktionieren? Warum funktioniert der gleiche Code in einem Indikator und in einem Expert Advisor unterschiedlich? Dies sollte nicht der Fall sein.

 
Alexey Kozitsyn:

Dies ist übrigens ein weiteres Argument, das für einen Fehler spricht. Es ist der FEHLER in der Berechnung des Indikators! Ich habe einen Expert Advisor geschrieben:

Läuft auf demselben Diagramm wie der Indikator. Schauen wir uns die Ergebnisse an:

Was wir sehen. Wir sehen, dass alles in Ordnung ist. Alle geladen, und beachten Sie, dass es keine Fehler gibt, werden die Daten sofort aktualisiert! Die Hauptfrage ist, warum die GMT-Daten normal erhalten werden können, während der Indikator "mit Diamanten spielen" muss. Sollten die Programme nicht gleich funktionieren? Warum funktioniert der gleiche Code in einem Indikator und in einem Expert Advisor unterschiedlich? Dies sollte nicht der Fall sein.

Alle Indikatoren befinden sich in einem einzigen Thread, und bis zum Ende des Ablaufs (d.h. bis zum nächsten Aufruf von OpsulCalcuter) geschieht nichts Neues, d.h. Sie erhalten nichts schneller als das Ende des Ablaufs. Der Expert Advisor befindet sich in einem eigenen, separaten Thread, so dass er beim Starten seinen Start für Datenaktualisierungen verschieben und Daten aktualisieren kann - alles andere im Terminal bleibt davon unberührt. Das ist seit der Geburt so, und es gibt keine Möglichkeit, es zu beheben, da die metatrader4-Umgebung begraben wurde.

 
Unicornis:

Da es am Terminal liegt, eine Verbindung herzustellen und etwas mit dem Laden, Prüfen usw. zu tun, befinden sich alle Indikatoren in einem Thread, und es passiert nichts Neues, bis alles in dem Thread endet (tatsächlich bis zum nächsten Aufruf von OpCalculate), d. h., wenn man sich in diesem Thread befindet, wird man sowieso nichts schneller als bis zum Ende des Threads bekommen. Der Expert Advisor befindet sich in einem eigenen, separaten Thread, so dass er beim Starten seinen Start für Datenaktualisierungen verschieben und Daten aktualisieren kann - alles andere im Terminal bleibt davon unberührt. Das ist seit der Geburt so, und es gibt keine Möglichkeit, es zu beheben, weil die metatrader4 Umgebung begraben wurde.

Ich bin mir der Tatsache bewusst, dass alle Indikatoren eines Symbols in einem Thread sind, während jeder Experte seinen eigenen Thread hat. Dies ist jedoch nicht der Fall. Die Entwickler sind die Entwickler, die Fehler in ihren Kreationen beheben. Programme sollten nicht anders funktionieren! Wenn die Indikatoren etwas übersehen haben, handelt es sich um einen Fehler und es gibt kein Problem. Der Expert Advisor hat irgendwie die richtigen Daten ohne Fehler erhalten! Wir können es also umsetzen. @Slava, können Sie Ihre Meinung dazu abgeben, ob das offensichtlich fehlerhafte Verhalten korrigiert wird? Oder zumindest eine zusätzliche Dokumentation (dass mit prev_calculated = 0 keine korrekten Daten von Senior TFs erhalten werden können)?

 
Alexey Kozitsyn:

Ja, ich weiß, dass alle Indikatoren eines Symbols in einem Thread sind und jedem Experten ein anderer Thread zugewiesen ist. Dies ist jedoch nicht der Fall. Die Entwickler sind die Entwickler, die Fehler in ihren Kreationen beheben. Programme sollten nicht anders funktionieren! Wenn die Indikatoren etwas übersehen haben, handelt es sich um einen Fehler und es gibt kein Problem. Der Expert Advisor hat irgendwie die richtigen Daten ohne Fehler erhalten! Wir können es also umsetzen. @Slava, können Sie Ihre Meinung dazu abgeben, ob das offensichtlich fehlerhafte Verhalten korrigiert wird? Oder ist es zumindest ein Zusatz zur Dokumentation (dass wir keine korrekten Daten von hohen TF erhalten können, wenn prev_calculated = 0)?

In der Dokumentation heißt es, dass der Expert Advisor bis zu 5 Sekunden Zeit hat, um Daten zu empfangen, und während dieser Zeit versucht das Terminal, Daten für den Expert Advisor zu empfangen. Dem Indikator ist eine solche Möglichkeit nicht gegeben, und ebenso wenig sollte er eine Aktualisierung der Historie verlangen, sie ist für ihn nicht entscheidend, wenn sie entscheidend ist, dann muss sie in einem Expert Advisor berechnet werden. Der Grundgedanke ist, dass die gewünschte Situation bei der derzeitigen Umsetzung nicht möglich ist. Grundsätzlich sind TFs Zeitgeber, und es gibt Zeiträume, in denen diese mehreren Zeitgeber in einem Moment zusammenfallen - dies ist ein 100%ig übereinstimmender, synchroner Prozess (mit Ausnahme der Öffnungs-/Schließungszeit), da der erste Tick einer Minute des aktuellen TFs mit der ersten Minute der Fünf-Minuten-Zeit, der Stunde usw. zusammenfällt. - es wird lediglich derselbe Wert in mehrere Variablen geschrieben, und es ist logisch, eine Reihe von benötigten TFs zu setzen und alle erforderlichen Daten auf einmal zu erhalten. Warum die Entwickler dies getan haben und nicht umgekehrt, weiß ich nicht. Vielleicht kann (wird) es im bestehenden Terminal-Betriebsmodell wegen der Client-Server-Trennung nicht gemacht werden, denn wenn wir jetzt Experten erlauben, Indikatoren zu verwenden, werden sie das Terminal aufhängen.

Wenn es Sie interessiert, können Sie am Ende des Tages sehen, wie der Indikatoraufruf funktioniert, der Indikator ruft einen anderen Indikator auf, expert(_asktfexp) ruft indicator(_asktf_sample) auf, der indicator(_asktf) aufruft. Wenn ein Indikator von einem Experten aufgerufen wird, wird der Timer im Indikator nicht gestartet. Lösungen mit einem Timer im Indikator sind also nur für Fälle gedacht, in denen der Indikator nur im Chart hängt und nicht aufgerufen wird (was im Allgemeinen logisch ist).

Dateien: