Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 20): Organizando o pipeline de etapas de otimização automática de projetos (I)"

 

Novo artigo Desenvolvendo um EA multimoeda (Parte 20): Organizando o pipeline de etapas de otimização automática de projetos (I) foi publicado:

Já criamos diversos componentes que facilitam o processo de otimização automática. Durante sua criação, seguimos a ciclicidade tradicional: desde a criação do código funcional mínimo até a refatoração e a obtenção de um código melhorado. Agora é hora de organizar nossa base de dados, que também é um componente-chave no sistema que estamos criando.

Lembramos que, no contexto deste ciclo de artigos, estamos tentando criar um sistema de otimização automática que permita, sem a participação humana, encontrar boas combinações de parâmetros de uma única estratégia de trading, que depois serão combinadas em um EA (Expert Advisor) final. A tarefa foi descrita em detalhes nas partes 9 e partes 11. O processo de busca será gerido por um EA otimizador, e todos os dados que precisarem ser salvos durante sua execução serão registrados na base de dados principal.

Na base de dados, temos tabelas para armazenar informações sobre várias classes de objetos. Alguns possuem um campo de status, que pode assumir valores de um conjunto fixo ("Na fila", "Em execução", "Concluído"), mas nem todas as classes utilizam esse campo. Mais especificamente, ele é utilizado apenas para as tarefas de otimização (task). Nosso EA otimizador busca na tabela de tarefas (tasks) aquelas com o status "Na fila", para selecionar a próxima tarefa a ser executada. Após a conclusão de cada tarefa, seu status na base de dados é alterado para "Concluída".

Vamos tentar implementar a atualização automática dos status não apenas para as tarefas, mas também para todas as outras classes de objetos (trabalhos, etapas, projetos) e organizar a execução automática de todas as etapas necessárias até que o EA final seja obtido, podendo operar de forma independente, sem conexão com a base de dados.

Autor: Yuriy Bykov

 

Tentei executar seu exemplo.

Eu defini groupId_ = 1.

Mas o especialista não é criado na função de inicialização. Aqui está o resultado:

int OnInit() {
// Definir parâmetros na classe de gerenciamento de capital
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

// Cadeia de inicialização com conjuntos de parâmetros de estratégia
   string strategiesParams = NULL;

// Se o índice selecionado do grupo de estratégias da biblioteca for válido, então
   if(groupId_ >= 0 && groupId_ < ArraySize(CGroupsLibrary::s_params)) {
      // Obtenha a string de inicialização da biblioteca para o grupo selecionado
      strategiesParams = CGroupsLibrary::s_params[groupId_];
   }

// Se o grupo de estratégias da biblioteca não for especificado, abortar a operação
   if(strategiesParams == NULL) {
      return INIT_FAILED;
   }

// Preparar a string de inicialização para um Expert Advisor com um grupo de várias estratégias
   string expertParams = StringFormat(
                            "class CVirtualAdvisor(\n"
                            "    class CVirtualStrategyGroup(\n"
                            "       [\n"
                            "        %s\n"
                            "       ],%f\n"
                            "    ),\n"
                            "    class CVirtualRiskManager(\n"
                            "       %d,%.2f,%d,%.2f,%.2f,%d,%.2f,%.2f,%d,%.2f,%d,%.2f,%.2f"
                            "    )\n"
                            "    ,%d,%s,%d\n"
                            ")",
                            strategiesParams, scale_,
                            rmIsActive_, rmStartBaseBalance_,
                            rmCalcDailyLossLimit_, rmMaxDailyLossLimit_, rmCloseDailyPart_,
                            rmCalcOverallLossLimit_, rmMaxOverallLossLimit_, rmCloseOverallPart_,
                            rmCalcOverallProfitLimit_, rmMaxOverallProfitLimit_, rmMaxOverallProfitDate_,
                            rmMaxRestoreTime_, rmLastVirtualProfitFactor_,
                            magic_, "SimpleVolumes", useOnlyNewBars_
                         );

   PrintFormat(__FUNCTION__" | Expert Params:\n%s", expertParams);

// Criar um Expert Advisor que funcione com posições virtuais
   expert = NEW(expertParams);

// Se o Expert Advisor não for criado, retorna um erro
   if(!expert) return INIT_FAILED;

...
}


Se formos mais a fundo, o objeto não é criado em CVirtualFactory():

