Discussão do artigo "Otimização Walk Forward contínua (Parte 8): Melhorias e correções do programa" - página 3

 
fxsaber:
Solicito que o autor grave um vídeo mostrando os diferentes usos desse projeto.

Se você tiver tempo livre. Mas, em geral, a solicitação de vocês é um pouco inesperada, pois vocês viram minhas publicações desde o primeiro artigo (embora talvez nem todas tenham sido seguidas).

 

Olá,

Projeto incrível, muito obrigado por isso.

Tenho um problema com a compilação do DealHistoryGetter.mqh e a mensagem de erro é: 'calcContracts' - member function not defined line 488.


Mais uma vez, muito obrigado.

 

Olá,

Projeto incrível,muito obrigado por isso.

Tenho um problema com a compilação do DealHistoryGetter.mqh e a mensagem de erro é: ' calcContracts' - memberfunction not defined line 488.


Mais uma vez, muito obrigado.

Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Franco87:

Olá,

Projeto incrível,muito obrigado por isso.

Tenho um problema com a compilação do DealHistoryGetter.mqh e a mensagem de erro é: ' calcContracts' - memberfunction not defined line 488.


Mais uma vez, muito obrigado.

Olá, recentemente conpilei meu expert que está usando esse arquivo e tudo estava bem.

 
Se eu compilar os arquivos .mq5 que você enviou do seu consultor especialista chamado "New uploading variant" (Nova variante de carregamento), ele mostrará vários erros, como você pode ver na imagem abaixo. Acabei de baixar a última versão publicada (8º artigo).

O que devo fazer para resolver isso?





Atenciosamente
 

Olá, Andrei. Decidi voltar à busca do graal e fiquei feliz ao encontrar seu otimizador funcionando e finalizado. As soluções criadas inteiramente com base no Mql5 acabaram exigindo muito do suporte do autor e saíram dos trilhos. E seu otimizador funcionará enquanto houver C# e a janela do testador de estratégias no MT5 permanecerá inalterada. É estranho que não exista uma demanda em massa para aotimização back-forward. De qualquer forma, muito obrigado por seu trabalho árduo!


O testador já está funcionando, mas gostaria de expressar alguns desejos. Talvez até mesmo outra pessoa continue a refinar o projeto e a colocá-lo na base de código.
1. Gostaria de ter dicas de ferramentas com explicações no cabeçalho das tabelas com resultados. O que são: var 90, var 95, mx....
2. Os valores de PL e DD nas janelas 1 e 3 da guia "resultados" não correspondem. Bem, e as unidades de medida?
3. A função OnTester() não é compilada porque está definida nos arquivos do otimizador, portanto, os critérios totalmente personalizados são cancelados. Entre os critérios padrão, o programa permite que você digite qualquer conjunto.
4. Como podemos fazer sem gráficos de equilíbrio? Você pode colar todos os avançados e executá-los em um testador, por exemplo, ou melhor, um gráfico aproximado na janela do otimizador de uma só vez para avaliar se o EA vale a pena ser desperdiçado por mais tempo. No mínimo, o otimizador deve exibir o resultado final de todas as passagens avançadas.
5. O cálculo do lucro em pips é necessário. Especialmente considerando como o testador trabalha com criptografia. Adicione uma caixa de seleção.
6. E, por fim, gostaria de sonhar com a possibilidade de adicionar vários TFs. Semelhante à possibilidade de adicionar vários ativos.
Bem, e muito, muito dinheiro....

 
Good Beer otimização back-forward. De qualquer forma, muito obrigado por seu trabalho!


O testador já está funcionando, mas vou expressar alguns desejos. Talvez até mesmo outra pessoa continue a refinar o projeto e a colocá-lo na base de código.
1. Gostaria de ter dicas de ferramentas com explicações no cabeçalho das tabelas com resultados. O que são: var 90, var 95, mx....
2. Os valores de PL e DD nas janelas 1 e 3 da guia "resultados" não correspondem. Bem, e as unidades de medida?
3. A função OnTester() não é compilada porque está definida nos arquivos do otimizador, portanto, os critérios totalmente personalizados são cancelados. Entre os critérios padrão, o programa permite que você digite qualquer conjunto.
4. Como podemos fazer sem gráficos de equilíbrio? Você pode colar todos os encaminhamentos e executá-los em um testador, por exemplo, ou, melhor ainda, apresentar um gráfico aproximado na janela do otimizador de uma só vez para avaliar se o consultor vale a pena perder mais tempo. No mínimo, o otimizador deve exibir o resultado final de todas as passagens a termo.
5. O cálculo do lucro em pips é necessário. Especialmente considerando como o testador trabalha com criptografia. Adicione uma caixa de seleção.
6. E, por fim, gostaria de sonhar com a possibilidade de adicionar vários TFs. Semelhante à possibilidade de adicionar vários ativos.
Bem, e muito, muito dinheiro....

