I programmi in esecuzione

Ogni script ed ogni Expert Advisor viene eseguito in un thread separato. Tutti gli indicatori calcolati su un simbolo, anche se sono collegati ai grafici diversi, lavorano nello stesso thread. Dunque, tutti gli indicatori di uno simbolo condividono le risorse di un thread.

Tutte le altre azioni associate ad un simbolo, come l'elaborazione di ticks e la sincronizzazione dello storico, sono sempre eseguiti nello stesso thread con gli indicatori. Ciò significa che se un' azione infinita viene eseguita in un indicatore, tutti gli altri eventi associati con il suo simbolo non verranno mai eseguiti.

Durante l'esecuzione di un Expert Advisor, assicurarsi che ha un vero e proprio ambiente di trading e può accedere allo storico del simbolo e periodo richiesti, e sincronizzare i dati tra il terminale ed il server. Per tutte queste procedure, il terminale fornisce un ritardo di avvio di non più di 5 secondi, dopo di che l'Expert Advisor viene avviato con i dati disponibili. Pertanto, nel caso in cui non vi è alcun collegamento al server, questo può portare ad un ritardo nella partenza di un Expert Advisor.

La tabella che segue contiene un breve sommario di programmi mql5:

Programma

Funzionamento

Nota

Servizio

Un thread separato, il numero di thread per i servizi è uguale al numero di servizi

Un servizio in loop non può interrompere l'esecuzione di altri programmi

Script

Un thread separato, il numero di threads per script è uguale al numero di script

Uno script in loop non può interrompere l'esecuzione di altri programmi

Expert Advisor

Un thread separato, il numero di thread di Expert Advisors è uguale al numero di Expert Advisors

An Expert Advisor in loop non può interrompere l'esecuzione di altri programmi

Indicatore

Un thread per tutti gli indicatori su un simbolo. Il numero di thread è uguale al numero di simboli con indicatori

Un loop infinito in un indicatore cesserà tutti gli altri indicatori di questo simbolo

Subito dopo che un programma è collegato ad un grafico, viene caricato nella memoria del terminale client, così come le variabili globali vengono inizializzate. Se qualche variabile globale di tipo classe ha un costruttore, questo costruttore sarà chiamato durante l'inizializzazione di variabili globali.

Dopo di che il programma resta in attesa di un evento dal terminale client. Ogni programma-mql5 deve avere almeno un event-handler, altrimenti il ​​programma caricato non verrà eseguito. Gli event handlers hanno nome, parametri e tipi restituiti, tutti predefiniti.

Tipo

Nome funzione

Parametri

Applicazione

Comment

int

OnInit

none

Expert Advisors ed indicatori

Init event handler. Permette di utilizzare il tipo di ritorno void.

void

OnDeinit

const int reason

Expert Advisors ed indicatori

Deinit event handler.

void

OnStart

none

Script e Servizi

Start event handler.

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 &TickVolume[],

const long &Volume[],

const int &Spread[]

indicators

Calcola gli event handlers per tutti i prezzi.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

indicators

Calculate event handler su un singolo array di dati.

L'indicatore non può avere due event handlers simultaneamente.

In questo caso l'unico event handler lavorerà sull' array di dati.

void

OnTick

none

Expert Advisors

NewTick event handler. Mentre viene elaborato l'event della ricevuta di un nuovo tick, nessun altro evento di questo tipo viene ricevuto.

void

OnTimer

none

Expert Advisors ed indicatori

Timer event handler.

void

OnTrade

none

Expert Advisors

Trade event handler.

double

OnTester

none

Expert Advisors

Tester event handler.

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

Expert Advisors ed indicatori

ChartEvent event handler.

void

OnBookEvent

const string &symbol_name

Expert Advisors ed indicatori

BookEvent event handler.

Un terminale client invia nuovi eventi ai corrispondenti grafici aperti. Gli eventi possono essere generati anche da grafici (grafico eventi) o programmi-mql5 (eventi personalizzati). Generazione di eventi di creazione o l'eliminazione di oggetti grafici in un grafico possono essere abilitati o disabilitati impostando le proprietà del grafico CHART_EVENT_OBJECT_CREATE e CHART_EVENT_OBJECT_DELETE. Ogni programma mql5 ed ogni grafico ha la propria coda di eventi, in cui vengono aggiunti tutti i nuovi eventi in arrivo.

