Librerie: Esperto - pagina 7

 

A differenza della MT4, la MT5 non registra i parametri di ingresso degli Expert Advisor quando vengono lanciati o modificati. Pertanto, è impossibile determinare dal registro cosa è stato lanciato nel Terminale.

Una funzione simile può correggere questa situazione.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/it/code/19003

// Emette i dati dell'EA in esecuzione
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}


Applicazione

input int inInput1 = 1;
input int inInput2 = 2;

int OnInit()
{
  Print(EAToString());
  
  return(INIT_FAILED);
}


Risultato

Test8 (EURUSD,M1)       Expert Experts\Test8.ex5, expertmode = 4
Test8 (EURUSD,M1)       inInput1 = 1
Test8 (EURUSD,M1)       inInput2 = 2


Purtroppo non funziona per gli script. La MT4 emette da sola i parametri di ingresso degli script, la MT5 no.

 
Non posso eseguire un EA che utilizza DLL che utilizzano questa libreria. Nei log il caricamento delle DLL non è consentito. C'è qualcosa che si può fare?
 
pivomoe:
Non posso eseguire un EA che utilizza DLL che utilizzano questa libreria. Nei log il caricamento delle DLL non è consentito. C'è qualcosa che si può fare?
Params[0].string_value += "\nexpertmode=5"; // Autorizzazione all'uso della DLL
 
fxsaber:

Sta funzionando.

 
Ho verificato il funzionamento della libreria con il gruppo di input. Tutto è corretto, non è stato necessario modificare il codice.
 

Una cosa che mi preoccupa è il principio di usare una costante come nome di un modello temporaneo in una stringa:

#define  FILENAME (__FILE__ + ".tpl")

contiene un potenziale bug legato al multithreading. Se uno stesso programma in esecuzione su diversi grafici tenta di utilizzare la libreria, potrebbe verificarsi una collisione con il file del template - o un errore di accesso o due copie identiche del template saranno tranquillamente lanciate, anche se ne sono state utilizzate di diverse.

Si dovrebbe generare un nome temporaneo, preferibilmente della forma (era __FILE__, "strike" non funziona in html qui) MQL-nome del programma + timestamp + random.

È anche auspicabile che i file precedenti vengano cancellati automaticamente dal timeout a ogni chiamata successiva, ad esempio tra 1 giorno (analizzando parte del timestamp), in modo da evitare che riempiano le cartelle.

PS. Il caso è ancora peggiore, perché __FILE__ è un file sorgente ed è sempre uguale a Expert.mqh - in tutti i programmi che lo utilizzano! Corretta la frase con il nome.
 
Stanislav Korotky:

Questo è stato fatto consapevolmente, valutando tutti i pro e i contro.

Ha senso cancellare subito dopo aver creato un modello, non una volta al giorno. Tuttavia, è comodo avere sempre l'ultimo modello salvato per analizzare meglio ciò che sta accadendo.

 
fxsaber:

Questo è stato fatto consapevolmente, valutando i pro e i contro.

Ha senso cancellare subito dopo aver creato un modello, non una volta al giorno. Tuttavia, è comodo avere sempre l'ultimo modello salvato per analizzare meglio ciò che sta accadendo.

Non posso citare alcun vantaggio per il metodo attuale. IMHO, ne ho suggerito uno più corretto.

Ha senso cancellare in una volta sola se Sync = true (che è l'impostazione predefinita), ma ora non è implementato in questo modo: il file rimane.

 
Stanislav Korotky:

Non riesco a pensare a un solo "pro" per il metodo attuale. IMHO, ne ha suggerito uno più corretto.

I pro sono l'applicazione pratica. Ho lanciato il Terminale con Expert Advisor precedentemente lanciati, che all'inizio sono entrati immediatamente nei loro modelli. Hanno funzionato perfettamente. Sono sicuro che è possibile riprodurre la collisione teorica. Ma nel mio caso è ben lontano dalla pratica. Se decidete di creare una soluzione universale, condividetela qui. Aggiornerò la Bibbia. Non sono pronto a farlo da solo.

Ha senso cancellare in una volta sola se Sync = true (che è il default), ma ora non è implementato in questo modo - il file rimane.

Sì, non lo cancello di proposito.

 
fxsaber:

Per - questa è un'applicazione pratica. Ho lanciato il Terminale con gli Expert Advisor precedentemente lanciati, che all'inizio sono entrati immediatamente nei loro modelli. Hanno funzionato perfettamente. Sono sicuro che sia possibile riprodurre la collisione teorica. Ma nel mio caso è ben lontano dalla pratica. Se decidete di creare una soluzione universale, condividetela qui. Aggiornerò la Bibbia. Non sono pronto a farlo da solo.

Sì, non lo sto cancellando di proposito.

Continuo a non capire perché il nome costante Expert.mqh.tpl sia più "pratico" (pratico?) dei template con il nome del programma che li genera? Supponiamo che ci sia un programma A.mq5 e un programma B.mq5 che usano bibla. Se generassero modelli con i loro nomi sarebbe più pratico, in primo luogo, avere l'ultima "impronta digitale" delle azioni di _ogni_ programma, invece di sovrascriverne una dall'altra. In secondo luogo, si potrebbe vedere immediatamente chi è il generatore in base al nome (utile soprattutto se i programmi sono stranieri). Ora non è possibile capirlo dal file Expert.mqh.tpl finché non ci si entra dentro. La soluzione universale che ho dato è quella di prendere il nome del programma MQL+timestamp+random. E non vedo la necessità di lasciare il file a sync=true. Penso che tutto sia stato testato e debuggato molto tempo fa. In caso di errori e di necessità di debug, esiste un'opzione sync=false. In questo caso il file dovrebbe essere lasciato. Penso che tutto sia logico. E le modifiche sono semplici.

Sono d'accordo sul fatto che in pratica la collisione potrebbe verificarsi raramente, a meno che qualcuno non utilizzi la biblio in parallelo in diversi programmi. Non ce l'ho, ma ho dato una rapida occhiata al codice e il mio occhio è stato catturato da Expert.mqh.tpl nella cartella Files. Tutto è puramente imho.