Librerie: Esperto - pagina 11

 
Se si conoscono i nomi degli input, la seconda opzione è migliore. Permette di non pensare all'ordine degli input nell'Expert Advisor. Inoltre, è tecnicamente meglio implementata.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // Percorso per diventare Counsellor
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  Params[1].type = TYPE_INT;
  Params[1].integer_value = 123423;
  EXPERT::AddInputName(Params[1], "inpFirst");

  EXPERT::Run(0, Params);
}


Nonostante il fatto che inpFirst sia il secondo in ordine, può essere impostato su qualsiasi cosa (in questo caso è impostato come primo e unico). Quelli non impostati saranno predefiniti.

 
Per gli esperimenti avevo bisogno di clonare un robot per diversi grafici. L'ho fatto attraverso questa funzione.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/it/code/19003

// Copia l'Expert Advisor in esecuzione con le impostazioni correnti da un grafico all'altro.
bool ExpertFromTo( const long ChartSource, const long ChartTarget )
{
  bool Res = false;
    
  MqlParam Params[];
  string Names[];

  const int ExpertMode = EXPERT::Parameters(ChartSource, Params, Names);  
  const int Size = ArraySize(Params);
  
  if (Size)
  {
    Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
    
    for (int i = 1; i < Size; i++)
      EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);

    Res = EXPERT::Run(ChartTarget, Params);
  }
  
  return(Res);
}


L'ho utilizzata in questo modo.

#property script_show_inputs

input int inAmount = 5; // Quanti cloni

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  if (Size > inAmount)
    for (int i = 0, Count = 0; i < Size; i++)
    {
      const string Symb = SymbolName(i, true);
      
      if (Symb != _Symbol)
      {
        ExpertFromTo(0, ChartOpen(Symb, PERIOD_CURRENT)); // Eseguire l'EA corrente su nuovi grafici-simboli.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

Si presenta il compito di riavviare una dozzina di Expert Advisor diversi su più di un Terminale. In generale, una grande routine.

Ad esempio, abbiamo corretto qualcosa. Quindi compilazione batch in ME e riavvio. Per questo utilizzo uno script.

// Ricarica gli EA su tutti i grafici.
input int inInterval = 5; // Intervallo in secondi tra i riavvii del grafico

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Inserisce l'attività nella coda del grafico.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Far muovere la coda.
}

void OnStart()
{
  const long chartID = ::ChartID();

  for (long Chart = ChartFirst(); (Chart != -1) && !IsStopped(); Chart = ChartNext(Chart))
    if ((Chart != chartID) && (ChartGetString(Chart, CHART_EXPERT_NAME) != NULL) && (ReloadChart(Chart)))    
      Sleep(inInterval * 1000);
}

Ho segnato un punto importante nel codice. Senza di esso, l'applicazione del modello non avverrà fino alla fine dello script. Per analogia, è possibile risolvere il lancio degli Expert Advisor dopo aver ricaricato il Terminale, ecc.

 
fxsaber:

Si presenta il compito di riavviare una dozzina di Expert Advisor diversi su più di un Terminale. In generale, un grosso lavoro.

Ad esempio, abbiamo corretto qualcosa. Quindi compilazione batch in ME e riavvio. Per questo utilizzo questo script.

Ho evidenziato un punto importante del codice. Senza di esso, il modello non verrà utilizzato fino alla fine dello script. Per analogia, è possibile risolvere il problema del lancio degli Expert Advisor dopo aver ricaricato il Terminale, ecc.

Sarà un set completo se riuscirete a ottenere il nome dell'EA sul grafico specificato. Se non è difficile per voi, portatelo a termine.

 
Vladimir Pastushak:

Sarà completo se riuscirete a inserire il nome del consigliere nella tabella specificata. Se non le dispiace, la prego di completarla.

ChartGetString(Chart, CHART_EXPERT_NAME)

Questo è MT5. Se avete bisogno di una multipiattaforma o di un percorso completo per l'Expert Advisor, allora via Expert.mqh.

 
fxsaber:

Questo è MT5. Se avete bisogno di un percorso multipiattaforma o di un percorso completo per l'Expert Advisor, potete farlo tramite Expert.mqh.

Avete bisogno di una multipiattaforma...

 
Vladimir Pastushak:

Serve un cros-platformer...

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading.

Biblioteche: Esperto

fxsaber, 2019.09.12 06:17 pm.

#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);    
}
 
// Rende la variabile di input file uguale al file selezionato.
bool FileDialogToInput( const string InputName, const long Chart = 0 )
{  
  string FileNames[];
  const bool Res = (FileSelectDialog(MQLInfoString(MQL_PROGRAM_NAME) + " " + _Symbol + " " + EnumToString(_Period) +
                    ": input string " + InputName + " = ",
                    NULL, NULL, FSD_FILE_MUST_EXIST, FileNames, NULL) > 0);
  if (Res)
  {    
    MqlParam Params[];
    string Names[];
  
    const int ExpertMode = EXPERT::Parameters(Chart, Params, Names);  
    const int Size = ArraySize(Params);
    
    if (Size)
    {
      Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
      
      for (int i = 1; i < Size; i++)
      {
        if (Names[i - 1] == InputName)
          Params[i].string_value = FileNames[0];
        
        EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);
      }
  
      EXPERT::Run(Chart, Params);
    }    
  }
  
  return(Res);
}

Questa funzione consente di selezionare un file come variabile di ingresso. Questa implementazione.

input string inFileName = NULL; // File selezionato

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // Codice se nella variabile di input è specificato un file valido.

  return(INIT_SUCCEEDED);
}


Avvio.


Fare clic su OK e selezionare.


Fare clic su Apri e visualizzare le proprietà (F7) dell'EA in esecuzione.


Lo stesso funziona con qualsiasi numero di file.

input string inFileName1 = NULL; // File1 selezionato
input string inFileName2 = NULL; // File2 selezionato

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName1))
    return(FileDialogToInput(TOSTRING(inFileName1)) || INIT_FAILED);

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // Codice se nella variabile di input è specificato un file valido.

  return(INIT_SUCCEEDED);
}
 
E il caricamento dei parametri dai file di set non è ancora supportato, a quanto ho capito?
 
traveller00:
E il caricamento dei parametri dai file di set non è ancora supportato, a quanto ho capito?

Non l'ho fatto. Ma è molto semplice.