Em busca do sagrado 'graal'... - página 9

 
Hoper23 >> :
O problema é que o objetivo da tarefa é claro, mas a possibilidade de sua implementação em MQL parece pouco clara, pois ainda não estou familiarizado com a função de matriz embutida do otimizador de testes. Estou tentando reler o manual da MQL, mas ainda não encontrei este bloco. E o otimizador feito pelo próprio núcleo não é tão pouco confiável como não é bem compreensível. As variáveis são compostas de forma bastante estranha, não há nenhuma anotação e são fundamentalmente diferentes da versão de trabalho mencionada no link acima. Se não for difícil, caro leitor, explique seu ponto de vista sobre o otimizador, para que você possa encaixar todos os 19 parâmetros e substituir automaticamente o resultado.

Sinto-me estranho ao ouvir isso de um programador, mas vou tentar decifrá-lo (não soletrá-lo):

1. Suponha que você tenha uma função com N número de parâmetros de entrada

Função(n1,n2,...,n19);

2.Parâmetros

n1 varia de n1Min a n1Max com o passo n1Step

....

n19 muda de n19Min para n19Max com n19Step


Você precisa fazer isso:

- Passar por todos (para o método linear) os parâmetros de entrada ou não todos (para o método de convergência rápida) os parâmetros de entrada.

Há muitos métodos de convergência rápida, um dos quais é o algoritmo genético.

- Cada vez que você insere um novo lote de parâmetros, você obtém o resultado da função na saída.

- Você precisa escrever um bloco para analisar esses resultados e decidir se o resultado é

bom.

Entendo que você está tendo problemas com a unidade de análise. Porque se você não souber como escrever uma função ou como

ou como olhar através dos parâmetros de entrada, não é para mim, é para as aulas de programação ou para as pessoas que gostam de soletrar

os princípios básicos da programação.

O que a unidade de análise faz:

1. leva a barra BAR_Y mais antiga que você quer analisar, e desliza os dados atuais no momento Y em seu

função. Ou seja, sua função pensa que BAR_Y é TimeCurrent.

2. agora tome tantas barras na profundidade da história como sua Função(n1,n2,...,n19) tomaria se estivesse na barra 0.

e obter algum resultado.

Por exemplo, sua estratégia está procurando um extremo ao longo do iMA3,iMA2,iMA1. Depois temos iMA_Y+2,iMA_Y+1,iMA_Y

Se for um ponto extremo, nós paramos, se não fizermos Y++;

OK. Encontramos o ponto de extremo na posição t, ou seja, iMAt+2,iMAt+1,iMAt

Agora precisamos calcular se TP ou SL serão acionados

Isto é, do ponto t descemos as barras t-1 e analisamos a distância de Open[t] a High[t] e a Low[t],

e então de Open[t] para High[t-1] e para Low[t-1], se não alcançarmos TP ou SL, vamos mais longe - pegamos t-2 e assim por diante até que funcione

TP ou SL ou ambos.

Encontramos a PRIMEIRA condição para a Função(n1,n2,...,n19).

Vamos salvar o resultado,

Em seguida, fazemos t-- e prosseguimos com a análise até a barra 0.

4. nós mudamos Y... e repetimos o processo.

Assim, encontramos todas as ocorrências de nossa função Função(n1,n2,...,n19) até o momento atual.

5.Analisar o momento atual e ver se houve situações semelhantes no passado e como elas terminaram.

6.guardar o resultado.

7.pegar o próximo conjunto de parâmetros n1,,n19 para Função(n1,n2,...,n19) e verificá-lo

8.Repetir até que fiquemos sem parâmetros.

9. Escolhemos o melhor conjunto de parâmetros ou vários conjuntos e, de acordo com suas recomendações, ajustamos COMPRAR, VENDER ou

não fazer nada.

Isso é tudo.

Espero que seja difícil, porque é realmente difícil.


 
Hoper23 >> :
O problema é que a finalidade da tarefa é clara, mas a possibilidade de sua implementação em linguagem MQL parece pouco clara, pois ainda não estou familiarizado com a função do conjunto integrado do otimizador-optimizador de teste. Atualmente estou tentando reler o manual da MQL, mas ainda não encontrei este bloco. E o otimizador feito pelo próprio núcleo não é tão pouco confiável como não é muito claro. As variáveis são bastante assustadoramente escritas ali, não há nenhuma anotação e são fundamentalmente diferentes da versão de trabalho mencionada no link acima. Se não for difícil, caro leitor, explique seu ponto de vista sobre o otimizador, de modo que eu possa enfiar todos os 19 parâmetros e resultados autocompletos.