Un programma riceve solo gli eventi dal grafico su cui gira. Tutti gli eventi vengono elaborati uno dopo l'altro nell'ordine in cui vengono ricevuti. Se una coda ha già un evento NewTick, o questo evento è attualmente in fase di elaborazione, il nuovo evento NewTick non viene inserito nella coda del programma mql5. Analogamente, se ChartEvent è già accodato, o questo evento è in fase di elaborazione, nessun nuovo evento di questo tipo viene messo in fila. Gli eventi timer vengono gestiti allo stesso modo - se l'evento Timer è in coda o manipolato, l'evento nuovo timer non è messo in coda.

Code degli eventi hanno una grandezza limitata ma sufficiente, in modo che l'overflow della coda per programmi ben scritti è improbabile. In caso di overflow della coda, i nuovi eventi vengono ignorati senza fare la fila.

Si raccomanda vivamente di non utilizzare loop infiniti per gestire gli eventi. Le possibili eccezioni sono script e servizi che gestiscono un singolo evento Start.

Le Librerie non gesticono nessuno degli eventi.

 

Funzioni vietate in Indicatori ed Expert Advisor

Indicatori, script ed Expert Advisor sono programmi eseguibili scritti in MQL5. Essi sono progettati per diversi tipi di compiti. Pertanto vi sono alcune limitazioni all'uso di determinate funzioni, a seconda del tipo di programma. Le seguenti funzioni sono vietate negli indicatori:

 

Tutte le funzioni progettate per gli indicatori sono vietate in Expert Advisor e script:

La libreria non è un programma indipendente ed è eseguita nel contesto del programma MQL5 che lo ha chiamato: script, indicatore o Expert Advisor. Di conseguenza, le restrizioni di cui sopra si applicano alla libreria chiamata.

 

Funzioni vietate nei servizi

I servizi non accettano alcun evento, in quanto non sono associati ad un chart. Le seguenti funzioni sono proibite nei servizi:

ExpertRemove();

EventSetMillisecondTimer();

EventSetTimer();

EventKillTimer();

SetIndexBuffer();

IndicatorSetDouble();

IndicatorSetInteger();

IndicatorSetString();

PlotIndexSetDouble();

PlotIndexSetInteger();

PlotIndexSetString();

PlotIndexGetInteger();

 

Caricamento e decaricamento di Indicatori

