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

 
Alexey Viktorov:

Dimitri, du scheinst mir ein gebildeter Programmierer zu sein. Hat man Ihnen die Regeln der Etikette beim Programmieren nicht beigebracht?

Für den Rest kann man wie im alten mql4 schreiben, mit der Möglichkeit von Array-Überläufen und anderen Annahmen. Sie erhalten eine Fehlermeldung als Antwort... Also, zurückflaggen... Lass uns weitergehen, wir haben keine Zeit... Und dann stößt man auf ein Problem, das in einer strengeren Sprache keinen Pfifferling wert ist, und fängt an, den Entwicklern die Schuld zu geben...

Christus ist auferstanden.


Wenn Sie ein bestehendes Objekt erstellen, passiert nichts Schlimmes, es passiert auch nichts Schlimmes, das Objekt wird einfach nicht erstellt und das ist alles.
 
Nikolai Semko:

Ich denke, ich werde später auch eine Lösung hinzufügen, aber ohne globale Terminalvariablen und Dateien, und mit der Möglichkeit, mehrere identische Indikatoren in einem Fenster anzuwenden.

Übrigens ist es eine interessante Aufgabe, eine Funktion zu schreiben, die für jeden Satz von Indikator-Eingabeparametern einen anderen Wert liefert.

Das erste, was mir einfiel, war ChartSaveTemplate.


Verzicht auf globale - offenbar Ressourcen.

 
fxsaber:

Übrigens ist es eine interessante Aufgabe, eine Funktion zu schreiben, die für jeden Satz von Indikator-Eingabeparametern einen anderen Wert liefert.

Das erste, was mir dazu einfiel, war ChartSaveTemplate.


Auf die globalen - offenbar Ressourcen - zu verzichten.


Natürlich Ressourcen - sie scheinen mir die beste Lösung zu sein, denn sie sind unsichtbar, im Gegensatz zu globalen Terminalvariablen und Dateien, und schnell. Außerdem können Sie Arrays durch sie hindurchleiten, genau wie durch Dateien, nur schneller, weil alles im RAM passiert. Außerdem gehören sie zum Fenster und nicht zum Terminal, wie im Falle des Global. Außerdem können Sie eine Ressource für alle dieselben Indikatoren in einem Fenster erstellen.

Nein, ich denke, dass ChartSaveTemplate zu umständlich ist. Ich werde versuchen, eine gemeinsame Ressource für alle Instanzen eines Indikators zu erstellen, ohne globale Änderungen, Vorlagen und Dateien zu verwenden.

 
Nikolai Semko:

Mein Beispiel diente dazu, das Problem der unklaren Reihenfolge der Einheit der neuen TF und der Einheit der alten TF aufzuzeigen, nicht als Lösung.

Sie haben das Problem nur umgangen, nicht gelöst.
In meinem Beispiel ist es nur wichtig, das Objekt in der Einheit der alten TF auf jeden Fall zu löschen, auch wenn die TF geändert wird und in der Einheit des neuen Objekts neu angelegt wird.

Wenn die Sequenz zuerst Deunit der alten TF ist, dann Unit der neuen TF, wie es logischerweise sein sollte. Dann wird das Objekt gelöscht und anschließend neu erstellt.

Wenn die Sequenz zuerst die Unit der neuen TF und dann die Deunit der alten TF ist, dann wird das Objekt einfach geändert, wenn Sie versuchen, es in der Unit zu erstellen, da es noch nicht gelöscht ist. Und dann wird sie von der Deunit der alten TF gelöscht. Das ist der Fehler.

Das war der Sinn dieses Beispiels - um zu zeigen, was ein Programmierer, der diesen Zweig nicht gelesen hat und sich dieser "Funktion" nicht bewusst ist, erleben kann.
Dieses Beispiel war nicht als Lösung gedacht. Als Varianten der Lösung werden hier und hier vorgestellt. Ich denke, ich werde später auch eine Lösung hinzufügen, aber ohne globale Variablen und Dateien des Terminals zu verwenden und damit diese Lösung auch funktioniert, wenn mehrere identische Indikatoren in einem Fenster gesetzt sind. Haben Sie versucht, dieses Problem zu lösen? Oder Sie sind nur in der Lage, Fehler im Code anderer Leute zu finden, vor allem, wenn sie nicht vorhanden sind.


Es ist eine Sünde, heute zu fluchen, aber mir ist danach...

Ich konnte Ihren Unsinn nicht einmal bis zum Ende lesen.

Ich wiederhole noch einmal: Machen Sie kein Problem, wo es keins gibt.

Die Antwort auf all Ihre Fragen in Ihrem Code war hier

Alexey Viktorov:

Was soll das primitive Beispiel mit der Einbahnstraße?

Verwenden Sie lieber ein Beispiel für einen fast korrekten Code.

Ich habe nicht mit der Absolutheit gerechnet.

Das ist alles ... Geh weg, Satan, führe mich nicht zur Sünde.

 
Alexey Viktorov:

Es ist eine Sünde, heute zu fluchen, aber mir ist danach...

Ich konnte Ihren Unsinn nicht einmal bis zum Ende lesen.

Ich sage es noch einmal: Schieben Sie das Problem nicht dorthin, wo es nicht existiert.

Die Antwort auf alle Fragen in Ihrem Code finden Sie hier.

Ich habe nicht mit absoluten Zahlen gerechnet.

Das war's... Satan soll verschwinden, er soll uns nicht zur Sünde verführen.


Oh, Mann, du musst in ein anderes Forum gehen. Wo Psychotherapeuten Ratschläge geben. Ich verstehe, ich verstehe. Kindliches Liebesdefizit, Wunsch nach Aufmerksamkeit und Liebe. Es tut mir leid. Ich werde Ihnen helfen, wenn Sie etwas brauchen. Sie können mir persönlich schreiben. Ich scherze nicht.

Und das sollten Sie besser nicht hier tun, denn wir haben die Leute schon zu sehr amüsiert.

DIE AUFERSTEHUNG IN DER TAT!

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Abfolge der Ausführung von Init() und DeInit()

fxsaber, 2017.04.14 13:52

Ein wenig Tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's
Keine Beschwerden bei den Entwicklern.
Tolle Anleitung! ausführen.
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

Und wechseln Sie die TF. Es wird keine einzige Deinit! Alle Indikatoren laufen unbemerkt ab und verbrauchen Ressourcen. Und ich wollte nur

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2016.09.22 16:14

Wie erkenne ich meinen Handle auf einem Chart in einem Indikator? DurchChartIndicatorName ist nicht geeignet, da es einen kurzen Namen zurückgibt. Und mit demselben Namen kann bereits derselbe Indikator mit anderen Eingabeparametern ausgeführt werden.

Es stellt sich heraus, dass Sie ChartIndicatorGet verwenden müssen, wenn Sie sein Handle wissen wollen, aber wie im obigen Beispiel gezeigt, wird es ein echtes Problem sein - der Indikator wird deinstallierbar sein.

Was für ein Pech.


Ich kann nicht einmal das tun.

Forum für Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

fxsaber, 2016.09.23 10:20

Woher kenne ich meinenINDICATOR_SHORTNAME? IndicatorGet*-Funktionen gibt es nicht!

Aus dem Indikator ist nicht ersichtlich, welches Teilfenster er getroffen hat. Es ist einfach ein Haufen Mist.

 
fxsaber:

Dem Indikator kann man nicht entnehmen, in welchem Teilfenster er sich befindet. Es ist einfach ein Haufen Mist.

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
Ein cooler kleiner Tiphack! ausführen.

Und wechseln Sie die TF. Es wird keinen einzigen Deinit geben! Alle Indikatoren laufen unbemerkt ab und verbrauchen Ressourcen. Und ich wollte nur

Es stellt sich heraus, dass Sie ChartIndicatorGet verwenden sollten, wenn Sie das Handle des Indikators wissen wollen, aber, wie im obigen Beispiel gezeigt, ist das ein echter Flop - der Indikator ist nicht löschbar.

Es wird nicht mehr wiederherstellbar sein.

Ich habe so etwas schon erlebt. Den Entwicklern wird empfohlen, die Hilfe genauer zu lesen, da es dort ein Beispiel gibt:

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
Sie fügten jedoch hinzu, dass dieses Verhalten "korrigiert" werden würde. Aber offenbar wird sie noch angepasst.
 
Alexey Kozitsyn:
https://www.mql5.com/ru/docs/chart_operations/chartwindowfind

Danke, aber es gibt die gleiche Einschränkung - ohne einen Kurznamen (woher wissen Sie das?) geht es nicht.

 
Alexey Kozitsyn:

Ich bin auf etwas Ähnliches gestoßen. Die Entwickler rieten mir, die Hilfe genauer zu lesen, da es dort ein Beispiel gibt:

Allerdings fügte er dann hinzu, dass das Verhalten "korrigiert" werden würde. Aber offenbar wird sie noch angepasst.

Das hat wirklich geholfen, vielen Dank!

Das Wichtigste ist, dass Sie IndicatorRelease nicht in Deinit ausführen.

Grund der Beschwerde: