Indicador Preguntas varias - página 15

 

OnCalculate

La función OnCalculate() es llamada sólo en los indicadores personalizados cuando es necesario calcular los valores del indicador por el evento Calculate .

Esto suele ocurrir cuando se recibe un nuevo tick para el símbolo, para el que se calcula el indicador.

No es necesario que este indicador esté unido a ningún gráfico de precios de este símbolo.

La función OnCalculate() debe tener un tipo de retorno int. Hay dos definiciones posibles. Dentro de un indicador no se pueden utilizar ambas versiones de la función.

La primera forma está pensada para aquellos indicadores que pueden ser calculados en un solo buffer de datos. Un ejemplo de este tipo de indicador es la Media Móvil Personalizada.

intOnCalculate(constint rates_total,// tamaño de la matriz price[]
constint prev_calculado,// barras manejadas en una llamada anterior
constint begin,// dónde empiezan los datos significativos
constdouble& price[]// matriz para calcular
);

 
Marco vd Heijden:

OnCalculate

La función OnCalculate() es llamada sólo en los indicadores personalizados cuando es necesario calcular los valores del indicador por el evento Calculate .

Esto suele ocurrir cuando se recibe un nuevo tick para el símbolo, para el que se calcula el indicador.

No es necesario que este indicador esté unido a ningún gráfico de precios de este símbolo.

La función OnCalculate() debe tener un tipo de retorno int. Hay dos definiciones posibles. Dentro de un indicador no se pueden utilizar ambas versiones de la función.

La primera forma está pensada para aquellos indicadores que pueden ser calculados en un solo buffer de datos. Un ejemplo de este tipo de indicador es la Media Móvil Personalizada.

intOnCalculate(constint rates_total,// tamaño de la matriz price[]
constint prev_calculado,// barras manejadas en una llamada anterior
constint begin,// dónde empiezan los datos significativos
constdouble& price[]// matriz para calcular
);

Perfecto, Sr. Marco, muchas gracias más.
 

( Utilizo la palabra "Lag" significa que retrasa la acción del precio, la orden de apertura, el cierre, sólo una palabra hace caer mi plataforma MT4 )

Utilizo la siguiente función para mi indicador personalizado.

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[]){...}

Cuando escribo abajo código de retorno a mi indicador personalizado entonces mi indicador personalizado comienza a lag. Pero funciona correctamente, lo que quiero.

return(0); // starts to lag...

Y cuando escribo por debajo de código de retorno a mi indicador personalizado entonces mi indicador personalizado no funciona correctamente lo que quiero. Me refiero a que mientras el falso cruce de MA "Flecha" no vuelve al punto de cruce de MA anterior.

return rates_total-1; // does not go back to previous MA cross point
return(rates_total-1); // and same thing here

P:¿Qué puedo hacer para esta situación, por favor?

Gracias de antemano.

 
Max Enrik: Y cuando escribo por debajo de código de retorno a mi indicador personalizado entonces mi indicador personalizado no funciona correctamente que quiero. Me refiero a que mientras el falso cruce de MA "Flecha" no vuelve al punto de cruce de MA anterior.
Publica todo tu código. Esto no tiene sentido sin el contexto.
 
whroeder1:
Publica todo tu código. Eso no tiene sentido sin contexto.

Aquí tienes.

Gracias de antemano.

Indicador Ejemplo Gráfico 06

#property strict
#property indicator_chart_window
#property indicator_buffers 2

string arrowIcon="delete arrow icon";

int i;
double arrowLow,arrowHigh,priceOne,priceTwo,priceOne_pre,priceTwo_pre,bufferOne[],bufferTwo[];
color clrup=clrBlue,clrdown=clrRed;
datetime arrowTime;
//---------------------------------------------------------
// OnDeinit
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"delete");
   return;
  }
// OnInit
int OnInit()
  {
   IndicatorDigits(Digits);
// line
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrdown);
   SetIndexBuffer(0,bufferOne);

   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrup);
   SetIndexBuffer(1,bufferTwo);