Gli indicators vengono caricati nei casi seguenti:

  • un indicatore è attaccato ad un grafico;
  • avvio del terminale (se l'indicatore viene attaccato al grafico prima della chiusura del terminale);
  • caricamento di un template (se l'indicatore attaccato ad un grafico viene specificato nel template);
  • modifica di un profilo (se l'indicatore è attaccato ad uno dei grafici del profilo);
  • modifica di un simbolo e/o tempi timeframe di un grafico, al quale l'indicatore è attaccato;
  • modifica dell'account sul quale il terminale è collegato;
  • dopo la ricompilazione con successo di un indicatore, se l'indicatore è stato attaccato ad un grafico;
  • cambiamento di parametri di input dell'indicatore.

 

Gli indicatori sono decaricati nei seguenti casi:

  • quando si stacca un indicatore da un grafico;
  • arresto terminale (se l'indicatore è stato attaccato ad un grafico);
  • caricamento di un template, se un indicatore è attaccato ad un grafico;
  • chiusura di un grafico, a cui l'indicatore è attaccato;
  • modifica di un profilo, se l'indicatore è attaccato a uno dei grafici del profilo modificato;
  • modifica di un simbolo e/o tempi timeframe di un grafico, al quale l'indicatore è attaccato;
  • modifica dell'account sul quale il terminale è collegato;

 

Caricamento e decaricamento di Expert Advisors

Expert Advisors vengono caricati nei seguenti casi:

  • quando si attacca un Expert Advisor ad un grafico;
  • avvio del terminale (se l' Expert Advisor viene attaccato al grafico prima della chiusura del terminale);
  • caricamento di un template (se l'Expert Advisor attaccato ad un grafico viene specificato nel template);
  • modifica di un profilo (se l'Expert Advisor è attaccato ad uno dei grafici del profilo);
  • connessione ad un account, anche se il numero di conto è lo stesso (se l'Expert Advisor è stata attaccato al grafico prima dell'autorizzazione del terminale sul server).
     

Expert Advisors vengono decaricati nei seguenti casi:

  • quando si stacca un Expert Advisor da un grafico;
  • se un nuovo Expert Advisor è collegato ad un grafico, se un altro Expert Advisor è stato già attaccato, questo Expert Advisor viene decaricato.
  • arresto terminale (se l'Expert Advisor è stato attaccato ad un grafico);
  • caricamento di un template, se un Expert Advisor è attaccato ad un grafico;
  • chiusura di un grafico, a cui l' Expert Advisor è attaccato;
  • modifica di un profilo, se l' Expert Advisor è attaccato a uno dei grafici del profilo modificato;
  • modifica dell'account sul quale il terminale è collegato (se l'Expert Advisor è stato attaccato al grafico prima dell'autorizzazione del terminale sul server;

Nel caso in cui il simbolo o il timeframe di un grafico, al quale è attaccato l'Expert Advisor, cambia, gli Expert Advisor non vengono caricati o decaricati. In questo caso il terminale client chiama in subsequenzialmente i gestori OnDeinit() sul vecchio simbolo/timeframe ed OnInit() sul nuovo simbolo/timeframe (se ce ne sono), i valori delle variabili globali e variabili statiche non vengono ripristinati. Tutti gli eventi, che sono stati ricevuti per l'Expert Advisor prima che l'inizializzazione sia stata completata (funzione OnInit()) vengono saltati.

 

Caricamento e decaricamento di Scripts

Gli script vengono caricati immediatamente dopo che vengono attaccati ad un grafico e decaricati immediatamente dopo aver completato il loro funzionamento. OnInit () e OnDeinit () non vengono chiamati per gli script.

Quando un programma viene scaricato (eliminato da un grafico) il terminale client esegue la deinizializzazione delle variabili globali ed elimina la coda di eventi. In questo caso la deinizializzazione significa azzeramento di tutte le variabili di tipo string-, deallocazione dioggetti array dinamici e la chiamata dei loro distruttori se sono disponibili.

 

Caricamento e decaricamento dei Servizi

I servizi vengono caricati subito dopo l'avvio del terminale se sono stati avviati al momento dello spegnimento del terminale. I servizi vengono scaricati immediatamente dopo aver completato il loro lavoro.

I servizi hanno un singolo gestore OnStart(), in cui è possibile implementare un ciclo infinito di ricezione e gestione dei dati, ad esempio creando e aggiornando simboli personalizzati utilizzando le funzioni di rete.

A differenza di Expert Advisors, indicatori e script, i servizi non sono associati ad un chart specifico, pertanto viene fornito un meccanismo separato per avviarli. Una nuova istanza di servizio viene creata nel Navigator utilizzando il comando "Aggiungi servizio". Un'istanza di servizio può essere avviata, arrestata e rimossa utilizzando il menu di istanza appropriato. Per gestire tutte le istanze, utilizzare il menu di servizio.

 

Per una migliore comprensione del funzionamento degli Expert Advisor si consiglia di compilare il codice del seguente Expert Advisor ed eseguire operazioni di carico/decarico, cambio template, cambio simbolo, cambio timeframe ecc.:

Esempio:

//+--------------------------------------------------------------------------------+
//|                                                                 TestExpert.mq5 |
//|                                      Copyright 2009, MetaQuotes Software Corp. | 
//|                                                           https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass constructor"); }
   ~CTestClass() { Print("CTestClass destructor"); }
  };
CTestClass global;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert                                      |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Inizializzazione");
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert                                             |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("Deinizializzazione con motivo",reason);
  }
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert                                                      |
//+--------------------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+--------------------------------------------------------------------------------+

Vedi anche

Eventi terminale client, Event handlers