A propósito, não comece com o bloco de enumeração - é muito mais fácil escrever do que analisar.

E se você achar tudo o que eu disse muito complicado, procure o auto-optimizador por xeon.

Ele utiliza o otimizador MetaTrader. Não procure a função de auto-optimização integrada. Não há nenhuma.

 
Figar0 >> :

Aqui está o indicador klot's com otimizador GA embutido no indicador.

Acho que a Hoper23 não irá analisá-la geneticamente, não importa se este vínculo for quebrado ou não.

Mais ainda, não está quebrado.

 

thecore==> pelo seu raciocínio, assim como pelo meu, você recebe por(S = Sstart; S <= Send; S += Sstep), bem, em termos gerais. Aqui está o que eu tenho

void Optimization()
{
 int StartBar = iBarShift(Symbol(), 0, TimeCurrent()-60*( EndDate+ OptimDuration));
 int EndBar = iBarShift(Symbol(), 0, TimeCurrent()-60* EndDate);
 int Count = 0;
 double CurRF = -999999;
 ArrayInitialize( EqualProfit, 0);
 ArrayInitialize( TransCount, 0);
 ArrayInitialize( MaxDrowDown, 0);
 for( S = Sstart; S <= Send; S += Sstep)
 for( O = Ostart; O <= Oend; O += Ostep)
 for( I = Istart; I <= Iend; I += Istep)
 for( G = Gstart; G <= Gend; G += Gstep)
 for( M = Mstart; M <= Mend; M += Mstep)
 for( CC = CCstart; CC <= CCend; CC += CCstep)
 for( CCI = CCIstart; CCI <= CCIend; CCI += CCIstep)
 for( F_EMA = F_EMAstart; F_EMA <= F_EMAend; F_EMA += F_EMAstep)
 for( S_EMA = S_EMAstart; S_EMA <= S_EMAend; S_EMA += S_EMAstep)
 for( SMA = SMAstart; SMA <= SMAend; SMA += SMAstep)
 for( stK = stKstart; stK <= stKend; stK += stKstep)
 for( stP = stPstart; stP <= stPend; stP += stPstep)
 for( stD = stDstart; stD <= stDend; stD += stDstep)
 for( W = Wstart; W <= Wend; W += Wstep)
 for( H = Hstart; H <= Hend; H += Hstep)
 for( C = Cstart; C <= Cend; C += Cstep)
 for( Skill = Skillstart; Skill <= Skillend; Skill += Skillstep)
 for( SkillMAX = SkillMAXstart; SkillMAX <= SkillMAXend; SkillMAX += SkillMAXstep)
 for( shirina = shirinastart; shirina <= shirinaend; shirina += shirinastep)
   {
    int CurTrans =0;
    double CurOpenPrice = 0;
    int EqualMax = 0;
    int EqualMin = 0;
     for(int i = StartBar; i >= EndBar; i--)
      {
       EqualMin = MathMin( EqualProfit[ Count], EqualMin);
       if( EqualProfit[ Count] > EqualMax)
        {
         MaxDrowDown[ Count] = MathMax( MaxDrowDown[ Count], EqualMax- EqualMin);
         EqualMax = EqualProfit[ Count];
         EqualMin = EqualMax;
        }
        MaxDrowDown[ Count] = MathMax( MaxDrowDown[ Count], EqualMax- EqualMin);
    if( EqualProfit[ Count] != 0)
     if( CurRF < MaxDrowDown[ Count]/ EqualProfit[ Count])
      {
       CurRF = MaxDrowDown[ Count]/ EqualProfit[ Count];
       int Num = Count;
       int BestS = S;
       int BestO = O;
       int BestI = I;
       int BestG = G;
       int BestM = M;
       int BestCC = CC;
       int BestCCI = CCI;
       int BestF_EMA = F_EMA;
       int BestS_EMA = S_EMA;
       int BestSMA = SMA;
       int BeststK = stK;
       int BeststP = stP;
       int BeststD = stD;
       int BestW = W;
       int BestH = H;
       int BestC = C;
       int BestSkill = Skill;
       int BestSkillMAX = SkillMAX;
       int Bestshirina = shirina;

        }
     
    Count++;
   } // Цикл переменных 
 
   
 Alert("Оптимизация завершена. Прибыль max ", EqualProfit[ Num]," пунктов. Сделок ", TransCount[ Num], ". Просадка ", MaxDrowDown[ Num]);
 Alert("Параметры: S = ", BestS, ", O = ", BestO, ", I = ", BestI, ", G = ", BestG, ", M = ", BestM, ", CC = ", BestCC, ", CCI = ", BestCCI,
  ", F_EMA = ", BestF_EMA, ", S_EMA = ", BestS_EMA, ", SMA = ", BestSMA, ", stK = ", BeststK, ", stP = ", BeststP, ", stD = ", BeststD,
   ", W = ", BestW, ", H = ", BestH, ", C = ", BestC, ", Skill = ", BestSkill, ", SkillMAX = ", BestSkillMAX, ", shirina = ", Bestshirina);
 LastOptim = TimeCurrent();
 GlobalVariableSet("LastOptimization", LastOptim);
 if( CurRF < 0)
  if(MessageBox("Фактор восстановления меньше нуля./nПринимать данные оптимизированные параметры?", "Вопрос", MB_YESNO) == IDNO) 
    return;    
        BestS = S;
        BestO = O;
        BestI = I;
        BestG = G;
        BestM = M;
        BestCC = CC;
        BestCCI = CCI;
        BestF_EMA = F_EMA;
        BestS_EMA = S_EMA;
        BestSMA = SMA;
        BeststK = stK;
        BeststP = stP;
        BeststD = stD;
        BestW = W;
        BestH = H;
        BestC = C;
        BestSkill = Skill;
        BestSkillMAX = SkillMAX;
        Bestshirina = shirina;

 GlobalVariableSet("AutoS", S);
 GlobalVariableSet("AutoO", O);
 GlobalVariableSet("AutoI", I);
 GlobalVariableSet("AutoG", G);
 GlobalVariableSet("AutoM", M);
 GlobalVariableSet("AutoCC", CC);
 GlobalVariableSet("AutoCCI", CCI);
 GlobalVariableSet("AutoF_EMA", F_EMA);
 GlobalVariableSet("AutoS_EMA", S_EMA);
 GlobalVariableSet("AutoSMA", SMA);
 GlobalVariableSet("AutostK", stK);
 GlobalVariableSet("AutostP", stP);
 GlobalVariableSet("AutostD", stD);
 GlobalVariableSet("AutoW", W);
 GlobalVariableSet("AutoH", H);
 GlobalVariableSet("AutoC", C);
 GlobalVariableSet("AutoSkill", Skill);
 GlobalVariableSet("AutoSkillMAX", SkillMAX);
 GlobalVariableSet("Autoshirina", shirina);
Mais uma parada - não sei como fixar o resultado positivo e substituí-lo na variável automaticamente.
 
Hoper23 писал(а) >>

yyyyy ..... "O link que o levou a esta página está 'morto' ou apagado". Boa referência!!! Um pouco parecido com a direção de ir se foder. (sem ofensa, apenas por diversão).

Aqui está um agradecimento), para mim pelo link, klot'y pela solução realmente pronta em um prato), aí você tem tanto o testador quanto o otimizador, basta ajustá-lo um pouco para atender às suas necessidades... E tudo se abre.

 

Resposta não aberta!!!


 
Hoper23 >> :

thecore==> pelo seu raciocínio, assim como pelo meu, você recebe por(S = Sstart; S <= Send; S += Sstep), bem, em termos gerais. Aqui está o que eu tenho

1. não tente resolver o problema de cabeça para baixo.

Por que você precisa salvar TODAS as variantes de todas as soluções possíveis.

Você não está resolvendo um problema de matemática. Você está olhando para a história para uma situação semelhante à que você tem

hoje e agora para decidir o que fazer.

Portanto, primeiro descreva a situação atual e procure especificamente por ela.

Isto reduzirá o número de passes, variáveis e resultados por um LOT.

Em seguida, pare - não sei como fixar um resultado positivo e colocá-lo em uma variável automaticamente.

Na primeira etapa, eu o salvei em um arquivo. Recebido sobre a história de cerca de 10.000-50.000 opções vencedoras.

Em seguida, analisado em Excel.

2. não procure uma correspondência exata. Não é como se estivéssemos descrevendo uma onda sinusoidal.

3. primeiro escreva um bloco de coleta de dados para UMA variável, depure-o e depois acrescente outras 18 ou quantas variáveis você tem.

 

Bom. A idéia é lógica. Então, como você resolve a fórmula para otimizar as combinações com um único parâmetro?? A questão é que, neste exemplo, eles estão inter-relacionados. Ainda não conheço outro exemplo devido ao meu conhecimento limitado da linguagem MQL.

Combination = MathFloor((L1End-L1Start)/L1Step)*MathFloor((L2End-L2Start)/L2Step);
 

Este absurdo é projetado para otimizar o off-line

extern int setWeek   = 0;          //День недели старта оптимизации
extern int setHour   = 02;         //Час старта оптимизации
extern int setMinute = 25;         //Минута старта оптимизации
extern int ProgNumber= 2;          //номер программы оптимизации
extern bool OptimStart=false;
extern bool report=false;
#include <MacroAutoOptimization.mqh> 


int init() {


 if(IsOptimization()){
    string Str;
    int Cmd, Step, HandleStep;    
    HandleStep=FileOpen("ExpertMessage.csv", FILE_CSV| FILE_READ| FILE_WRITE,0x7F);
    if( HandleStep>0){
       Str  = FileReadString( HandleStep);
       Cmd  = StrToInteger(StringSubstr( Str,0,StringFind( Str,";",0)));
       Step = StrToInteger(StringSubstr( Str,StringFind( Str,";",0)+1,StringLen( Str)-StringFind( Str,";",0)-1))+1;
       FileSeek( HandleStep,0, SEEK_SET);
       FileWrite( HandleStep, Cmd+";"+ Step);
       FileClose( HandleStep);
  }} 

  
   return(0);
  }


int deinit()
  {
   Comment("Привет!");
   return(0);
  }

int start()
{

 if(IsOptimization()==false && IsTesting()==false){
        double Itog[][17];
        int TecWeek=TimeDayOfWeek(TimeLocal());
        int TecHour=TimeHour(TimeLocal());
        int TecMinute=TimeMinute(TimeLocal());
        if(! OptimStart){  
           if( TecWeek== setWeek){  
              if( TecHour== setHour){ 
                 if( TecMinute>= setMinute && TecMinute< setMinute+4){ 
                    if( AutoStart( ProgNumber, Itog)<0){Print("Оптимизация завершилась неудачей!");}
                    deinitialization();
                    OptimStart=true;
                    report=true;
        }}}}
        if( TecHour!= setHour){ OptimStart=false;}              //Обнуление флага старта оптимизации
        if(ArrayRange( Itog,0)>0){
//         Переменные для оптимизации
           stK     = Itog[0][7];
           stP   = Itog[0][8];
           stD  = Itog[0][9];
           W = Itog[0][10];
           H  = Itog[0][11];
           C  = Itog[0][12];
           CCI  = Itog[0][13];
           F_EMA  = Itog[0][14];
           S_EMA  = Itog[0][15];
           SMA  = Itog[0][16];
           shirina  = Itog[0][17];
           S  = Itog[0][18];
           O  = Itog[0][19];
           I  = Itog[0][20];
           M  = Itog[0][21];
           G  = Itog[0][22];
           CC  = Itog[0][23];
           if( report){
              Print("Новые параметры ", stK," | ", stP," | ", stD," | ", W," | ", H," | ", C," | ", CCI," | ", F_EMA," | ", S_EMA," | ", SMA," | ", shirina," | ", S," | ", O," | ", I," | ", M," | ", G," | ", CC);
              report=false;
     }}}   

Ela vem com uma bíblia.

бла-бла-бла

E há uma bíblia para acompanhar.

бла-бла-бла

E NOTHING WORKS...ou melhor, mexe consigo mesmo, enfatiza a CPU, mas sem mudanças nas variáveis e faz tudo rapidamente - um par de segundos e pronto. Eu não entendo.
 
Hoper23 >> :

Este absurdo foi projetado para otimizar o off-line

Ela vem com uma bíblia.

E depois há a bíblia.

E não funciona... ou melhor, faz uma bagunça de si mesmo, enfatiza a CPU, mas não muda as variáveis e torna tudo rápido - um par de segundos e pronto. Eu não entendo.



Você começou a trabalhar com o auto-optimizador xeon's

TestCommander (auto-optimização) Ferramenta do Trader

Portanto, pergunte-lhe.

A propósito, este produto já está pago, se bem me lembro.

Há uma ajuda nisso, tudo é claramente explicado ali.

Razão: