Discussione sull’articolo "Manuale MQL5: Controlli della finestra secondaria dell'indicatore - Pulsanti" - pagina 4

 
DC2008:

E il fatto che "le funzioni dei pulsanti sono inserite nella funzione OnInit" è molto divertente!

Tuttavia, forse non avete capito di cosa stiamo parlando? Se si preme un pulsante, dovrebbe essere attivata una funzione utente per eseguire qualche microcompito.

 
DC2008:

Va bene, facciamoci una risata. L'articolo è stato scritto da voi, "nessuno vi ha tirato la lingua".

Quindi, la spiegazione sotto forma di citazioni dell'inspiegabile è quantomeno irrispettosa nei confronti dei vostri lettori. Alle domande bisogna rispondere con esempi e link a fonti primarie.

Un codice confuso e sovraccarico di funzioni inutili non fa altro che fuorviare i "principianti".

E il fatto che "le funzioni dei pulsanti siano collocate nella funzione OnInit" è molto divertente!

Nessuno ti ha tirato per la lingua. Hai intenzione di darmi delle prove? O meglio, una confutazione della mia affermazione? Per tua informazione, non tutto è ancora descritto nel manuale. Voglio dire che il lavoro sul manuale è in corso, si stanno facendo aggiunte e correzioni. Si dovrebbe sempre controllare tutto da soli.

Credimi, il codice del tuo articolo è molto più "confuso" per i principianti e non solo, come si può vedere nella discussione del tuo articolo.

Tuttavia, forse non avete capito di cosa stiamo parlando? Se si fa clic su un pulsante, dovrebbe essere attivata una funzione utente per eseguire un microcompito.

Sì, l'ho preso alla lettera. Ponete le vostre domande in modo più preciso. Ma prevedo che la mia risposta sarà ridicolizzata da voi, visto che oggi sembrate avere una funzione di questo tipo.

In questo caso il "microcompito" era quello di cambiare il colore del pulsante. Non ho volutamente aggiunto alcuna funzione extra per non avere nulla di superfluo. Solo per evitare di sovraccaricare il codice.

In realtà, l'argomento dell'articolo non si limita solo ai pulsanti. La maggior parte riguarda gli eventi dei grafici. Ci sono pochi esempi di questo tipo, quindi ho deciso di scriverne uno.

 

Caro autore dell'articolo, non l'hai scritto per me, ma per i principianti. In effetti, non sono interessato alle sue soluzioni, ma stiamo parlando di coloro che stanno iniziando a conoscere il linguaggio. Di quali "altri programmi" stiamo parlando? E come può la funzione OnDeinit di un programma influenzare le funzioni di altri programmi?

Stiamo discutendo di un articolo e perché ti indigni tanto?

Cercate di rispondere alle domande non per me, ma per i principianti, in modo che capiscano perché e come.

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

Caro autore dell'articolo, non l'hai scritto per me, ma per i principianti.

Esattamente così.

Infatti, non mi interessano le sue soluzioni, ma stiamo parlando di coloro che stanno iniziando a conoscere la lingua.

Ma lei pone delle domande.

Di quali "altri programmi" stiamo parlando?

Proprio quelli di cui hai dato i link prima. E cerchi di confutare la mia affermazione con allusioni senza fornire una prova.

E come può la funzione OnDeinit di un programma influenzare le funzioni di altri programmi?

Lo fa. L'ho scritto. L'editore che ha pubblicato l'articolo lo ha confermato. Potete anche controllare e verificare voi stessi.

Stiamo discutendo dell'articolo e cosa ti dà tanto fastidio?

Niente. Sto aspettando una smentita alla mia affermazione. )

Cerchi di rispondere alle domande non per me, ma per i nuovi arrivati, in modo che capiscano perché e come.

Finora non ci sono state domande da parte dei nuovi arrivati. E non ci possono essere domande. Tutto è molto chiaro e ogni riga di codice è commentata in dettaglio.

 

Prima abbiamo inceppato questo:

void OnTimer()
  {
//--- Verifica se il tracciamento degli eventi del mouse è abilitato
   //CheckChartEventMouseMove();

  }

Cioè ora non tracciamo gli eventi del mouse, giusto?

Eseguire il codice sul grafico:

ora eseguiamo "un altro programma", che sia di nuovo il vostro codice:

Immagino che qualcosa sia andato storto o è questo che dovremmo fare?

ora cancelliamo uno degli indicatori e secondo l'autore del codice abbiamo perso il "tracciamento del mouse", ma non è così:

 
C-4:

Se tu non sei qualificato, allora non so chi lo sia? Danald Knuth? Bill Gates?

Stavo solo cercando di ottenere un complimento. Ha funzionato).

