Discussão do artigo "Otimização Controlada: Recozimento Simulado"

 

Novo artigo Otimização Controlada: Recozimento Simulado foi publicado:

O Testador de Estratégia da plataforma de negociação MetaTrader 5 fornece apenas duas opções de otimização: otimização completa dos parâmetros e o algoritmo genético. Este artigo propõe um novo método para otimizar as estratégias de negociação — Recozimento Simulado (Simulated Annealing). Será introduzido o algoritmo do método, sua implementação e integração em qualquer Expert Advisor. O algoritmo desenvolvido é testado no EA Moving Average (Média Móvel).

O Recozimento Simulado é um dos métodos de otimização estocástica. Ele é uma busca aleatória ordenada para a otimalidade da função objetivo.

O algoritmo de recozimento simulado é baseado na simulação da formação de uma estrutura cristalina em uma substância. Os átomos em uma rede cristalina de uma substância (por exemplo, um metal) podem tanto entrar em um estado com um nível de energia mais baixo quanto permanecer inalterado à medida que a temperatura diminui. A probabilidade de entrar em um novo estado diminui em proporção à temperatura. A mínima ou o máxima da função objetivo será encontrada através da simulação de tal processo.

O processo de busca pela função objetivo ótima pode ser representada da seguinte maneira:

Busca pela função objetivo ótima

Fig. 1. Busca pela função objetivo ótima

Na figura 1, os valores da função objetivo são representados como uma bola que rola ao longo de uma superfície irregular. A bola azul mostra o valor inicial da função objetivo, a verde mostra o valor final (mínimo global). As bolas vermelhas são os valores da função em seus mínimos locais. O algoritmo de recozimento simulado tenta encontrar o extremo global da função objetivo e evitar "ficar preso" em seus extremos locais. A probabilidade de cair em um extremo local diminui conforme ele se aproxima do extremo global.

Autor: Aleksey Zinovik

 

O artigo é curioso e muito útil para mim. Entretanto, tenho uma pergunta: quão correta é a comparação de números reais nesse trecho de código?