Obrigado por seu feedback. Não apoio este projeto, mas sim, ele deve funcionar por muito tempo.

Se alguém quiser refinar e ajustar o projeto, faça-o.
https://github.com/AndreyKrivcov/MetaTrader-Auto-Optimiser.

GitHub - AndreyKrivcov/MetaTrader-Auto-Optimiser
GitHub - AndreyKrivcov/MetaTrader-Auto-Optimiser
  • AndreyKrivcov
  • github.com
Experts mast use class CAutoUploader (CustomInclude/History manager/AutoLoader.mqh)
 
EDUARDO RODRIGUES NASCIMENTO #:
Se eu compilar os arquivos .mq5 que você enviou do seu consultor especialista chamado "New uploading variant" (Nova variante de carregamento), ele mostrará vários erros, como você pode ver na imagem abaixo. Acabei de baixar a última versão publicada (8º artigo).

O que devo fazer para resolver isso?





Atenciosamente

Então. Faça o download do arquivo anexado ao artigo e veja duas pastas nele:

Então. Baixamos o arquivo anexado ao artigo e vemos duas pastas nele:


Mova a pasta MetaTrader-Auto-Optimiser do arquivo para o diretório raiz onde o MetaTrader 5 está localizado:

Mova a pasta MetaTrader-Auto-Optimiser do arquivo para o diretório raiz onde o MetaTrader 5 está localizado:


Há duas pastas na pasta MQL5 no arquivo - copie-as para a pasta MQL5 de seu terminal. Assim, a pasta Test Expert será copiada para a pasta MQL5, e duas pastas: CustomGeneric e History manager serão copiadas para a pasta MQL5.

Compile o arquivo SimpleMA.mq5 na pasta Experts\Test Expert\New uploading variant:

Há duas pastas no arquivo, na pasta MQL5 - copie-as para a pasta MQL5 de seu terminal. Da mesma forma, a pasta Test Expert será copiada para a pasta MQL5\Experts, e duas pastas serão copiadas para a pasta MQL\Include: CustomGeneric e History manager.

Compile o arquivo SimpleMA.mq5 localizado na pasta Experts\Test Expert\New uploading variant:


Recebemos 100 erros e 60 avisos:

Recebemos 100 erros e 60 avisos:


Vamos passar para o primeiro erro e ver que não se trata de uma importação fechada:

Vamos passar para o primeiro erro e ver que não se trata de uma importação fechada:


Clique duas vezes na inscrição sobre o erro e acesse o arquivo UploadersEntities.mqh na linha com o erro:

Clique duas vezes na inscrição sobre o erro e acesse o arquivo UploadersEntities.mqh na linha com o erro:


O que estamos vendo? E vemos que a importação realmente não foi fechada. Vamos corrigir isso:

O que estamos vendo? E vemos que a importação realmente não foi fechada. Vamos consertar:

//+------------------------------------------------------------------+
//|UploadersEntities.mqh
//| Copyright 2020, MetaQuotes Software Corp.
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

#include "ReportCreator.mqh"
#import "ReportManager.dll"
#import
//+------------------------------------------------------------------+
//| Estrutura que armazena dados sobre parâmetros de entrada
//+------------------------------------------------------------------+
struct BotParams
  {
   string            name,value;
  };

// Adição de um novo valor à matriz dinâmica
#define ADD_TO_ARR(arr, value) \
{\
   int s = ArraySize(arr);\
   ArrayResize(arr,s+1,s+1);\
   arr[s] = value;\
}

// adicionar um novo parâmetro de robô à matriz de parâmetros dinâmicos
#define APPEND_BOT_PARAM(Var,BotParamArr) \
{\
   BotParams param;\
   param.name = #Var;\
   param.value = (string)Var;\
   \
   ADD_TO_ARR(BotParamArr,param);\
}

