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

 
Комбинатор:

Wenn Sie dief ändern.

Wenn die Indikatoren Müll aus dem alten Zeitrahmen in ihren Puffern haben, kann sich dies auch auf die Zeitgeber auswirken.

Es ist schöner

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Neue Version von MetaTrader 4 build 1065

Sergey Klimov, 2017.04.14 16:34

Beim Wechsel zwischen Konten ändert sich die Variable _Digits im Indikator nicht.

 
fxsaber:
Es ist hübscher.
Mit all den verschiedenen Ziffern scheint es überall durchzugehen, ich habe vor etwa 5 Jahren aufgehört, solche Konten in ein und demselben Terminal zu kreuzen.
 
fxsaber:
Es ist hübscher.

Dies ist für diejenigen, die über die richtige Konsistenz in MT4 sprechen.

Sehen Sie zu und verstehen Sie, dass im MT4 nicht alles so schön ist.

 
fxsaber:
Die Warteschlange ist unzweideutig.


Wo ist sie denn eindeutig?

Probieren Sie dieses primitive Beispiel aus. Sie werden die "Einzigartigkeit" verstehen, wenn Sie die TF wechseln.

In diesem Beispiel wird in OnInit ein Objekt mit den Koordinaten der aktuellen Zeit und des Preises erstellt. Bei OnCalculate bewegt sich dieses Objekt zusammen mit dem Preis.

Bei OnDeinit wird sie einfach (logisch) gelöscht.

Wenn wir die TF umschalten, erscheint das Objekt und verschwindet dann wieder.
Warum ist das so?
Denn manchmal löscht OnDeinit der alten TF etwas, das bereits in OnInit der neuen TF erstellt wurde. Es ist kein Fehler! Was sollte der Programmierer denken, der dieses Beispiel erstellt hat und diesen Zweig nicht gelesen hat?

Demonstration der Zweideutigkeit der OnInit- und OnDeinit-Sequenz


#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,15); 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"InitDeinit");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
Dateien:
 
Nikolai Semko:

Nun, wo ist sie zielstrebig.

Dort wurde über den Timer gesprochen.
 
fxsaber:
Der Timer wurde dort erwähnt.

Was ist der Unterschied? Sie können EventSetTimer anstelle der Objekterstellung in Unite und EventKillTimer anstelle der Objektlöschung in DeUnite einfügen. Und dies wird die Unsicherheit nicht verringern, denn die eingestellte Zeit wird durch die Deunite der alten TF beendet, und manchmal auch nicht. Und es wird noch schlimmer sein, denn man kann zumindest das Objekt sehen, aber nicht den Timer - ob er funktioniert oder nicht.
 

Vielleicht haben sie es schon erfunden, ich habe es nicht ganz gelesen. Wenn der Indikator ein Panel erstellt, können Sie die globale Variable des Terminals verwenden, ihren Wert in init um 1 erhöhen und sie als Zusatz zu den Namen der grafischen Objekte verwenden.

Meine Aufgabe war eine andere - die Parameter des Panels zu speichern, dafür habe ich globale Variablen des Terminals in deinit erstellt. Die Lösung ist einfach - man erstellt globale Variablen des Terminals in der Inite und aktualisiert jede von ihnen, wenn sich die Parameter im Grafikpanel ändern. Löschen Sie Variablen in deinit nur, wenn die Deinitialisierung durch das Entfernen des Indikators verursacht wird.

 
Dmitry Fedoseev

Wenn der Indikator ein Panel erstellt, können Sie eine globale Variable des Terminals verwenden, ihren Wert um 1 erhöhen und sie als Zusatz zu den Namen der grafischen Objekte verwenden.
Das sind Krücken. Sie müssen nur die richtige Bestellung im Terminal aufgeben und das war's. Deinitieren Sie zunächst die vorherige Instanz und starten Sie erst dann eine neue.
Nikolai Semko:


Was muss ein Programmierer denken, der dieses Beispiel erstellt und diesen Thread nicht gelesen hat?

Ich stimme völlig zu. Nichtleser werden von dieser Funktion nichts wissen und ihre Zeit damit verschwenden, sie herauszufinden. Und das wären dann Hunderte von Menschen... ...insbesondere für Anfänger.

Sie müssen nur einmal einen Fehler beheben und das war's.

 
Nikolai Semko:

Was ist der Unterschied? Sie können EventSetTimer anstelle der Objekterstellung in Unite und EventKillTimer anstelle der Objektlöschung in Deunite setzen. Und die Ungewissheit wird nicht abnehmen, weil der eingestellte Timer von der Deunite der alten TF getötet wird, und manchmal auch nicht. Und es wird sogar noch schlimmer, weil man zumindest das Objekt sehen kann, aber nicht, ob der Timer funktioniert oder nicht.
Das klingt albern. Die Zeitgeber der Indikatorkopien haben nichts miteinander zu tun.
 
elibrarius:
Das sind alles Krücken. Sie müssen nur die richtige Bestellung im Terminal aufgeben und das ist alles. Deinitieren Sie zunächst die vorherige Instanz und initialisieren Sie erst dann die neue Instanz.

Ich stimme völlig zu. Nichtleser werden von dieser Funktion nichts wissen und ihre Zeit damit verschwenden, sie herauszufinden. Und das wären dann Hunderte von Menschen... besonders für Anfänger.

Sie müssen den Fehler nur einmal beheben und das war's.


Das ist es, wovon ich spreche!
Ich persönlich habe eine Glückssträhne, da ich das Gefühl habe, einen Vorteil gegenüber der Mehrheit zu haben, da ich weiß, wie ich mit all dem umgehen kann, nicht nur mit Worten, sondern auch mit Taten. Ich habe bereits Patches erstellt und meine Programme um Krücken erweitert.

Ich verstehe nur nicht, warum die Entwickler sich hartnäckig weigern, diese "Funktion" als Fehler zu betrachten.
Zum Beispiel:

Slawa:

Indikatoren sollten für den ihnen zugedachten Zweck verwendet werden.

Mit anderen Worten, die Reihenfolge der Ausführung von OnInit und OnDeinit, wenn sich die Symbolperiode desDiagramms geändert hat, sollte für niemanden von Belang sein

Aber in meinem Beispiel mit dem animierten Gif oben, gibt es einen definitiven Fehler für einen Programmierer, der dieses Thema nicht gelesen hat! Was wird nicht entsprechend dem vorgesehenen Zweck getan?