Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 20): Organizando o pipeline de etapas de otimização automática de projetos (I)"
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.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
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:
Ou na parte 19:
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.
Oi Yuriy,
Você já enviou o próximo artigo ou sabe quando ele será publicado?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Desenvolvendo um EA multimoeda (Parte 20): Organizando o pipeline de etapas de otimização automática de projetos (I) foi publicado:
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