//+------------------------------------------------------------------+
//|| Função que copia a lista de matrizes
//+------------------------------------------------------------------+
void CopyBotParams(BotParams &dest[], const BotParams &src[])
  {
   int total = ArraySize(src);
   for(int i=0; i<total; i++)
     {
      ADD_TO_ARR(dest,src[i]);
     }
  }

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double GetAverageCoef(CoefChartType type, CReportCreator &report_manager)
  {
   CoefChart_item coef_chart[];
   report_manager.GetCoefChart(false,type,coef_chart);

   double ans= 0;
   int total = ArraySize(coef_chart);
   for(int i=0; i<total; i++)
      ans+=coef_chart[i].coef;

   ArrayFree(coef_chart);
   return (ans/(double)total);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
string get_path_to_expert(void)
  {
   string arr[];
   StringSplit(MQLInfoString(MQL_PROGRAM_PATH),'\\',arr);
   string relative_dir=NULL;

   int total= ArraySize(arr);
   bool save= false;
   for(int i=0; i<total; i++)
     {
      if(save)
        {
         if(relative_dir== NULL)
            relative_dir=arr[i];
         else
            relative_dir+="\\"+arr[i];
        }

      if(StringCompare("Experts",arr[i])==0)
         save=true;
     }

   return relative_dir;
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
typedef void(*TCallback)();
typedef double(*TCustomFilter)();
typedef int (*TOnTesterInit)();


//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void EmptyCallback() {}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double EmptyCustomCoefCallback() {return 0;}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int EmptyOnTesterInit() {return(INIT_SUCCEEDED);}

enum ENUM_CALLBACK_TYPE
  {
   CB_ON_TICK,
   CB_ON_TESTER_DEINIT
  };

struct Data
  {
   int tf, // ReportItem.TF
       laverage, // ReportReader.Laverage
       totalTrades, // ReportItem.OptimisationCoefficients.TotalTrades
       totalProfitTrades, // ReportItem.OptimisationCoefficients.MaxPLDD.Profit.TotalTrades
       totalLooseTrades, // ReportItem.OptimisationCoefficients.MaxPLDD.DD.TotalTrades
       consecutiveWins, // ReportItem.OptimisationCoefficients.MaxPLDD.Profit.ConsecutivesTrades
       consequtiveLoose, // ReportItem.OptimisationCoefficients.MaxPLDD.DD.ConsecutivesTrades
       numberProfitTrades_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].Profit.Trades
       numberProfitTrades_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].Profit.Trades
       numberProfitTrades_we, // ReportItem.OptimisationCoefficients.TradingDays[We].Profit.Trades
       numberProfitTrades_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].Profit.Trades
       numberProfitTrades_fr, // ReportItem.OptimisationCoefficients.TradingDays[Fr].Profit.Trades
       numberLooseTrades_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].DD.Trades
       numberLooseTrades_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].DD.Trades
       numberLooseTrades_we, // ReportItem.OptimisationCoefficients.TradingDays[We].DD.Trades
       numberLooseTrades_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].DD.Trades
       numberLooseTrades_fr; // ReportItem.OptimisationCoefficients.TradingDays[Fr].DD.Trades
   ulong startDT, // ReportItem.DateBorders.From
         finishDT; // ReportItem.DateBorders.Till
   double payoff, // ReportItem.OptimisationCoefficients.Payoff
          profitFactor, // ReportItem.OptimisationCoefficients.ProfitFactor
          averageProfitFactor, // ReportItem.OptimisationCoefficients.AverageProfitFactor
          recoveryFactor, // ReportItem.OptimisationCoefficients.RecoveryFactor
          averageRecoveryFactor, // ReportItem.OptimisationCoefficients.AverageRecoveryFactor
          pl, // ReportItem.OptimisationCoefficients.PL
          dd, // ReportItem.OptimisationCoefficients.DD
          altmanZScore, // ReportItem.OptimisationCoefficients.AltmanZScore
          var_90, // ReportItem.OptimisationCoefficients.VaR.Q_90
          var_95, // ReportItem.OptimisationCoefficients.VaR.Q_95
          var_99, // ReportItem.OptimisationCoefficients.VaR.Q_99
          mx, // ReportItem.OptimisationCoefficients.VaR.Mx
          std, // ReportItem.OptimisationCoefficients.VaR.Std
          max_profit, // ReportItem.OptimisationCoefficients.MaxPLDD.Profit.Value
          max_dd, // ReportItem.OptimisationCoefficients.MaxPLDD.DD.Value
          averagePl_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].Profit.Value
          averagePl_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].Profit.Value
          averagePl_we, // ReportItem.OptimisationCoefficients.TradingDays[We].Profit.Value
          averagePl_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].Profit.Value
          averagePl_fr, // ReportItem.OptimisationCoefficients.TradingDays[Fr].Profit.Value
          averageDd_mn, // ReportItem.OptimisationCoefficients.TradingDays[Mn].DD.Value
          averageDd_tu, // ReportItem.OptimisationCoefficients.TradingDays[Tu].DD.Value
          averageDd_we, // ReportItem.OptimisationCoefficients.TradingDays[We].DD.Value
          averageDd_th, // ReportItem.OptimisationCoefficients.TradingDays[Th].DD.Value
          averageDd_fr, // ReportItem.OptimisationCoefficients.TradingDays[Fr].DD.Value
          balance; // ReportReader.Balance
   char              currency[100];
  };
