Indicatore Domande varie - pagina 15

 

OnCalculate

La funzione OnCalculate() viene chiamata solo negli indicatori personalizzati quando è necessario calcolare i valori dell'indicatore tramite l'evento Calculate .

Questo di solito accade quando si riceve un nuovo tick per il simbolo per il quale l'indicatore è calcolato.

Questo indicatore non deve essere collegato a nessun grafico di prezzo di questo simbolo.

La funzione OnCalculate() deve avere un ritorno di tipo int. Ci sono due possibili definizioni. All'interno di un indicatore non è possibile utilizzare entrambe le versioni della funzione.

La prima forma è destinata a quegli indicatori che possono essere calcolati su un unico buffer di dati. Un esempio di tale indicatore è la media mobile personalizzata.

intOnCalculate(constint rates_total,// dimensione dell'array price[]
constint prev_calculate,// barre gestite in una chiamata precedente
constint begin,// da dove iniziano i dati significativi
constdouble& price[]// array da calcolare
);

 
Marco vd Heijden:

OnCalculate

La funzione OnCalculate() viene chiamata solo negli indicatori personalizzati quando è necessario calcolare i valori dell'indicatore tramite l'evento Calculate .

Questo di solito accade quando si riceve un nuovo tick per il simbolo per il quale l'indicatore è calcolato.

Questo indicatore non deve essere collegato a nessun grafico di prezzo di questo simbolo.

La funzione OnCalculate() deve avere un ritorno di tipo int. Ci sono due possibili definizioni. All'interno di un indicatore non è possibile utilizzare entrambe le versioni della funzione.

La prima forma è destinata a quegli indicatori che possono essere calcolati su un unico buffer di dati. Un esempio di tale indicatore è la media mobile personalizzata.

intOnCalculate(constint rates_total,// dimensione dell'array price[]
constint prev_calculate,// barre gestite in una chiamata precedente
constint begin,// da dove iniziano i dati significativi
constdouble& price[]// array da calcolare
);

Perfetto, signor Marco, grazie ancora.
 

(Uso la parola "Lag" che significa ritardi nell'azione dei prezzi, apertura e chiusura degli ordini, una sola parola che mette fuori uso la mia piattaforma MT4)

Uso la seguente funzione per il mio indicatore personalizzato.

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 scrivo sotto il codice di ritorno al mio indicatore personalizzato, allora il mio indicatore personalizzato inizia a ritardare. Ma funziona correttamente, cosa che voglio.

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

E quando scrivo sotto il codice di ritorno al mio indicatore personalizzato, allora il mio indicatore personalizzato non funziona correttamente, come voglio io. Voglio dire che mentre falso MA cross " Arrow " non torna al punto precedente MA cross.

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

D: Cosa posso fare per questa situazione, per favore?

Grazie in anticipo.

 
Max Enrik: E quando scrivo sotto il codice di ritorno al mio indicatore personalizzato allora il mio indicatore personalizzato non funziona correttamente quello che voglio. Voglio dire che mentre falso MA cross " Arrow " non torna al punto precedente MA cross.
Pubblicate tutto il vostro codice. Non ha senso senza contesto.
 
whroeder1:
Pubblicate tutto il vostro codice. Non ha senso senza contesto.

Ecco a voi.

Grazie in anticipo.

Indicatore Esempio grafico 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: Voglio dire che mentre il falso incrocio MA "Freccia" non torna al punto di incrocio MA precedente.
Non si testa per questo e si sposta indietro.
 
whroeder1:
Non si fa un test per questo e lo si sposta indietro.

OK! Grazie!
 

Ho ancora bisogno di una risposta più chiara.

Grazie in anticipo.

 

La risposta è:Controlla sia l'attuale MA Cross che il precedente MA Cross.

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

 

#Primo risultato del Loop - Aperto

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

Grazie in anticipo.

Motivazione: