Bibliotecas: Expert - página 11

 
Se você souber os nomes dos inputs, a segunda opção é melhor. Ela permite que você não precise se preocupar com a ordem dos inputs no Expert Advisor. E é tecnicamente melhor implementada.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // Caminho para ser um conselheiro
  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);
}


Apesar de o inpFirst ser o segundo na ordem, ele pode ser definido como qualquer coisa (nesse caso, ele é definido como o primeiro e único). Aqueles que não forem definidos serão padrão.

 
Para experimentos, precisei clonar um robô para vários gráficos. Fiz isso por meio desta função.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/pt/code/19003

// Copia o Expert Advisor em execução com as configurações atuais de um gráfico para o outro
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);
}


Eu a utilizei assim.

#property script_show_inputs

input int inAmount = 5; // Quantos clones

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)); // Executar o EA atual em novos gráficos-símbolos.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

Surge a tarefa de reiniciar uma dúzia de Expert Advisors diferentes em mais de um Terminal. Em geral, é uma grande rotina.

Por exemplo, corrigimos algo. Em seguida, compilação em lote no ME e reinício. Eu uso esse script para isso.

// Recarrega os EAs em todos os gráficos.
input int inInterval = 5; // Intervalo em segundos entre as reinicializações do gráfico

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Colocar a tarefa na fila de gráficos.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Faça a fila se mover.
}

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);
}

Marquei um local importante no código. Sem ele, a aplicação do modelo não ocorrerá até o final do script. Por analogia, você pode resolver o lançamento de Expert Advisors após recarregar o Terminal, etc.

 
fxsaber:

Surge a tarefa de reiniciar uma dúzia de Expert Advisors diferentes em mais de um Terminal. Em geral, é uma grande tarefa.

Por exemplo, corrigimos algo. Em seguida, compilação em lote no ME e reinicialização. Eu uso este script para isso.

Destaquei um local importante no código. Sem ele, o modelo não será usado até o final do script. Por analogia, você pode resolver o lançamento de Expert Advisors após recarregar o Terminal, etc.

Será um conjunto completo se você conseguir obter o nome do EA no gráfico especificado. Se isso não for difícil para você, conclua-o.

 
Vladimir Pastushak:

Ele estará completo se você conseguir colocar o nome do conselheiro na tabela especificada. Se não se importar, por favor, preencha-o.

ChartGetString(Chart, CHART_EXPERT_NAME)

Este é o MT5. Se você precisar de plataforma cruzada ou caminho completo para o Expert Advisor, use Expert.mqh.

 
fxsaber:

Este é o MT5. Se você precisar de uma plataforma cruzada ou de um caminho completo para o Expert Advisor, use o Expert.mqh.

Você precisa de plataforma cruzada...

 
Vladimir Pastushak:

Precisa de um cros-platformer...

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Bibliotecas: Expert

fxsaber, 2019.09.12 06:17 pm.

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

// Emite os dados do EA em execução
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);    
}
 
// Torna a variável de entrada do arquivo igual ao arquivo selecionado.
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);
}

Essa função permite que você selecione um arquivo como variável de entrada. Essa implementação.

input string inFileName = NULL; // Arquivo selecionado

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // Código se um arquivo válido for especificado na variável de entrada.

  return(INIT_SUCCEEDED);
}


Inicialização.


Clique em OK e selecione.


Clique em Abrir e veja as propriedades (F7) do EA em execução.


O mesmo funcionará com qualquer número de arquivos.

input string inFileName1 = NULL; // Arquivo selecionado1
input string inFileName2 = NULL; // Arquivo selecionado2

#define  TOSTRING(A) #A          

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

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // Código se um arquivo válido for especificado na variável de entrada.

  return(INIT_SUCCEEDED);
}
 
E o carregamento de parâmetros de arquivos de configuração ainda não é suportado, pelo que entendi?
 
traveller00:
E o carregamento de parâmetros de arquivos de configuração ainda não é suportado, pelo que entendi?

Ainda não. Mas é muito simples.