//+------------------------------------------------------------------+

Compilar novamente. O erro de importação desapareceu, mas agora o compilador não vê as funções e os métodos do arquivo importado:

Vamos compilar novamente. O erro de importação desapareceu, mas agora o compilador não vê as funções e os métodos do arquivo importado:


Lembre-se de que estamos importando métodos e classes de uma dll de terceiros. Ela deve estar localizada na pasta MQL5/Libraries.

Abra a pasta MetaTrader-Auto-Optimiser, copiada do arquivo para o diretório raiz do MetaTrader 5. Nela, vemos o arquivo Metatrader Auto Optimiser.sln:

Lembramos que estamos importando métodos e classes de uma dll de terceiros. E ela deve estar na pasta MQL5\Libraries.

Abra a pasta MetaTrader-Auto-Optimiser copiada do arquivo para o diretório raiz do MetaTrader 5. Nela, vemos o arquivo Metatrader Auto Optimiser.sln:


Clique duas vezes nesse arquivo para abrir o projeto no MS Visual Studio.

Ao abrir o projeto, vemos que ele é para uma plataforma desatualizada:

Clique duas vezes nesse arquivo para abrir o projeto no MS Visual Studio.

Ao abrir o projeto, vemos que ele é para uma plataforma desatualizada:


Deixe a caixa de seleção marcada para "Upgrade target to .NET Framefork 4.8 platform" e clique no botão "Continue".

Depois, novamente para o segundo projeto:

Deixe marcada a caixa de seleção "Upgrade target to .NET Framefork 4.8 platform" (Atualizar destino para a plataforma .NET Framefork 4.8) e clique no botão "Continue" (Continuar).

Depois, novamente para o segundo projeto:


Depois de carregar os projetos, selecione "Release" (Liberar) e Any CPU:

Depois de carregar os projetos, selecione "Release" (Liberar) e Any CPU (Qualquer CPU):


E pressione Ctrl+F5 para compilar e construir os projetos.

Depois de compilar o projeto no MS Visual Studio, vá para o diretório raiz do terminal e, nele, para a pasta \MetaTrader-Auto-Optimiser\ReportManager\bin\Release. Copie o arquivo da biblioteca ReportManager.dll construída a partir dessa pasta para o diretório MQL5/Libraries do terminal.

Agora compile novamente o arquivo SimpleMA.mq5 da pasta MQL5\Experts\Test Expert\New uploading variant.

Pronto, não há erros:

E pressione Ctrl+F5 para compilar e construir projetos.

Depois de compilar o projeto no MS Visual Studio, vá para o diretório raiz do terminal e, nele, para a pasta \MetaTrader-Auto-Optimiser\ReportManager\bin\Release. Copie o arquivo de biblioteca compilado ReportManager.dll dessa pasta para o diretório MQL5\Libraries do terminal.

Agora vamos compilar o arquivo SimpleMA.mq5 da pasta MQL5\Experts\Test Expert\New uploading variant novamente.

Pronto, sem erros:


Aproveite

Arquivos anexados:
 
Artyom Trishkin #:

Portanto. Faça o download do arquivo anexado ao artigo e veja duas pastas nele:

Então. Baixamos o arquivo anexado ao artigo e vemos duas pastas nele:


Transfira a pasta MetaTrader-Auto-Optimiser do arquivo para o diretório raiz onde o MetaTrader 5 está localizado:

Mova a pasta MetaTrader-Auto-Optimiser do arquivo para o diretório raiz onde o MetaTrader 5 está localizado:


Há duas pastas na pasta MQL5 no arquivo - copie-as para a pasta MQL5 de seu terminal. Assim, a pasta Test Expert será copiada para a pasta MQL5, e duas pastas: CustomGeneric e History manager serão copiadas para a pasta MQL5.

Compile o arquivo SimpleMA.mq5 localizado na pasta Experts\Test Expert\New uploading variant:

Há duas pastas no arquivo, na pasta MQL5 - copie-as para a pasta MQL5 de seu terminal. Da mesma forma, a pasta Test Expert será copiada para a pasta MQL5\Experts, e duas pastas serão copiadas para a pasta MQL\Include: CustomGeneric e History manager.

Compile o arquivo SimpleMA.mq5 localizado na pasta Experts\Test Expert\New uploading variant:


Recebemos 100 erros e 60 avisos:

Recebemos 100 erros e 60 avisos:


Vá até o primeiro erro e veja que não se trata de uma importação fechada:

Vamos passar para o primeiro erro e ver que não se trata de uma importação fechada:


Obrigado, atualizei as fontes anexadas ao artigo