//---
   return(0);
  }
// OnCalculate
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[])
  {
//---
   int lookback=30; // I do not know what could I write here.
   for(i=Bars-1-MathMax(lookback,prev_calculated); i>=0; --i)
     {
      bufferOne[i]=iMA(Symbol(),0,lookback/2,0,MODE_EMA,PRICE_CLOSE,i);
      bufferTwo[i]=iMA(Symbol(),0,lookback,0,MODE_EMA,PRICE_CLOSE,i);

      priceOne = bufferOne[i];
      priceTwo = bufferTwo[i];
      priceOne_pre = bufferOne[i+5];
      priceTwo_pre = bufferTwo[i+5];

      // buy
      if(priceOne>priceTwo && priceOne_pre<=priceTwo_pre)
        {
         arrowTime=Time[i];
         //arrowLow  = iLow( Symbol(), 0, i );
         arrowLow=Low[i];

         objArrow();
         if(ObjectFind(0,arrowIcon)>=0)
           {
            ObjectMove(0,arrowIcon,0,arrowTime,arrowLow-5*Point);
            ObjectSetInteger(0,arrowIcon,OBJPROP_COLOR,clrup);
            ObjectSetInteger(0,arrowIcon,OBJPROP_ANCHOR,ANCHOR_TOP);
           }
        }
      // sell
      if(bufferOne[i]<bufferTwo[i] && priceOne_pre>=priceTwo_pre)
        {
         arrowTime = Time[i];
         arrowHigh = High[i];

         objArrow();
         if(ObjectFind(0,arrowIcon)>=0)
           {
            ObjectMove(0,arrowIcon,0,arrowTime,arrowHigh+5*Point);
            ObjectSetInteger(0,arrowIcon,OBJPROP_COLOR,clrdown);
            ObjectSetInteger(0,arrowIcon,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
           }
        }
     }
   Print("Time: ",arrowTime,"  Low: ",arrowLow);
//    Print( "priceOne ", DoubleToString( priceOne, Digits ), "  priceTwo ", DoubleToString( priceTwo, Digits ) );
//---
//return(0); // works correct but cause lags
   return(rates_total - 1); // no lags but does not go to previous ma cross after fake ma cross
  }
// objects
void objArrow()
  {
   if(ObjectFind(0,arrowIcon)<0)
     {
      ObjectCreate(0,arrowIcon,OBJ_ARROW,0,arrowTime,arrowLow);
      ObjectSetInteger(0,arrowIcon,OBJPROP_ARROWCODE,159);
      ObjectSetInteger(0,arrowIcon,OBJPROP_WIDTH,2);
     }
//---
   return;
  }
//+------------------------------------------------------------------+
 
Max Enrik: Me refiero a que mientras la falsa MA cruza la "Flecha" no vuelve al punto de cruce de la MA anterior.
No se prueba para eso y se mueve hacia atrás.
 
whroeder1:
No se hace una prueba para eso y se retrocede.

¡BIEN! ¡Gracias!
 

Todavía necesito una respuesta más clara.

Gracias de antemano.

 

La respuesta es:Comprobar tanto el cruce de la MA actual como el cruce de la MA anterior .

#Buffer(array out of range in ) - Cerrado
#Indicador personalizado retrasado - Cerrado

 

#Primer resultado del bucle - Abierto

string counts;
void _a()
{
    counts += "a - " + IntegerToString( ObjectsTotal( OBJ_ARROW ) );
    //---
    return;
}
void _b()
{
    counts += " - b - " + IntegerToString( ObjectsTotal( OBJ_ARROW ) );
    //---
    return;
}
Print( counts );
// while 1st loop: a - 2 - b - 4
// while 2nd loop: a - 2 - b - 4a - 2 - b - 4
// while 3rd loop: a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4
// and so on...
// But I like only 1st loop results even that loop runs 10 thousand times

Gracias de antemano.