double AnnealingMethod::FindValue(double val,double step)
  {
   double buf=0;
   if(val==step)
      return val;
   if(step==1)
      return round(val);
 
Ausente
Images\AnnealingMethod\back.bmp
Images\AnnealingMethod\pause.bmp
Images\AnnealingMethod\play.bmp
Images\AnnealingMethod\stop.bmp
Images\AnnealingMethod\forward.bmp
 

Obrigado pela mensagem, corrigida

AnnealingMethod.zip
Zip-файл с картинками для создания интерфейса плеера. Файлы нужно разместить в папке MQL5/Images/AnnealingMethod


 

Este foi um bom artigo. Obrigado ao autor!

Ainda estou um pouco confuso, mas gostaria de dizer algo sobre isso

Несмотря на значительные преимущества, алгоритм метода отжига имеет следующие недостатки реализации:

  • impossibilidade de executar o algoritmo em testes na nuvem;
  • a complexidade da conexão com o Expert Advisor e a necessidade de selecionar parâmetros para obter os melhores resultados.

Proponho ajustar ligeiramente o artigo para que você possa conectar qualquer Expert Advisor com pequenos movimentos.

Por exemplo, você pode conectar o Moving Average.mq5 padrão à implementação apresentada do método de recozimento da seguinte forma

//+------------------------------------------------------------------+
//|Médias móveis.mq5
//| Copyright 2009-2017, MetaQuotes Software Corp.
//|http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double MaximumRisk        = 0.02;    // Risco máximo em porcentagem
input double DecreaseFactor     = 3;       // Fator de redução.
input int    MovingPeriod       = 12;      // Período de média móvel
input int    MovingShift        = 6;       // Deslocamento da média móvel

// Inserir após todas as entradas
#include <AddAnnealingMethod.mqh>
#define  MaximumRisk         Inputs[0]
#define  DecreaseFactor      Inputs[1]
#define  MovingPeriod   (int)Inputs[2]
#define  MovingShift    (int)Inputs[3]

//---
int    ExtHandle=0;
bool   ExtHedging=false;
CTrade ExtTrade;

#define  MA_MAGIC 1234501

E isso é tudo! Não são necessárias mais manipulações. Para que isso funcione, tivemos de alterar ligeiramente uma função

//função para definir parâmetros de otimização
uint AnnealingMethod::RunOptimization(string &InputParams[],int count,double F0,double T)
  {
   Input Mass[];
   ArrayResize(Mass, ArraySize(InputParams));
   
   ResetLastError();
   bool Enable=false;
   double Start= 0;
   double Stop = 0;
   double Step = 0;
   double Value= 0;
   int j=0;
   Alg.HQRndRandomize(&state);//inicialização
   for(int i=0;i<ArraySize(InputParams);i++)
     {
      if(!ParameterGetRange(InputParams[i],Enable,Value,Start,Step,Stop))
         return GetLastError();
// if(Enable)
        {
// ArrayResize(Mass,ArraySize(Mass)+1);
         Mass[j].num=i;
// Mass[j].Value=UniformValue(Start,Stop,Step);
         Mass[j].Value=Enable ? UniformValue(Start,Stop,Step) : Value;
         Mass[j].BestValue=Mass[j].Value;
         Mass[j].Start=Start;
         Mass[j].Stop=Stop;
         Mass[j].Step=Step;
         Mass[j].Temp=T*Distance(Start,Stop);
         j++;
// se(!ParameterSetRange(InputParams[i],false,Value,Start,Stop,count))
         if(Enable && !ParameterSetRange(InputParams[i],false,Value,Start,Step,Stop))
            return GetLastError();
        }
// senão
// InputParams[i]=""";
     }
   if(j!=0)
     {
      if(!ParameterSetRange("iteration",true,1,1,1,count))
         return GetLastError();
      else
         return WriteData(Mass,F0,1);
     }
   return 0;
  }

E ocultar um bom trecho de código em AddAnnealingMethod.mqh.

Arquivos anexados:
 

Таким образом, алгоритм сверхбыстрого отжига — достойный конкурент ГА и при правильных настройках может показать лучший результат.

em quais configurações "corretas"?

O objetivo de um algoritmo de otimização é reduzir o espaço de pesquisa. Se uma pesquisa estiver em andamento, isso significa que a fórmula FF não é conhecida (caso contrário, os extremos poderiam ser calculados usando a fórmula baseada em FF) e, portanto, não há "configurações corretas".

o algoritmo busca o melhor, se todo o resto for igual, ou o pior, é impossível estar um pouco grávido.

Houve tentativas reais de comparar o GA regular e outros AOs em vários testes. os deuses disseram - não haverá luta e amém a isso.

ZY. 1, 2 parâmetros otimizáveis? isso é simplesmente ugh..... tente otimizar várias centenas, milhares de parâmetros com seu recozimento..... seus olhos se abrirão.

 

tester_file é lido somente se existir (o conteúdo não é importante) no momento da compilação.

Se o mq5 foi compilado quando não havia nenhum arquivo correspondente, nem mesmo sua existência posterior será percebida no EX5.

Portanto, se você gerar um arquivo para tester_file em OnTesterInit, certifique-se de compilar o EA quando houver pelo menos um arquivo passado vazio.


@Renat Fatkhullin está um pouco equivocado em sua declaração

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

Um EA sem funções DLL pode enviar dados para algum lugar?

Renat Fatkhullin, 2017.06.21 11:12 AM

fxsaber:

Não verifiquei, mas presumo que esse arquivo possa ser gerado diretamente no OnTesterInit.

Não, ele não entrará no pacote de dados calculado na própria passagem.


O artigo mostra que o OnTesterInit gera perfeitamente os dados a serem enviados aos agentes como um arquivo. É claro que esses dados podem ser de natureza pessoal...

 

O autor fez um ótimo trabalho. Artigo muito interessante.

Muito obrigado.

 
Andrey Dik:

Houve tentativas reais de comparar o GA regular e outros AOs em vários testes. Os deuses disseram - não haverá monociclo e amém a isso.

ZY. 1, 2 parâmetros otimizáveis? isso é simplesmente ugh..... tente otimizar várias centenas, milhares de parâmetros com seu recozimento..... seus olhos se abrirão.

O artigo é valioso não por causa do algoritmo de otimização (embora ele seja mais do que interessante), mas por causa da implementação incorporada ao otimizador padrão. A implementação é muito fora do padrão no momento e até mesmo contradiz algumas declarações dos desenvolvedores. Mas, para entendê-la, você precisa ler o código-fonte, que não diz respeito ao algoritmo de recozimento em si.

Nada o impede de incorporar seu próprio algoritmo e mostrar seus prós e contras diretamente nos Expert Advisors, como fez o autor.

 
Sergey Pavlov:

O artigo é curioso e muito útil para mim. No entanto, tenho uma pergunta: quão correta é a comparação de números reais nesse trecho de código?

Sim, você está certo, é impossível comparar dessa forma. A Ajuda MQL5 sugere o uso da seguinte função:

bool CompareDoubles(double number1,double number2) 
  { 
   if(NormalizeDouble(number1-number2,8)==0) return(true); 
   else return(false); 
  } 

Mas mesmo que a comparação seja realizada incorretamente, a função FindValue produzirá o resultado correto

 
fxsaber:

O artigo é valioso não pelo algoritmo de otimização (embora ele seja mais do que interessante), mas pela implementação incorporada ao otimizador padrão. A implementação é muito fora do padrão no momento e até mesmo contradiz algumas declarações dos desenvolvedores. Mas, para entendê-la, você deve ler o código-fonte, que não diz respeito ao algoritmo de recozimento em si.

Nada o impede de incorporar seu próprio algoritmo e mostrar seus prós e contras diretamente nos Expert Advisors, como fez o autor.

Está claro que o artigo é valioso na implementação do gerenciamento de otimização, mas o autor faz uma comparação com o algoritmo padrão por algum motivo, e até mesmo com um número insignificante de parâmetros - foi isso que tentei enfatizar em minha postagem, que é inútil competir com o otimizador padrão na faixa de espaço de pesquisa (número de parâmetros e sua etapa) suficiente para fins práticos de algotraders.

E se a otimização personalizada tiver que ser usada, definitivamente não será dessa forma, porque o "gargalo" na velocidade é o próprio testador, não o AO, e a qualidade já foi mencionada - o padrão já é bom o suficiente.