Indicador Perguntas Diversas - página 15

 

OnCalculate

A função OnCalculate() é chamada apenas em indicadores personalizados quando é necessário calcular os valores dos indicadores pelo evento Calculate .

Isto geralmente acontece quando um novo tick é recebido para o símbolo, para o qual o indicador é calculado.

Este indicador não precisa ser anexado a nenhuma tabela de preços deste símbolo.

A função OnCalculate() deve ter um tipo de retorno int. Há duas definições possíveis. Dentro de um indicador não é possível usar as duas versões da função.

A primeira forma é destinada aos indicadores que podem ser calculados em um único buffer de dados. Um exemplo de tal indicador é a Média Móvel Personalizada.

intOnCalculate(constint taxas_total,// tamanho da matriz de preços[]
constint prev_calculado,// barras tratadas em uma chamada anterior
constint começar,// onde os dados significativos começam de
constdobro& preço[]// matriz para calcular
);

 
Marco vd Heijden:

OnCalculate

A função OnCalculate() é chamada apenas em indicadores personalizados quando é necessário calcular os valores dos indicadores pelo evento Calculate .

Isto geralmente acontece quando um novo tick é recebido para o símbolo, para o qual o indicador é calculado.

Este indicador não precisa ser anexado a nenhuma tabela de preços deste símbolo.

A função OnCalculate() deve ter um tipo de retorno int. Há duas definições possíveis. Dentro de um indicador não é possível usar as duas versões da função.

A primeira forma é destinada aos indicadores que podem ser calculados em um único buffer de dados. Um exemplo de tal indicador é a Média Móvel Personalizada.

intOnCalculate(constint taxas_total,// tamanho da matriz de preços[]
constint prev_calculado,// barras tratadas em uma chamada anterior
constint começar,// onde os dados significativos começam de
constdobro& preço[]// matriz para calcular
);

Perfeito, Sr. Marco, muito mais obrigado.
 

( Eu uso a palavra "Lag" que significa atraso na ação do preço, ordem aberta, fechada, apenas uma palavra derruba minha plataforma MT4 )

Eu uso a função abaixo para meu 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[]){...}

Quando escrevo abaixo o código de retorno ao meu indicador personalizado, então meu indicador personalizado começa a atrasar. Mas funciona corretamente, qual deles eu quero.

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

E quando escrevo abaixo o código de retorno ao meu indicador personalizado, então meu indicador personalizado não funciona corretamente, qual eu quero. Quero dizer, enquanto a falsa cruz MA " Seta " não volta para o ponto de cruzamento MA anterior.

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

P: O que posso fazer para esta situação, por favor?

Agradecemos antecipadamente.

 
Max Enrik: E quando escrevo abaixo o código de retorno ao meu indicador personalizado, então meu indicador personalizado não funciona corretamente qual deles eu quero. Quero dizer, enquanto a falsa cruz MA " Seta " não volta ao ponto de cruzamento MA anterior.
Afixe todo o seu código. Isso não tem sentido sem contexto.
 
whroeder1:
Afixe todo o seu código. Isso não tem sentido sem contexto.

Aqui está.

Obrigado de antemão.

Gráfico de Exemplo de Indicador 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: Isto é, enquanto a falsa cruz MA " Seta " não volta ao ponto de cruzamento MA anterior.
Você não testa para isso e a move de volta.
 
whroeder1:
Não se testa para isso e se volta atrás.

OK! Obrigado!
 

Eu ainda preciso de uma resposta mais clara.

Obrigado de antemão.

 

A resposta é:Verifique tanto a Cruz MA atual quanto a Cruz MA anterior .

#Buffer (array out of range in ) - Fechado
#Custom Indicator Lagging - Fechado

 

#Primeiro resultado do Loop - Aberto

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

Obrigado de antemão.

Razão: