Indicateur Questions diverses - page 15

 

OnCalculate

La fonction OnCalculate() est appelée uniquement dans les indicateurs personnalisés lorsqu'il est nécessaire de calculer les valeurs de l'indicateur par l'événement Calculate .

Cela se produit généralement lorsqu'un nouveau tick est reçu pour le symbole pour lequel l'indicateur est calculé.

Il n'est pas nécessaire que cet indicateur soit attaché à un graphique de prix de ce symbole.

La fonction OnCalculate() doit avoir un type de retour int. Il existe deux définitions possibles. Dans un même indicateur, vous ne pouvez pas utiliser les deux versions de la fonction.

La première forme est destinée aux indicateurs qui peuvent être calculés sur un seul tampon de données. Un exemple d'un tel indicateur est la moyenne mobile personnalisée.

intOnCalculate(constint rates_total,// taille du tableau price[])
constint prev_calculated,// barres traitées lors d'un appel précédent
constint begin,// point de départ des données significatives
constdouble& price[]// tableau à calculer
) ;

 
Marco vd Heijden:

OnCalculate

La fonction OnCalculate() est appelée uniquement dans les indicateurs personnalisés lorsqu'il est nécessaire de calculer les valeurs de l'indicateur par l'événement Calculate .

Cela se produit généralement lorsqu'un nouveau tick est reçu pour le symbole pour lequel l'indicateur est calculé.

Il n'est pas nécessaire que cet indicateur soit attaché à un graphique de prix de ce symbole.

La fonction OnCalculate() doit avoir un retour de type int. Il existe deux définitions possibles. Dans un indicateur, vous ne pouvez pas utiliser les deux versions de la fonction.

La première forme est destinée aux indicateurs qui peuvent être calculés sur un seul tampon de données. Un exemple d'un tel indicateur est la moyenne mobile personnalisée.

intOnCalculate(constint rates_total,// taille du tableau price[])
constint prev_calculated,// barres traitées lors d'un appel précédent
constint begin,// point de départ des données significatives
constdouble& price[]// tableau à calculer
) ;

Parfait, M. Marco, merci beaucoup plus.
 

(J'utilise le mot " Lag " qui signifie retarder l'action du prix, l'ouverture ou la fermeture d'un ordre, un seul mot suffit à faire tomber ma plateforme MT4).

J'utilise la fonction ci-dessous pour mon indicateur personnalisé.

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

Lorsque j'écris le code de retour ci-dessous à mon indicateur personnalisé, celui-ci commence à être décalé. Mais il fonctionne correctement, ce que je veux.

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

Et quand j'écris le code de retour ci-dessous à mon indicateur personnalisé, alors mon indicateur personnalisé ne fonctionne pas correctement, ce que je veux. Je veux dire que pendant le faux croisement MA, la " Flèche " ne retourne pas au point de croisement MA précédent.

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

Q : Que puis-je faire pour cette situation, s'il vous plaît ?

Merci d'avance.

 
Max Enrik: Et quand j'écris le code de retour ci-dessous à mon indicateur personnalisé alors mon indicateur personnalisé ne fonctionne pas correctement ce que je veux. Je veux dire que pendant le faux croisement de la MA, la " Flèche " ne retourne pas au point de croisement précédent de la MA.
Affichez tout votre code. Cela n'a aucun sens sans contexte.
 
whroeder1:
Affichez tout votre code. Cela n'a aucun sens sans contexte.

Voilà.

Merci d'avance.

Indicateur Exemple de graphique 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: Je veux dire que pendant le faux croisement de la MA, la " flèche " ne retourne pas au point de croisement précédent de la MA.
On ne teste pas cela et on ne le fait pas revenir en arrière.
 
whroeder1:
On ne fait pas de test pour ça et on ne le repousse pas.

OK ! Merci !
 

J'ai encore besoin d'une réponse plus claire.

Merci d'avance.

 

La réponse est :Vérifiez le croisement actuel et le croisement précédent de la MA.

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

 

#Premier résultat de la boucle - Ouvrir

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

Merci d'avance.