C-4:
Capisco. Ma ciò che non è chiaro è che i prodotti di punta del mercato creati da voi non vi appartengono. Non è un peccato?

1. Non è ancora sera)

2. Anche il mio artigianato è costantemente in testa, anche se non è in alcun modo paragonabile al pannello.

3. Il successo del pannello è in gran parte dovuto agli sforzi dell'autore dell'idea, quindi non è corretto dire che è un mio prodotto.

4. Non ho lavorato gratuitamente)

 
DC2008:

...

Ora cancelliamo uno degli indicatori e, secondo l'autore del codice, abbiamo perso il "tracciamento del mouse", ma questo non accade:

Verificate ora se l'evento OnDeinit() viene attivato negli indicatori. Questo è il punto interessante che ho menzionato prima. :) In particolare in OnDeinit(), nell'esempio dell'articolo, l'evento di tracciamento del movimento è disabilitato. Da qualche build sembra che OnDeinit() abbia smesso di funzionare negli indicatori. Si tratta di un bug e dovremmo informare gli sviluppatori.

Inoltre, per essere sicuri che la mia affermazione sia corretta, dobbiamo creare un Expert Advisor vuoto (la funzione OnDeinit() funziona negli Expert Advisor), in cui è sufficiente aggiungere questa riga di codice (evidenziata):

//+------------------------------------------------------------------+
//|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"
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Disabilita il tracciamento degli eventi del mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

Ora, se si rimuove l'Expert Advisor quando l'indicatore dell'articolo è sul grafico, il tracciamento dell'evento di movimento sarà disabilitato anche nell'indicatore.

A proposito di questo:

qualcosa deve essere andato storto o è così che è stato progettato?

È noto. Non è stato progettato in questo modo, ma non è stato preso in considerazione in questo articolo. L'articolo, come sempre, è un semplice esempio, non una soluzione pronta per tutti i casi. )

 
Sergey, non fare storie. Ad esempio, non mi era chiaro perché usare un timer. Ma in un paio di istanti ho trovato una spiegazione nell'articolo e ho capito subito tutto. Non ho verificato questa affermazione nella pratica, ma in questo mi fido dell'autore, rendendomi conto che l'ha scritto per un motivo, e se il timer è stato introdotto, c'erano delle ragioni per farlo.
 
void OnDeinit(const int reason)
  {
//--- Disabilita il tracciamento degli eventi del mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

In generale, questo codice sembra essere molto problematico. Non c'è alcun motivo per disattivare il tracciamento del movimento del mouse quando si disattiva l'Expert Advisor/indicatore. Se ci si vuole preoccupare così tanto, si dovrebbe ripristinare lo stato esistente prima dell'avvio dell'Expert Advisor:

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

void OnDeinit(const int reason)
  {
   //--- Disabilita il tracciamento degli eventi del mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

In generale, questo codice sembra essere piuttosto problematico. Non c'è alcun motivo reale per disattivare il tracciamento del movimento del mouse quando si disabilita l'Expert Advisor/indicatore.

No, vi sbagliate. Ci sono ragioni reali per disabilitare il tracciamento del mouse. E lo dimostrerò ora. )

Ad esempio, si hanno due programmi in esecuzione su un grafico. L'Expert Advisor, in cui è necessario tracciare l'evento del movimento del mouse. E un indicatore in cui non è necessario tracciare l'evento del movimento del mouse, ma è necessario tracciare altri eventi del grafico.

Eseguite ora il codice dell'Expert Advisor:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Abilita il tracciamento degli eventi del mouse
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Disabilita il tracciamento degli eventi del mouse
   //ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
//| OnTick|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| Funzione ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Tracciamento del movimento del mouse e della pressione del tasto sinistro del mouse
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

In esso, durante l'inizializzazione, nella funzione OnInit(), il tracciamento dell'evento del movimento del mouse è abilitato. Ma la riga della funzione OnDeinit(), dove questo tracciamento dovrebbe essere disabilitato, è intenzionalmente commentata.

Caricare anche l'indicatore sul grafico. Ecco il suo codice:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
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[])
  {
//---
   
//--- restituisce il valore di prev_calculated per la chiamata successiva
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Funzione ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Tracciamento del movimento del mouse e della pressione del tasto sinistro del mouse
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

Sia il primo che il secondo programma emettono un messaggio nel log che segnala la ricezione dell'evento. Ora rimuovete l'Expert Advisor dal grafico. Supponiamo di aver effettuato alcuni calcoli con il suo aiuto e di non averne più bisogno. Dopo la sua rimozione, poiché l'evento di tracciamento del movimento del mouse non è stato disabilitato, l'indicatore continua a ricevere questo evento. E non ne avete bisogno.

Siete d'accordo? )