Init() und DeInit() Ausführungsreihenfolge - Seite 8

 

Option zur Lösung von Problemen beim Wechsel des Zeitrahmens


Wenn Sie gerade die TF

1) Es ist wahrscheinlich nicht notwendig, grafische Objekte zu löschen.

2) Vielleicht ist es nicht notwendig, einige Variablen neu zu initialisieren


static int ChanGeTF = 0;  // Признак смены ТФ , держим как статическую переменную в памяти эксперта
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if( ChanGeTF == 0) // при первом вызове код в OnInit полностью обрабатывается  , но не отработает если просто менялся ТФ
     {
      // тут сформируем переменные для нашего эксперта которые отработают  при первом старте экперта
      // возможно сформируем графические объекты 
     }
    else
    {
      ChanGeTF=0;  
     // сюда попадет при смене ТФ 
     // а формировать ничего уже не будем ,  у нас все сформировано и мы не желаем делать инициализацию переменных
     // но если необходимо - что то обработаем в код OnInit 
    }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));   // пишем в лог причину входа в DeInit - очень полезная информация
   if ( REASON_CHARTCHANGE != _UninitReason )
     {
      // сюда не попадаем , если произошла смена ТФ
      // удалим графические объекты - для полноценного завершения работы эксперта 
      // 
     }
    else
    {
      // сюда попадем если просто произошла смена ТФ 
      // сделаем то что нам интересно - но при этом - к примеру - не будем удалять с графика графические объекты
         ChanGeTF=1; 
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
  {
   string text="";
//--- 
   switch(reasonCode)
     {
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";
         break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";
         break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
//--- 
   return text;
  }

 
Yuriy Zaytsev:

Option zur Lösung von Problemen beim Wechsel des Zeitrahmens


Wenn Sie gerade die TF

1) Es ist wahrscheinlich nicht notwendig, grafische Objekte zu löschen.

2) Vielleicht ist es nicht notwendig, einige Variablen neu zu initialisieren


Das einzige Problem ist, dassStatikim Indikator nicht funktioniert, er wird zurückgesetzt. Es funktioniert im Expert Advisor, aber nicht im Indikator
.
 
Yuriy Zaytsev:

Option zur Lösung von Problemen beim Wechsel des Zeitrahmens


Wenn sich nur der Zeitrahmen ändern würde

1) Vielleicht sollten Sie grafische Objekte nicht löschen.

2) Vielleicht sollten Sie keine Variablen neu initialisieren



Ihr Code wird nicht funktionieren.

Noch einmal:

Sie können die Ergebnisse von Deinit in Inite nicht kontrollieren, da Deinit auch nach der Ausführung von Inite funktionieren kann.

 
Sergey Chalyshev:


Ihr Code wird nicht funktionieren.

Noch einmal:

Sie können die Ergebnisse von Deinit in Inite nicht kontrollieren, da Deinit nach der Ausführung von Inite ausgelöst werden kann.

Sie meinen, es funktioniert nicht- in Indikatoren? Es funktioniert in Expert Advisors.
 
Yuriy Zaytsev:
Sie meinen, es funktioniert nicht- in einem Indikator? In Experten funktioniert es.
Mit Expert Advisors gibt es kein Problem. Bei diesem Thema geht es nur um Indikatoren. Lesen Sie es sorgfältig.
 
Sergey Chalyshev:

Wie können diese Deinitialisierungscodes in einem Indikator verarbeitet werden, wozu brauchen wir diese Codes? Schließlich gibt es keine Möglichkeit, in der Anzeige zu warten, Sleep funktioniert nicht.

Haben Sie nicht gelesen, was ich mehrmals geschrieben habe?

In den Indikatoren gibt es keine Möglichkeit. Man kann es nicht von Anfang an in fünf Jahren schaffen. Denn Sie laden eine völlig neue Kopie des Indikators mit allen Konsequenzen herunter.

 
Nikolai Semko:
Es gibt kein Problem mit Experten. Bei diesem Thema geht es nur um Indikatoren. Lesen Sie es sorgfältig.

Ich habe den ersten Beitrag gelesen.
Dort heißt es, und ich zitiere:
"Schriftlicher Indikator oder Co-Assessor"
 
Yuriy Zaytsev:

Ich habe den ersten Beitrag gelesen.
Dort heißt es, und ich zitiere:
"Geschrieben von einem Indikator oder einem Mitautor".
Hier endet der Hinweis.
Es ist nicht immer klug, sich darauf zu beschränken, den ersten Beitrag zu lesen, bevor man etwas schreibt.
 
Nikolai Semko:
Das ist das Ende der Expert Advisors.
Es ist nicht immer klug, sich darauf zu beschränken, den ersten Beitrag zu lesen, bevor man etwas schreibt.

Nun, es ist nicht ganz richtig, zu sagen, was vernünftig ist und was nicht.
Ich habe das Thema kurz durchgespielt, bevor ich es geschrieben habe.

Ich habe ein Code-Beispiel in das Thema eingefügt, und jetzt können diejenigen, die das Thema lesen, sehen, dass dieser Mechanismus nicht in einem Indikator funktioniert und dass er in einem EA funktioniert.

Der Autor des Themas hat zumindest eine Antwort auf eine Frage gefunden, und zwar mit einem Beispiel.
 
Yuriy Zaytsev:

Nun, es ist nicht wirklich genau zu sagen, was vernünftig ist und was nicht.
Ich habe vor dem Schreiben ein wenig zu diesem Thema recherchiert.

Wer das Thema gelesen hat, kann sehen, dass dieser Mechanismus in einem Indikator nicht funktioniert und in einem EA funktioniert.
Danke natürlich für den Code. Es funktioniert gut mit Expert Advisors, weil, wenn wir TF ändern, die Variablen nicht reinitialisiert werden, während in Indikatoren sie reinitialisiert werden. Wenn Sie wirklich mit Ratschlägen helfen wollen, führen Sie den Vorgang bitte noch einmal in aller Ruhe durch.