¡Problemas encontrados durante las pruebas de espalda y no se puede encontrar la causa raíz! - página 5

 
jollydragon:

. Sigo sin ver la desaparición de los picos. ¿Cómo se puede "reiniciar"?

Se puede reiniciar cambiando los plazos

o

abriendo la ventana de entrada del indicador y haciendo clic en OK

 

GumRai2015.05.14 21:51#

You can re-initialise by either changing timeframes

or

Abrir la ventana de entrada del indicador y hacer clic en Aceptar.


Después de probar, entiendo que es el mismo significado que dije el cambio de ubicación de los picos. ¿Correcto?

EstimadoGumRai,

 
WHRoeder:

Para cada iteración, (excepto la primera,) Fish1 es el valor del elemento anterior del buffer, pero no lo inicializas a ExtBuffer1[límite ].

Así que para la iteración inicial (cuando el límite == barras) se establece ExtBuffer1[0] = 1,1*ExtBuffer1[1] .

Pero para los siguientes ticks (cuando límite == 1) estableces ExtBuffer1 [0] = 1.1*0.00001 .

Estimado WHRoeder,

Muchas gracias y veo el tema un poco mejor con tu dirección.

Sin embargo, puede que todavía necesite algunas preguntas más para aclarar más:

1. Se puede ver "double Fish1=0.00001; " se define en el principio y fuera de todas las funciones.

Así que debería ser una variable global y entiendo que se ha asignado con el último ExBuffer1[0] aunque venga un nuevo tick posterior.

¿O se recupera automáticamente a "0.00001" cada vez que llega un nuevo tick?

2. Ahora que cada barra se pinta de forma diferente con un solo tick o con muchos ticks posteriores, ¿por qué puedo ver el repintado de .., bar[8], ..., o bar[1], en un gráfico M1 en vivo sin ninguna interrupción?

3. ¿Por qué se cambian las ubicaciones de los picos después de ser refrescados?

4. ¿Por qué puedo ver algunos picos (alrededor de 959870576) formados mucho, mucho menos que"EMPTY_VALUE" (2147483647) en los gráficos M1 en vivo?

5. Si sale una nueva barra, el anterior ExtBuffer1[0] cambiará a ExtBuffer1[1] automáticamente. ¿Es correcto?

6. ¿Cómo se puede evitar una posible reinicialización o repintado?

¡Tal vez todavía estoy confundido en algunos puntos críticos y necesito su gran paciencia para ayudar! ¡Se agradece mucho si puedes ayudarme con las preguntas una por una!

 

EstimadoWHRoeder,GumRai,

He actualizado mi indicador como el código de abajo de acuerdo a mi comprensión después de leer sus mensajes de nuevo.

Después de usarlo para la prueba de espalda, el resultado es mucho más consistente con el indicador. Sin embargo, todavía hay 2 problemas. Por favor, consulte las capturas de pantalla a continuación.

1. El comercio tiene lugar después de 4 señales del indicador al principio de la primera orden.

2. Todavía hay un cambio de orden que ocurre 4 barras antes de la señal del indicador.

A continuación se muestra el código del indicador actualizado.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.50"
#property strict
#property  indicator_separate_window
#property  indicator_buffers 2

extern int    period=35;
extern double smooth=0.3;

datetime       lastAlertTime;
double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtValue[];
double         Value1=0,Buffer0_1=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(3);
   SetIndexBuffer(0,ExtBuffer0); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrWhiteSmoke);
   SetIndexBuffer(1,ExtBuffer1); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrGoldenrod);
   SetIndexBuffer(2,ExtValue);
   IndicatorShortName(" Solar Joy   ^v^  ");
   ArraySetAsSeries(ExtBuffer0,true);
   ArraySetAsSeries(ExtBuffer1,true);
   ArraySetAsSeries(ExtValue,true);

   SetIndexDrawBegin(1,period);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total<=period)    return(0);

   int    i,limit;
   double price,MinL,MaxH;

   if(prev_calculated<rates_total-1) limit=rates_total-period-1;
   else                              limit=1;

   for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price=(High[i]+Low[i])/2;
      if(limit==1)
        {
         Value1=ExtValue[1];
         Buffer0_1=ExtBuffer0[1];
        }
      ExtValue[i]=(1-smooth)*(2*(price-MinL)/(MaxH-MinL)-1.0) + smooth*Value1;
      ExtValue[i]=MathMin(MathMax(ExtValue[i],-0.999),0.999); // Value=Value>0.999?0.999:Value<-0.999?-0.999:Value;
      ExtBuffer0[i]=(1-smooth)*MathLog((1+ExtValue[i])/(1-ExtValue[i]))+smooth*Buffer0_1;
      Value1=ExtValue[i];
      Buffer0_1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=3;
      else ExtBuffer1[i]=-3;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

 
jollydragon:

1. Puedes ver que "double Fish1=0.00001; " está definido al principio y fuera de todas las funciones.

Así que debería ser una variable global y entiendo que se ha asignado con el último ExBuffer1[0] aunque venga un nuevo tick posterior.

¿O se recupera automáticamente a "0.00001" cada vez que llega un nuevo tick?

No y no. ¿Qué parte de "pero no lo inicializas a ExtBuffer1[limit]" no quedó clara?
if(prev_calculated<rates_total-1){ limit=rates_total-period-1; Fish1=0.00001;       }
else                             { limit=1;                    Fish1=ExtBuffer0[1]; }
for(i=limit-1; i>=0; i--)
  {
   ExtBuffer1[i]=1.1*Fish1;
   Fish1=ExtBuffer1[i];
   if(Fish1>=EMPTY_VALUE)
      Fish1=1;
  }

Personalmente, creo que los argumentos rates_total/prev_calculated/OnCalculate son una abominación ya que los gráficos/buffers son series de tiempo, y lo haría de la manera antigua:
int counted = IndicatorCounted();
limit = Bars - MathMax(counted, period-1); // Lookback period-1
Fish1 = counted == 0 ? 0.00001 : ExtBuffer0[limit];
for(i=limit-1; i>=0; i--)