Milagros con el probador. - página 2

 
Probado de diferentes maneras - y
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. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

Archivos adjuntos:
MQL5.zip  269 kb
 
1CMaster:
¿Existe un enlace para el uso correcto de iCustom() teniendo en cuenta estos matices? Porque estoy cansado de comprobarlo y buscar lo que está mal.

Echa un vistazo al artículo Indicador por indicador en MQL5:

¿Es necesario inicializar los buffers de los indicadores?

Los arrays en MQL5 no se inicializan por defecto con ningún valor, y esto ciertamente se aplica a los arrays que se asignan a los buffers de indicadores usando SetIndexBuffer(). Si un array es un buffer indicador, su tamaño dependerá del parámetro rates_total en el manejador OnCalculate().

Puede existir la tentación de inicializar todos los búferes de los indicadores con el valor EMPTY_VALUE vacío utilizando la función ArrayInitialize(), por ejemplo, una vez al principio de OnCalculate().

...

 

Estimado Rosh - Leí este artículo, pero no pude aplicarlo, porque uso la segunda forma de llamada OnCalculate, porque necesito el tiempo de cada barra, no sólo el precio.

La razón realmente es que hay basura en el búfer del indicador. Y la inicialización del buffer con valores vacíos no da nada, porque en el probador, cuando aparecen nuevos datos, el buffer del indicador se incrementa automáticamente e inicialmente contiene realmente basura, y si el buffer no se llena en cada barra del indicador, la basura se queda ahí.

Mi EA se ejecuta en el temporizador - es mucho más rápido que OnTick() por alguna razón. Y puedo probarlo el fin de semana.

Estoy tratando de averiguar lo que se encuentra en cada búfer indicador. La complejidad radica en que un indicador llama a otro en función de sus valores.

Intentaré seleccionar un periodo claro y establecer el tamaño de los buffers. Determinaré la causa de los falsos positivos en el probador. Es una pena que el probador no tenga un depurador, todo el mundo lo estaba esperando.

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

Tengo un EA que se ejecuta en un temporizador, que es mucho más rápido que OnTick() por alguna razón. También puedes probarlo los fines de semana.

Hay un artículo probador básico en MetaTrader 5 donde se muestra:

Hemos medido el tiempo de prueba con diferentes valores del parámetro del temporizador (el período de eventos del temporizador). En los datos obtenidos se ha trazado un gráfico que muestra la dependencia del tiempo de ensayo T con el valor de la periodicidad.


Está claro que cuanto menor sea el parámetro del temporizador en la inicialización del mismo mediante la función EventSetTimer(timer), menor será el periodo entre las llamadas al manejador OnTimer() y mayor será el tiempo de prueba T en las mismas condiciones.
 
1CMaster:

Si aparece una verdadera basura en iCustom(), el problema está definitivamente en la inicialización.

Inicializa el buffer con cero en lugar de Empty_Value. Cuando aparezca cada nueva barra, no olvides poner a cero la celda del buffer correspondiente.

 
MoneyJinn:

Si aparece una verdadera basura en iCustom(), el problema está definitivamente en la inicialización.

Inicialice el buffer con cero en lugar de Empty_Value. Cuando aparezca cada nueva barra, no olvide poner a cero la celda del buffer correspondiente.

Sí, lo hice. En cada indicador me aseguro de poner a cero los valores primero - ayudó a deshacerse de la basura.

for(i=primero;i<total_de_tasas-1 && !IsStopped();i++)

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

Buffer de salida[i]=0;

....

}

Ahora lo estoy probando en el gráfico de minutos. En el gráfico horario todo funciona como un reloj)))) Tengo algunas preguntas sobre el EA en el gráfico de 1 minuto.

 

Como era de esperar, no se ha inicializado. En el indicador FB.

En primer lugar, al principio de la función OnCalculate debemos añadir la inicialización de los arrays

   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 la inicialización que tiene, no siempre funciona

En segundo lugar, en el ciclo de cálculo principal, al principio del ciclo, añadir la inicialización de los elementos cero de las matrices (ya que cuando se añade una nueva barra al gráfico, las matrices de indicadores se incrementan automáticamente, y estos nuevos elementos no se inicializan de ninguna manera, ni explícitamente porque prev_calculado>0, ni implícitamente)

//---- основной цикл расчета
   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]) {

Además, en CustomOptimisation.mqh en la clase TBalanceSlopeCriterion hay que añadir un destructor (no afecta al resultado, pero provoca fugas de memoria durante las pruebas)

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
Gracias a todos. Haré más pruebas.
 

Yo también tuve un milagro con el probador.

Pruebo un EA con un nombre: el probador dibuja objetos

...he guardado y compilado el EA con otro nombre::sin objetos

Pero me he dado cuenta de que he movido el terminal a otra unidad

 
Los resultados de la optimización y del pase único no coinciden (service-desk - #329165 + EA there)