[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 366

 
lottamer:


não há carrapatos.

talvez a falta de normalização dentro da EA dê este efeito.

Entretanto, quando a guia de parâmetros de entrada aparece, a otimização em si não acontece.

O testador faz algo, na parte inferior você pode ver o número atual de excessos (7/62), mas ao completar os resultados de otimização nas abas, e o gráfico de otimização é Vazio!

A marca de verificação no parâmetro é, naturalmente, ....

Eu nem sei para que lado olhar...


O testador não fornece resultados repetíveis com dados inalterados, uma vez que a propagação muda inconscientemente quando testado.

Cura:https://www.mql5.com/ru/forum/119830

 
Chiripaha:

Valores vazios podem indicar que o resultado da otimização de parâmetros específicos não é rentável - ou seja, um dreno. Tente executar um dos parâmetros com a Visualização e você poderá ver este resultado.

Sobre a normalização, também não creio que haverá tal efeito, pois como os valores são os mesmos, os números matemáticos serão exatamente os mesmos - daí nenhuma mudança.

Quanto a "que maneira de pensar" - às vezes é melhor não pensar e adiar a pergunta - a idéia e os pensamentos virão mais tarde. Você tem que dar ao seu cérebro espaço de manobra, descanso e pensamento sem esforço.


1. o assessor é lucrativo.

2. eu já verifiquei à mão - é rentável em toda a faixa do parâmetro. Eu só queria ampliar um pouco a faixa e tornar o passo menor.

 
tara:


O testador não fornece resultados repetíveis com dados inalterados, porque a propagação muda sem que se saiba durante os testes.

A cura:https://www.mql5.com/ru/forum/119830



O spread está flutuando, não está?

outra coisa é que tem que ser cimentada na história...

em geral o resultado flutua ligeiramente e o número de negócios não muda...então esta questão não me assusta muito...

A outra coisa é que o otimizador não funciona de jeito nenhum! Isto é irritante...

isto é o que o testador diz no diário de bordo:



2013.05.29 12:20:10 Houve 8 passes feitos durante a otimização, 8 resultados foram descartados como insignificantes

 
tara:


O testador não fornece resultados repetíveis com dados inalterados porque a propagação muda sem conhecimento durante os testes.

A cura:https://www.mql5.com/ru/forum/119830

Talvez seja possível, mas meu tamanho de propagação é colocado em Info - e quando você o muda, ele aparece. No testador, não notei a propagação flutuante. Ele toma os dados dos parâmetros padrão do MarketInfo da conta corrente e não os altera mais.

Esta cura altera a propagação p-r para que você possa ver diferentes resultados de otimização com diferentes propagações. Pelo que entendi, este é o único propósito para o qual o software no link é necessário.

 
lottamer:


2013.05.29 12:20:10 Houve 8 passes feitos durante a otimização, 8 resultados foram descartados como insignificantes

Bem, é verdade - estes resultados foram descartados como insignificantes. - É por isso que não aparece nos resultados ou no gráfico.
 
Chiripaha:
Isso mesmo - estes resultados foram marcados como insignificantes. - É por isso que não aparece nos resultados ou no gráfico.



Acho que tenho aqui um problema mais profundo.

Minha primeira pergunta ontem foi como otimizar os parâmetros dentro de uma função do usuário.

Disseram-me: Mova-os para o duplo exterior

Eu fiz isso.

e agora o otimizador joga fora o resultado... eu devo tê-los movido incorretamente.

Aqui está o código. É um modificador comum de stop and take

Em vez de STOP e TAKE, existiam os números 100 e 200

Eu alterei os números para STOP e TAKE

e no início do código eu acrescentei

duplo STOPexterno= 100;
duplo TAKEexterno= 200;

Há algum erro aqui em algum lugar?

(o modificador em si funciona 100%)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

Estou olhando para o código por enquanto, mas vou permitir alguns comentários ao longo do caminho.

Esta linha não faz sentido algum:

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

Só será necessário se você tiver uma estratégia de múltiplas moedas, mas então, ao invés de uma estratégia de múltiplas moedas, você tem que usar

Symbol()

Você precisará usar outros valores pré-definidos, mas não esta função normal.

Esta variável também é desnecessária.

total=OrdersTotal();

Porque dentro de sua função é aplicado apenas uma vez, em enumeração, o que é comentado por alguma razão, e só desorganiza o código. - Daí a pergunta - Por que o senhor comentou a enumeração por ordem?

Isto:

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

melhor agrupados em geral - a condição é a mesma. A propósito, você os escreveu de maneira diferente por estrutura. - é a questão da perda de estrutura. O estilo de escrita deve ser uniforme - então você pode ver a estrutura e possíveis erros sairão como solavancos após a queda de neve.

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

Pelo que você apresentou, não encontrei nenhum ponto de princípio que possa afetar o resultado. Mas... Você apresentou apenas uma função aqui (escrita de forma um tanto descuidada, a menos que você conte a enumeração comentada - isto se reflete na pergunta). Para dizer o veredicto - você não precisa da função, você precisa do código do programa, porque não sabe onde e onde está a causa e você precisa procurá-la. Para fazer isso, você deve executar o programa no testador e ver com seus próprios olhos os erros que podem ocorrer. Em seguida, já passe pelo código (ou em ordem inversa) e procure a causa.

Como um sentimento geral, posso dizer que você, Oleg, tem algumas desleixadas (indiferença, eu diria). Isto pode levar a 1. Para a reciclagem do sistema em uso. 2. Perda de estrutura em conseqüência desta sujeira e dificuldade na identificação e detecção do bug. Portanto, meu conselho é o seguinte. - Se possível, jogue fora todo o "lixo" (excessos) do código - o erro será mais fácil de encontrar. - Este é um erro clássico da maioria das pessoas que pedem ajuda - descuido.

 
lottamer:


Provavelmente é mais profundo que isso.

Minha primeira pergunta de ontem foi como otimizar os parâmetros dentro de uma função personalizada.

Disseram-me: coloque-os em duplo externo.

Eu fiz isso.

E agora o otimizador joga o resultado... aparentemente, eu os tirei de alguma forma errados.

Não, eu acho que você está errado. O testador lança o resultado não por causa dos parâmetros que colocamos para fora, mas porque os resultados não passam o critério de significância.

Mas é possível que o próprio programa possa conter um erro. Além disso, os resultados instáveis são uma indicação indireta disso. - Isso significa que algo está errado. Em minha prática, não permito que tais programas cheguem ao mundo real. Porque se algo está errado, isso significa que a situação é incontrolável. E tudo pode sair.

Os parâmetros Stop-Loss e Take-Profit, por definição, estão em variáveis externas em qualquer programa, e não apenas porque precisam ser otimizados. Não é como se você fosse entrar em seu código toda vez que quiser mudá-los. Portanto, não importa se são variáveis externas ou internas. - Isso é certo.

 
Chiripaha:

Estou olhando para o código por enquanto, mas vou permitir alguns comentários ao longo do caminho.

Esta linha não faz sentido algum:

Você só precisará dela se tiver uma estratégia de múltiplas moedas, mas então, em vez de

Você precisará substituir outros valores pré-definidos, mas não esta função básica.

Esta variável também é desnecessária.

É usado apenas uma vez dentro da função na enumeração, que é comentada por alguma razão e só desorganiza o código. - Daí a pergunta - Por que você comentou a enumeração por pedidos?

Aqui está.

Em geral, seria melhor agrupá-los - a condição é a mesma.

Bem, não encontrei nenhum ponto de princípio do que você apresentou que possa afetar o resultado. Mas!... Você apresentou apenas uma função aqui (escrita de forma um tanto descuidada, a menos que você conte a enumeração comentada - isto se reflete na pergunta). Para dizer o veredicto - você não precisa da função, você precisa do código do programa, porque não sabe onde e onde está a causa e você precisa procurá-la. Para fazer isso, você deve executar o programa no testador e ver com seus próprios olhos os erros que podem ocorrer. Em seguida, já passe pelo código (ou em ordem inversa) e procure por esta causa.

Como sentimento geral posso dizer que você, Oleg, tem bastante descuido (indiferença, diria eu). Isto pode levar a 1. Para o lixo do sistema em uso. 2. Perda de estrutura em conseqüência desta sujeira e dificuldade na identificação e detecção do bug. Portanto, meu conselho é o seguinte. - Se possível, jogue fora todo o "lixo" (desnecessário) do código - o erro será mais fácil de encontrar. - Este é um erro clássico da maioria das pessoas que pedem ajuda - descuido.


Eu não escrevi este modificador.

Eu o preparei nas bibliotecas.

O principal é que está funcionando a 100%.

Mas porque o parâmetro dentro dele não está otimizado - essa é a questão.....

Não há erros básicos!

O resto do código funciona.

Colocar qualquer condição no algoritmo.

- compre

-modificar

- fechar

---------------------------

e tentar otimizar o parâmetro dentro do meu pedido MODIFICADOR - ou seja, parar e tomar

 
Chiripaha:

Não, eu acho que você está errado. O testador não é expulso por causa dos parâmetros que você coloca, mas porque os resultados não passam o critério de significância.

Mas é possível que o próprio software contenha um erro. Além disso, os resultados instáveis são uma indicação indireta disso. - Isso significa que algo está errado. Em minha prática, não permito que tais programas cheguem ao mundo real. Porque se algo está errado, isso significa que a situação é incontrolável. E tudo pode sair.

Os parâmetros Stop-Loss e Take-Profit, por definição, estão em variáveis externas em qualquer programa, e não apenas porque precisam ser otimizados. Não é como se você fosse entrar no código toda vez que quiser mudá-los. Portanto, não importa se as variáveis são externas ou internas. - Isso é certo.

Bem, veja,

Se eu devolver tudo de volta agora, ou seja, remover parâmetros externos STOP e TAKE e escrever números dentro da função em vez deles, então a EA tem sido executada semana após semana por 10 semanas e mostra resultados claros.

Se eu alterar manualmente os parâmetros de parada e decolagem, tudo funcionará e dará resultados ligeiramente diferentes (é claro)

Mas agora por que, quando eu desligo estes parâmetros para fora do modificador - o otimizador os considera insignificantes?