Milagres com o provador. - página 2

 
Tentou de formas diferentes - e
ArrayInitialize
и
Циклом 
// ===Если это первый запуск обнулим все буферы:)
if(prev_calculated <= 0)// проверка на первый старт расчёта индикатора
{
for(int i=0;i<=rates_total-1;i++)
{
eeee[i]=EMPTY_VALUE;
}
//Print("!!!Обнулили все буферные массивы!!!");
}

Запускаю первый тест - выдает фигню, второй раз - еще фигню, с третьего раза начинает выдавать правдивый результат уже постоянно.
Не могу понять в чем дело.

Тестировал сегодня с 13.02.12 - 25.02.12 - всего один сигнал на продажу и один сигнал на закрытие продажи.
Как и говорил - с третьего раза начинает постоянно выдавать уже правдивый результат - а до этого ерунду выдает.
А теперь представьте, что вы запускаете оптимизацию - я же не могу по три раза оптимизацию запускать, - короче я не знаю что делать.
Могу конечно код индюка вставить в советник - но вызывать его удобнее из другого индюка.
Кто еще что скажет.

Выкладываю исходники - они уже настроены. 
Запустите тест на ЕвроБакс с 13.02.12 - 25.02.12 - правильный результат -35.20. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

Arquivos anexados:
MQL5.zip  269 kb
 
1CMaster:
Existe alguma ligação para a utilização correcta do iCustom() tendo em conta estas nuances ??? Porque estou cansado de o verificar e de procurar o que está errado.

Dê uma vista de olhos ao artigo Indicador por Indicador na MQL5:

É necessário inicializar os amortecedores indicadores?

As matrizes em MQL5 não são inicializadas por defeito com qualquer valor, e isto aplica-se certamente às matrizes que são atribuídas a buffers indicadores usando SetIndexBuffer(). Se um array for um tampão indicador, o seu tamanho dependerá do parâmetro rate_total no manipulador OnCalculate().

Pode haver uma tentação de inicializar todos os amortecedores indicadores com o valor EMPTY_VALUE vazio usando a função ArrayInitialize(), por exemplo, uma vez no início de OnCalculate().

...

 

Caro Rosh - Li este artigo, mas não o pude aplicar, porque uso a segunda forma de chamada OnCalculate, porque preciso do tempo de cada bar, e não apenas do preço.

A razão realmente é que há lixo no tampão indicador. E a inicialização do buffer com valores vazios não dá nada, porque no testador, quando aparecem novos dados, o buffer indicador cresce automaticamente e no início contém realmente lixo, e se o buffer não for preenchido em cada barra, o lixo fica lá.

O meu EA funciona com temporizador - é muito mais rápido do que o OnTick() por alguma razão. E posso testá-lo ao fim-de-semana.

Estou a tentar descobrir o que se encontra em cada tampão indicador. A complexidade é que um indicador chama outro com base nos seus valores.

Vou tentar seleccionar um período claro e definir o tamanho dos amortecedores. Determinarei a causa dos falsos positivos no testador. Eh - é uma pena que o testador não tenha um depurador - toda a gente tem estado à espera dele.

Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
1CMaster:

Tenho um EA a funcionar com um temporizador, que é muito mais rápido do que OnTick() por alguma razão. Pode testá-lo também aos fins-de-semana.

Existe um artigo básico de ensaio no MetaTrader 5 onde é mostrado:

Medimos o tempo de teste a diferentes valores do parâmetro temporizador (o período do evento temporizador). Um gráfico mostrando a dependência do tempo de teste T do valor da Periodicidade foi traçado com base nos dados obtidos.


É evidente que o parâmetro menor do temporizador na inicialização da função EventSetTimer(temporizador), o menor período (Período) entre as chamadas do manipulador OnTimer() e o maior tempo de teste T sob as mesmas e as mesmas condições.
 
1CMaster:

Se o verdadeiro lixo aparece no iCustom(), o problema está definitivamente na inicialização.

Inicializar o buffer com zero em vez de Vazio_Valor. Quando cada nova barra aparecer, não se esqueça de zerar a célula tampão correspondente.

 
MoneyJinn:

Se o verdadeiro lixo aparece no iCustom(), o problema está definitivamente na inicialização.

Inicializar o buffer com zero em vez de Empty_Value. Quando cada nova barra aparecer, não se esqueça de zerar a célula tampão correspondente.

Sim, eu fiz. Em todos os indicadores certifico-me de zerar primeiro os valores - ajudou a livrar-me do lixo.

for(i=first;i<rates_total-1 && !IsStopped();i++)

{
EnterBuffer[i]=0;
EditBuffer[i]=0;

ExitBuffer[i]=0;

....

}

Agora estou a testá-lo na tabela de minutos. No gráfico horário tudo está a funcionar como um relógio)))) Tenho algumas perguntas sobre a EA no gráfico de 1 minuto.

 

Como esperado - sem inicialização. No indicador FB.

Em primeiro lugar, no início da função OnCalculate, devemos acrescentar a inicialização das matrizes

   if(prev_calculated==0)
     {
      ArrayInitialize(SignalBuyBuffer,0);
      ArrayInitialize(SignalSellBuffer,0);
      ArrayInitialize(HighBuffer,0);
      ArrayInitialize(LowBuffer,0);
      ArrayInitialize(OpenBuffer,0);
      ArrayInitialize(CloseBuffer,0);
      ArrayInitialize(ColorBuffer,0);
      ArrayInitialize(TrendBuffer,0);
     }

Porque a inicialização que tem, nem sempre funciona

Em segundo lugar, no ciclo principal de cálculo, logo no início do ciclo, adicionar inicialização dos elementos zero das matrizes (pois quando uma nova barra é adicionada ao gráfico, as matrizes indicadoras são automaticamente aumentadas, e estes novos elementos não são inicializados de forma alguma, nem explicitamente porque pré_calculados>0, nem implicitamente)

//---- основной цикл расчета
   for(i=first; i<rates_total && !IsStopped(); i++)
     {     
       SignalBuyBuffer[i]=0;
        SignalSellBuffer[i]=0;
        HighBuffer[i]=0;
        LowBuffer[i]=0;
        OpenBuffer[i]=0;
        CloseBuffer[i]=0;
        ColorBuffer[i]=0;
        TrendBuffer[i]=0;

        if(i == 88366 )
        {
         Print(""+DoubleToString(maxHigh,5)+": "+DoubleToString(minLow,5));
        }

        maxHigh=high[iHighest(high,period,i-1)];
        minLow=low[iLowest(low,period,i-1)];        
        if(open[i-1] > close[i-1]) {

Além disso, em CustomOptimisation.mqh na classe TBalanceSlopeCriterion deve ser adicionado um destruidor (não afecta o resultado, mas leva a fugas de memória durante os testes)

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
Obrigado a todos vós. Irei continuar a testar.
 

Também tive um milagre com o testador.

EA testada com um nome: o testador desenha objectos

...salvei e compilei a EA com outro nome::sem objectos

Mas reparei que mudei o terminal para outra unidade

 
Os resultados da optimização e do passe único não coincidem (service-desk - #329165 + EA ali)