class CVirtualFactory {
public:
   // Criação de um objeto a partir da string de inicialização
   static CFactorable* Create(string p_params) {
      // Ler o nome da classe do objeto
      string className = CFactorable::ReadClassName(p_params);
      
      // Ponteiro para o objeto a ser criado
      CFactorable* object = NULL;

      // Dependendo do nome da classe, chame o construtor correspondente
      if(className == "CVirtualAdvisor") {
         object = new CVirtualAdvisor(p_params);
...

Você pode me dizer qual é o problema e como posso testar seu exemplo em ação?

Obrigado.

 

Olá.

Pode ser que você não tenha concluído o trabalho de criação de entradas na biblioteca de parâmetros ou mesmo todas as outras etapas necessárias da otimização automática. Por exemplo, você pode ler mais sobre a última etapa - preenchimento da biblioteca - na Parte 17.

É possível, porém, que o ponto seja diferente. O ideal é que você não precise de um banco de dados para executar o EA final. Vou verificar o código e responderei mais tarde.
 
Dei uma olhada no código para este artigo. De fato, até agora não chegamos ao último estágio da automação, em que o EA final que não está vinculado ao banco de dados de otimização é gerado automaticamente. Isso será feito em um artigo futuro. Por enquanto, a execução preliminar dos primeiros estágios do pipeline é necessária para obter os resultados.
 

Oi Yuriy

Usei o Google Translate para chegar à Parte 20. Pesquise "Google Translate" no Google e coloque-o em uma nova guia no navegador. Ele colocará um ícone na barra de pesquisa, na extremidade direita. Carregue a página em seu idioma nativo e pressione o ícone para selecionar o idioma do artigo e o idioma a ser traduzido para ele. Presto, estou na parte 20! Ele não faz um trabalho perfeito, mas a tradução é 99% útil.

Carreguei seu Archive Source no Excel e adicionei algumas colunas para classificar e organizar o conteúdo. Além de classificar no Excel, a planilha pode ser importada diretamente para um banco de dados do OutLook


Estou tendo problemas para identificar o artigo inicial para estabelecer o banco de dados SQL. Tentei executar o Volume Simples Estágio 1 e obtive uma linha plana, o que me indica que provavelmente preciso voltar atrás e criar outro banco de dados SQL. Seria extremamente útil ter uma tabela com a ordem de execução dos programas necessários para obter um sistema funcional. Talvez você possa adicioná-la à tabela Archive Source.

Outra pequena solicitação é usar a opção <> para incluir especificações de arquivo em vez de "". Estou mantendo seu sistema separado em meus diretórios Experts e Include, #include <!!!! MultiCurrency\VirtualAdvisor.mqh>, portanto, essa alteração facilitará a adição da especificação do subdiretório/.

Obrigado por sua contribuição

CapeCoddah

Arquivos anexados:
 

Olá.

Sobre o preenchimento inicial do banco de dados com informações sobre o projeto, etapas, trabalhos e tarefas, você pode ver nas partes 13, 18 e 19. Esse não é o tópico principal, portanto, as informações de que você precisa estarão em algum lugar mais próximo do final dos artigos. Por exemplo, na parte 18:

Проверив, что в базу данных теперь корректно попадают результаты проходов, совершаемых с использованием форвард-периода, проведём более приближенный к реальным условиям тест работы автоматической оптимизации. Для этого в чистую базу данных добавим уже два этапа. На первом будет оптимизироваться одиночный экземпляр торговой стратегии, но только на одном символе и периоде (EURGBP H1) на промежутке 2018 - 2023 годов. Форвард-период на этом этапе использоваться не будет. На втором этапе будет оптимизироваться группа из хороших одиночных экземпляров, полученных на первом этапе. Теперь форвард период уже будет использоваться: под него отводится весь 2023 год.

Ou na parte 19:

Vamos criar quatro estágios no banco de dados para o nosso projeto, denominados "First" (Primeiro), "Clustering passes from first stage" (Passagens de agrupamento do primeiro estágio), "Second" (Segundo) e "Second with clustering" (Segundo com agrupamento). Para cada estágio, criaremos dois trabalhos para os símbolos EURGBP e GBPUSD no período de tempo H1. Para os trabalhos do primeiro estágio, criaremos três tarefas de otimização com critérios diferentes (complexo, lucro máximo e personalizado). Para o restante dos trabalhos, criaremos uma tarefa cada. Consideraremos o período de 2018 a 2023 como o intervalo de otimização. Para cada tarefa, especificaremos os valores corretos dos parâmetros de entrada.

Ou você pode aguardar o próximo artigo, que será dedicado, entre outras coisas, à questão do preenchimento inicial do banco de dados com a ajuda de um script auxiliar.

A mudança para o uso da pasta include para armazenar os arquivos da biblioteca está nos planos, mas ainda não chegou a esse ponto.

 
Yuriy Bykov armazenar a biblioteca está nos planos, mas até o momento não foi concretizada.

Muito obrigado

 

Oi Yuriy,

Você já enviou o próximo artigo ou sabe quando ele será publicado?

 
Olá, provavelmente em um mês.