Bibliotecas: MultiTester - página 9

 
fxsaber:

Agora, você tem total liberdade para automatizar o testador.

Um dos exemplos de aplicativos reais (tudo é feito automaticamente)

  1. Todos os símbolos são obtidos e as etapas a seguir são executadas para cada símbolo.
  2. Inicio a otimização.
  3. No final da melhor passagem, os dados são obtidos e, a partir deles, são formadas (intervalos definidos de parâmetros de entrada) várias tarefas para otimização.
  4. Todas as otimizações do item 3 são executadas.
  5. As melhores passagens são obtidas de todas as otimizações do item 4 e salvas como conjuntos para negociação de portfólio.


Ele se mostrou um scanner de mercado e um ajustador de TS muito eficientes. As fontes TC não são necessárias para essas manipulações.

 
// Exemplo de carregamento de um arquivo de conjunto no testador.
#property script_show_inputs

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/pt/code/26132

input string inFileName = "SetFile.set"; // Set-file

string FileToString( const string FileName )
{
  ushort Buffer[];
  
  return(FileLoad(FileName, Buffer) ? ShortArrayToString(Buffer) : NULL);
}

void OnStart()
{  
  MTTESTER::SetSettings("[TesterInputs]\n" + FileToString(inFileName));
}
Da mesma forma, com os arquivos ini do testador.
 
Obrigado, senhor
 
A biblioteca foi atualizada para o MT5 build2209+.
 
fxsaber:

Ele acabou se tornando um scanner de mercado e um ajustador de TS muito eficiente.

#property script_show_inputs

#include <fxsaber\MultiTester\MultiTester.mqh> // https://www.mql5.com/pt/code/26132
#include <fxsaber\MultiTester\Task.mqh>

input bool OnlyCustomSymbols = true; // Somente caracteres personalizados
input bool AllSymbols = false;       // Todos os caracteres ou atuais

void Add( const string SymbName )
{
  TesterSettings.Add(NULL, SymbName, 0, 0, 0, TASK::InitBase, TASK::DeinitBase);

  for (int i = 0; i < ::inAmount; i++)
    TesterSettings.Add(NULL, NULL, 0, 0, 0, TASK::InitSub, TASK::DeinitSub);
}

// Essa função é responsável por gerar a lista de tarefas.
void SetTesterSettings()
{
  if (AllSymbols)
    // Pesquisar todos os símbolos do Market Watch.
    for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
    {
      const string Name = SymbolName(i, true);

      if (!OnlyCustomSymbols || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
        Add(Name);
    }
  else if (!OnlyCustomSymbols || SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM))
    Add(_Symbol);
}


O Expert Advisor deve ter

sinput int inMinTrades = 500; // Número mínimo de negociações (posições).
sinput int inMaxTrades = 90000; // Número máximo de negociações (posições).

double OnTester()
{
  return(((TesterStatistics(STAT_TRADES) >= inMinTrades) && (TesterStatistics(STAT_TRADES) <= inMaxTrades)) ? TesterStatistics(STAT_PROFIT) : 0);
}
 
Contornei algumas armadilhas. Atualizado.
 

Não sei sobre as versões anteriores. Mas a versão mais recente pode executar um teste para o mesmo instrumento várias vezes.

Done aparece no registro, depois vazio (Start não aparece), e o terminal iniciou uma nova passagem ao mesmo tempo. Parece que else if (IsRun = (Init = TesterSettings.Init(Pos)) && TesterSettings.Run(Pos)) retorna falso, porque TesterSettings.Run(Pos) retornou falso. E na próxima passagem do cronômetro, else if (MTTESTER::IsReady()) retornará false, o que fará com que o loop fique esperando. O próprio TesterSettings.Run(Pos)) retorna falso, o que parece ser trivial devido ao tempo limite, ou seja, ele simplesmente não espera e sai.

 

traveller00:

TesterSettings.Run(Pos)) retorna falso parece ser trivial devido ao tempo limite, ou seja, ele simplesmente não espera e sai.

Se for o caso, tente aumentar esse número

  static bool ClickStart( const bool Check = true, const int Attempts = 5 )

Nunca tive um caso em que o botão Iniciar não se transformasse em um botão Parar por um longo tempo após ser pressionado.


Executei o Exemplo 3 com cem caracteres e tudo funcionou bem.

 
Sim, foi isso que eu fiz, aumentei para 50. Mas só para o caso de alguém ter um problema semelhante ou querer ajustá-lo na versão geral.
 
traveller00:
Sim, foi isso que eu fiz, aumentei para 50. Mas para o caso de alguém ter um problema semelhante ou querer ajustá-lo na versão geral.

Registrei o número de tentativas necessárias para alterar o status do botão. Resultados interessantes.


ZY Talvez esse bug ainda esteja ocorrendo.