Erreurs, bugs, questions - page 2997

 
Alexey Viktorov:

Peut-être que les skis sont mauvais ?


Et aussi RTS-6.21.


Merci pour votre aide. J'ai compris. Connecté différentes versions d'indicateurs à partir de différents dossiers.

 
Francuz:

Oui, je l'ai fait. Le résultat n'a pas changé.

Je ne le crois pas.
essayez à nouveau

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

Je ne le crois pas.
essayez encore.

J'ai compris. Le problème était que deux fichiers ATR différents provenant de dossiers différents étaient connectés. C'est pour ça qu'il y avait une différence dans les valeurs.

Merci pour votre aide.
 
Nikolai Semko:

Je ne le crois pas.
essayez à nouveau

Nikolaï, lui, avait un problème différent. Je n'ai pas non plus compris immédiatement le problème, j'ai pensé que je devais obtenir des valeurs d'un autre TF. J'ai lubrifié les skis et tout s'est bien passé.
 
Alexey Viktorov:
Nikolay, lui, avait un problème différent. Je n'ai pas non plus compris la question au début, je pensais que je devais obtenir les valeurs d'une autre TF. J'ai huilé les skis et tout s'est bien passé.

Bizarre, je n'ai rien compris.
J'ai reproduit son problème dans le mien exactement comme il l'a décrit.
Cela s'est produit exactement parce que la seule exécution de CopyBuffer a eu lieu à la première exécution dans OnCalculate, lorsque prev_calculated == 0 et qu'il n'y avait aucune garantie que les barres étaient déjà générées.
La solution était d'ignorer cette première exécution et de n'exécuter le seul CopyBuffer que lorsque prev_calculated>0.
Je ne comprends pas"deux fichiers ATR différents provenant de dossiers différents ".

 
Nikolai Semko:

Bizarre, je n'ai rien compris.
J'ai reproduit son problème dans le mien exactement comme il l'a décrit.
Cela s'est produit exactement parce que la seule exécution de CopyBuffer a eu lieu à la première exécution dans OnCalculate, lorsque prev_calculated == 0 et qu'il n'y avait aucune garantie que les barres étaient déjà générées.
La solution était d'ignorer ce premier appel et d'exécuter un CopyBuffer unique uniquement lorsque prev_calculated>0.
Pourquoi il y avait"deux fichiers ATR différents provenant de dossiers différents " - je ne comprends pas.

Eh bien, si le graphique est ouvert et que l'indicateur pour la TF actuelle est créé, les données devraient déjà être prêtes lorsque le graphique est ouvert. N'est-ce pas ?

 
Alexey Viktorov:

Eh bien, si un graphique est ouvert et qu'un indicateur est créé pour la TF actuelle, les données devraient déjà être prêtes lorsque le graphique est ouvert. N'est-ce pas ?

Oh, combien de merveilleuses découvertes nous attendent... plus

 
Alexey Viktorov:

Eh bien, si un graphique est ouvert et qu'un indicateur est créé pour la TF actuelle, les données devraient déjà être prêtes lorsque le graphique est ouvert. N'est-ce pas ?

Je ne l'ai pas exprimé correctement. Les barres sont oui - très probablement elles sont prêtes. Mais il n'y a aucune garantie que l'indicateur a été recalculé pour toutes ces barres au premier appel de OnCalculate, lorsque prev_calculated == 0.
Vous pouvez exécuter un tel indicateur pour vous en assurer.
Mais cela doit être fait lorsque les cours sont négociés. Si le marché est fermé, vous ne verrez pas le décalage.
Il est donc préférable de l'essayer sur les crypto-monnaies, qui sont en mouvement, le week-end.
Si le tableau Size of Buffer = -1, cela signifie que le tampon de l'indicateur n'a pas encore été recalculé et que la valeur BS ne sera pas correcte.

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Si vous le faites lors du prochain appel de OnCalculate (lorsque prev_calculated>0), il n'y aura pas de problème de ce type.

SOM il y avait une erreur dans le code - je l'ai corrigée.

 
Artyom Trishkin:

Oh, quelles merveilleuses découvertes nous attendent... plus

Je voulais dire les données pour calculer l'indicateur. Ne sois pas sarcastique))))

 
Alexey Viktorov:

Je voulais dire les données pour calculer l'indicateur. Ne sois pas sarcastique))))

Vous ouvrez un nouveau graphique de symboles. Vous voyez les chandeliers dessus. Vous lancez l'indicateur, et il ne voit pas de données et quitte le gestionnaire jusqu'au prochain tick. Au tick suivant, il voit les données et calcule.
Ça arrive...

Raison: