Diskussion zum Artikel "Das MQL5-Kochbuch: Steuerelemente des Indikatorunterfensters - Die Schaltflächen" - Seite 4

 
DC2008:

Und die Tatsache, dass "Schaltflächenfunktionen in der OnInit-Funktion platziert werden" ist sehr lustig!

Aber vielleicht verstehen Sie nicht, worüber wir reden? Wenn Sie eine Taste drücken, sollte eine Benutzerfunktion ausgelöst werden, die eine Mikroaufgabe ausführt.

 
DC2008:

Also gut, lasst uns lachen. Der Artikel wurde von Ihnen geschrieben, "niemand hat Ihnen die Sprache verschlagen".

Die Erklärung in Form von Zitaten für das Unerklärliche ist also zumindest respektlos gegenüber Ihren Lesern. Fragen sollten mit Beispielen und Links zu Primärquellen beantwortet werden.

Verwirrender und überladener Code mit unnötigen Funktionen führt "Anfänger" nur in die Irre.

Und die Tatsache, dass "Schaltflächenfunktionen in der OnInit-Funktion platziert werden" ist sehr lustig!

Niemand hat Sie an der Nase herumgeführt. Willst du mir Beweise liefern? Oder besser gesagt, eine Widerlegung meiner Aussage? Zu Ihrer Information: Es ist noch nicht alles im Handbuch beschrieben. Ich meine, die Arbeit an dem Handbuch ist im Gange, es werden Ergänzungen und Korrekturen vorgenommen. Sie sollten immer alles selbst überprüfen.

Glauben Sie mir, der Code aus Ihrem Artikel ist viel "verwirrender" für Anfänger und nicht nur, was in der Diskussion zu Ihrem Artikel zu sehen ist.

Vielleicht verstehen Sie aber auch nicht, wovon wir sprechen? Wenn Sie auf eine Schaltfläche klicken, sollte eine Benutzerfunktion ausgelöst werden, um eine Mikroaufgabe auszuführen.

Ja, das habe ich wörtlich genommen. Stellen Sie Ihre Fragen etwas genauer. Aber ich rechne damit, dass meine Antwort von Ihnen ins Lächerliche gezogen werden wird, da Sie anscheinend heute eine solche Funktion haben.

In diesem Fall bestand die "Mikroaufgabe" darin, die Farbe der Schaltfläche zu ändern. Ich habe absichtlich keine zusätzlichen Funktionen hinzugefügt, um nichts Überflüssiges zu haben. Nur um den Code nicht zu überfrachten.

Eigentlich ist das Thema des Artikels nicht nur auf Schaltflächen beschränkt. Das meiste dreht sich um Diagrammereignisse. Es gibt nur wenige solcher Beispiele, also habe ich beschlossen, eines zu schreiben.

 

Lieber Autor des Artikels, Sie haben ihn nicht für mich geschrieben, sondern für Anfänger. Ich bin in der Tat nicht an Ihren Lösungen interessiert, aber wir sprechen über diejenigen, die die Sprache gerade erst kennenlernen. Von welchen "anderen Programmen" ist die Rede? Und wie kann die OnDeinit-Funktion eines Programms die Funktionen anderer Programme beeinflussen?

Wir diskutieren über einen Artikel und warum sind Sie so entrüstet?

Versuchen Sie, die Fragen nicht für mich, sondern für Anfänger zu beantworten - damit sie verstehen, warum und wie.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

Lieber Autor des Artikels, Sie haben ihn nicht für mich geschrieben, sondern für Anfänger.

Genau so ist es.

Ich bin in der Tat nicht an Ihren Lösungen interessiert, aber wir sprechen über diejenigen, die die Sprache gerade erst kennenlernen.

Aber Sie stellen Fragen.

Von welchen "anderen Programmen" ist die Rede?

Von denen, die Sie zuvor verlinkt haben. Und Sie versuchen, meine Aussage durch Andeutungen zu widerlegen, ohne einen Beweis zu liefern.

Und wie kann die OnDeinit-Funktion eines Programms die Funktionen anderer Programme beeinflussen?

Sie tut es. Ich habe darüber geschrieben. Der Redakteur, der den Artikel veröffentlicht hat, hat es bestätigt. Sie können es auch nachprüfen und sich selbst davon überzeugen.

Wir diskutieren über den Artikel und was stört Sie so sehr daran?

Nichts. Ich warte auf eine Erwiderung auf meine Behauptung. )

Versuchen Sie, Fragen nicht für mich, sondern für Neulinge zu beantworten - damit sie verstehen, warum und wie.

Bisher gab es keine Fragen von Neulingen. Und es kann auch keine Fragen geben. Alles ist sehr klar und jede Zeile des Codes ist ausführlich kommentiert.

 

Wir stören das zuerst:

void OnTimer()
  {
//--- Prüfen, ob die Mausereignisverfolgung aktiviert ist
   //CheckChartEventMouseMove();

  }

Das heißt, wir verfolgen jetzt keine Mausereignisse, richtig?

Führen Sie Ihren Code auf dem Diagramm aus:

Jetzt führen wir "ein anderes Programm" aus, und zwar wieder Ihren Code:

Ich vermute, da ist etwas schief gelaufen, oder ist es das, was wir tun sollen?

Jetzt löschen wir einen der Indikatoren und laut dem Autor des Codes haben wir die "Mausverfolgung" verloren, aber das passiert nicht:

 
C-4:

Wenn Sie sich nicht qualifizieren, weiß ich nicht, wer es dann tut? Danald Knuth? Bill Gates?

Ich habe nur versucht, ein Kompliment zu bekommen. Es hat funktioniert.)

C-4:
Ich verstehe. Aber was nicht klar ist, ist, dass die führenden Produkte des Marktes, die von Ihnen geschaffen wurden, nicht Ihnen gehören. Ist das nicht eine Schande?

1. Es ist noch nicht Abend)

2. Mein Kunsthandwerk ist auch ständig an der Spitze, obwohl es in keinem Vergleich mit der Tafel steht.

3. Der Erfolg der Tafel ist größtenteils auf die Bemühungen des Urhebers der Idee zurückzuführen, so dass es nicht richtig ist zu sagen, dass es mein Produkt ist.

4. Ich habe nicht umsonst gearbeitet)

 
DC2008:

...

jetzt löschen wir einen der Indikatoren und laut dem Autor des Codes haben wir die "Mausverfolgung" verloren, aber das passiert nicht:

Prüfen Sie nun, ob das Ereignis OnDeinit() in den Indikatoren ausgelöst wird. Das ist der interessante Punkt, den ich bereits erwähnt habe. :) Nämlich in OnDeinit(), im Beispiel aus dem Artikel, ist das Motion Tracking Event deaktiviert. Seit einigen Builds scheint OnDeinit() in Indikatoren überhaupt nicht mehr zu funktionieren. Das ist ein Bug und wir sollten die Entwickler darüber informieren.

Um sicherzugehen, dass meine Aussage korrekt ist, müssen wir einen leeren Expert Advisor erstellen (die Funktion OnDeinit() funktioniert in Expert Advisors), in dem es ausreicht, diese Codezeile (hervorgehoben) hinzuzufügen:

//+------------------------------------------------------------------+
//|TEST.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Deaktivieren der Mausereignisverfolgung
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

Wenn Sie nun den Expert Advisor entfernen, während sich der Indikator aus dem Artikel im Chart befindet, wird die Verfolgung des Bewegungsereignisses im Indikator ebenfalls deaktiviert sein.

Zu diesem Punkt:

Da muss etwas schief gelaufen sein, oder ist das so vorgesehen?

Es ist bekannt. Es ist nicht so konzipiert, es ist nur in diesem Artikel nicht berücksichtigt. Der Artikel ist, wie immer, ein einfaches Beispiel, keine fertige Lösung für alle Fälle. )

 
Sergej, machen Sie keinen Aufstand. Mir war zum Beispiel nicht klar, warum ich eine Zeitschaltuhr verwenden sollte. Aber in ein paar Augenblicken fand ich eine Erklärung in dem Artikel und verstand sofort alles. Ich habe diese Erklärung nicht in der Praxis überprüft, aber ich vertraue dem Autor, weil ich weiß, dass er sie aus einem bestimmten Grund geschrieben hat, und wenn der Timer eingeführt wurde, gab es dafür Gründe.
 
void OnDeinit(const int reason)
  {
//--- Deaktivieren der Mausereignisverfolgung
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

Generell scheint dieser Code sehr problematisch zu sein. Es gibt keinen wirklichen Grund, die Verfolgung der Mausbewegungen beim Deaktivieren des Expert Advisors/Indikators auszuschalten. Wenn Sie sich so viel Mühe machen wollen, sollten Sie den Zustand wiederherstellen, der vor dem Start des Expert Advisors bestand:

bool mouseStatus;
void OnInit()
  {
  mouseStatus = ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
  }

void OnDeinit(const int reason)
  {
   //--- Deaktivieren der Mausereignisverfolgung
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

Im Allgemeinen scheint dieser Code recht problematisch zu sein. Es gibt keinen wirklichen Grund, die Verfolgung von Mausbewegungen auszuschalten, wenn der Expert Advisor/Indikator deaktiviert wird.

Nein, Sie liegen falsch. Es gibt echte Gründe, die Mausverfolgung zu deaktivieren. Und ich werde es jetzt beweisen. )

Sie haben zum Beispiel zwei Programme in einem Chart laufen. Den Expert Advisor, bei dem Sie die Mausbewegung verfolgen müssen. Und einen Indikator, bei dem Sie das Mausbewegungsereignis nicht verfolgen müssen, aber einige andere Chart-Ereignisse verfolgen müssen.

Führen Sie nun diesen Code des Expert Advisors aus:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Verfolgung von Mausereignissen einschalten
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Deaktivieren der Mausereignisverfolgung
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| ChartEvent-Funktion|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Verfolgung von Mausbewegungen und Drücken der linken Maustaste
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Darin ist während der Initialisierung in der Funktion OnInit() die Verfolgung des Mausbewegungsereignisses aktiviert. Die Zeile in der Funktion OnDeinit(), in der dieses Tracking deaktiviert werden soll, ist jedoch absichtlich auskommentiert.

Laden Sie den Indikator auch in den Chart. Hier ist sein Code:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   
//--- Rückgabewert von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent-Funktion|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Verfolgung von Mausbewegungen und Drücken der linken Maustaste
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Sowohl das erste als auch das zweite Programm gibt eine Meldung in das Protokoll aus, dass das Ereignis empfangen wurde. Entfernen Sie nun den Expert Advisor aus dem Chart. Nehmen wir an, dass Sie einige Berechnungen mit seiner Hilfe durchgeführt haben und ihn nicht mehr benötigen. Da das Ereignis zur Verfolgung der Mausbewegung nicht deaktiviert wurde, empfängt der Indikator dieses Ereignis auch nach seiner Entfernung weiterhin. Und Sie brauchen es nicht mehr.

Sind Sie jetzt einverstanden? )