Le changement de TF est un problème - page 3

 
Vasyl Nosal:

J'ai une idée. J'écrirai plus tard.

l'idée est morte.

Je vais demander aux développeurs de faire quelque chose comme le système HistoryUpdated() pour vérifier si tout l'historique a été mis à jour ou non.

Une variante optimale. Maintenir à jour l'historique pour toutes les périodes. Récemment, un indicateur similaire est apparu dans CodeBase
 
Slawa:

Lesdéveloppeurs ne vous aideront pas parce qu'ils ne le feront pas.

Déjà dit : si la différence entre rates_total et prev_calculated est supérieure à 1, alors c'est historyUpdated.

est supérieure à 0, et non à 1.

И ? Cela résout-il le problème ?

Ou n'est-ce pas un problème pour vous de recalculer toute l'histoire à chaque nouvelle barre?

 
Vasyl Nosal:

est supérieure à 0, et non à 1.

И ? Cela résout-il le problème ?

Ou n'est-ce pas un problème pour vous de recalculer toute l'histoire à chaque nouvelle barre?

On vous a dit correctement. Supérieur à 1. Lorsqu'une nouvelle barre apparaît, la différence est de 1.

Et cela résout complètement le problème.

Un indicateur normal prend très peu de temps pour se recalculer complètement. Moins d'une seconde.

 
Victor Nikolaev:

On vous a dit correctement. Plus de 1. Lorsqu'une nouvelle barre apparaît, la différence est de 1.

Et cela résout complètement le problème.

Un indicateur normal prend très peu de temps pour recalculer complètement. Moins d'une seconde.

Ne fonctionne que si les tampons sont mis à zéro.

//history update
  int all=rates_total;
  int counted=prev_calculated;
  if(all-counted>1)
  { 
  ArrayInitialize(up_arr,EMPTY_VALUE);
  ArrayInitialize(down_arr,EMPTY_VALUE);
  counted=0;
  }
   
   //main
 for(int i=all-counted;i>=0;i--)
{
 
Vasyl Nosal:

Cela ne fonctionne que si vous remettez les tampons à zéro.

//history update
  int all=rates_total;
  int counted=prev_calculated;
  if(all-counted>1)
  { 
  ArrayInitialize(up_arr,EMPTY_VALUE);
  ArrayInitialize(down_arr,EMPTY_VALUE);
  counted=0;
  }
   
   //main
 for(int i=all-counted;i>=0;i--)
{

Désolé, mais laissez-moi vous demander :

  • pourquoi devez-vous affecter rates_total et prev_calculated à des variables distinctes créées à chaque tick ici ?
  • Dans l'expression de l'opérateur conditionnel if() et dans la boucle for() pour recalculer la différence de ces variables ?
  • pourquoi ne pas simplement introduire une variable pour la différence entre rates_total et prev_calculated, par exemple limit ?
La mise en œuvre peut être différente en fonction de la tâche. Les nuances peuvent être différentes. Pourquoi ne pas voir comment elle est mise en œuvre par d'autres, en fonction des différentes conditions ? Y compris, et avec l'aide de l'amorçage pour comprendre, décider, former des options acceptables pour vous-même, en fonction des tâches ?
 
Vasyl Nosal:

P.S. Je vais en rajouter :

Votre idée sur la mise à zéro (compté=0) dans le bloc de l'opérateur conditionnel if(){} me semble claire.

Au cas où vous comprendriez mieux ce que je veux dire brièvement ci-dessus, voici un extrait de la documentation, de la section ... Les bases du langage / Fonctions / Fonctions de traitement des événements:

... Si, depuis le dernier appel de OnCalculate(), les données de prix ont été modifiées (un historique plus profond a été pompé ou les lacunes de l'historique ont été comblées), alors la valeur du paramètre d'entrée prev_calculated sera mise à zéro par le terminal lui-même.

 
Vasyl Nosal:

Cela ne fonctionne que si vous remettez les tampons à zéro.

Vous n'avez pas besoin de réinitialiser quoi que ce soit.

int OnCalculate(...)
{
   // индекс последнего посчитанного на прошлом вызове бара
   // с которого начинаем расчёт
   int nStartBar = rates_total - MathMax(prev_calculated, 1);

   for(int i = nStartBar; i >= 0; i--)
   {
       // рассчитываем индикатор на всех непосчитанных барах
   }
}

Si vous remettez prev_caclulated à zéro, l'indicateur se recalculera complètement. Et c'est exact - vous ne savez pas exactement ce qui a changé dans l'histoire. Peut-être, un trou a été chargé, peut-être que les goujons ont été nettoyés quelque part. Il est obligatoire de recalculer complètement. Dans tous les autres cas, seule une dernière barre sera recalculée (lorsqu'une nouvelle barre apparaît, les deux dernières).

 
Dina Paches:

Désolé, mais laissez-moi vous demander :

  • Pourquoi devez-vous affecter les valeurs de rates_total et prev_calculated à des variables distinctes à chaque tick ?
  • Dans l'instruction conditionnelle if() et dans la boucle for(), recalculez-vous la différence de ces variables ?
  • pourquoi ne pas simplement entrer une variable pour la différence entre rates_total et prev_calculated, par exemple la limite ?
La mise en œuvre peut être différente en fonction de la tâche. Les nuances peuvent être différentes. Pourquoi ne pas regarder ce que d'autres ont mis en œuvre en fonction des différentes conditions ? Y compris, et avec l'aide de l'amorçage pour comprendre, décider, former des variantes acceptables pour vous-même, en fonction des tâches ?

Merci. Bon point.

Ce n'est pas le cas. C'est pour que vous puissiez recalculer tout l'historique s'il y a un trou.

 
Dina Paches:

P.S. Je vais en rajouter :

Votre idée sur la mise à zéro (compté=0) dans le bloc de l'opérateur conditionnel if(){} me semble claire.

Au cas où vous comprendriez mieux ce que je veux dire brièvement ci-dessus, voici un extrait de la documentation, de la section ... Les bases du langage / Fonctions / Fonctions de traitement des événements:

... Si, depuis le dernier appel de OnCalculate(), les données de prix ont été modifiées (un historique plus profond a été pompé ou les lacunes de l'historique ont été comblées), alors la valeur du paramètre d'entrée prev_calculated sera mise à zéro par le terminal lui-même.

Ça n'arrivera pas. C'est 0 puis pas 0 puis 0 à nouveau (en chargeant l'historique plusieurs fois).
 
Sergei Vladimirov:

Il n'est pas nécessaire de réinitialiser quoi que ce soit.

Si vous mettez à zéro prev_caclulated, l'indicateur se recalculera complètement. Et c'est exact - vous ne savez pas exactement ce qui a changé dans l'histoire. Peut-être, un trou a été chargé, peut-être que les goujons ont été nettoyés quelque part. Il est obligatoire de recalculer complètement. Dans tous les autres cas, seule une dernière barre sera recalculée (lorsqu'une nouvelle barre apparaît, les deux dernières).

Non. Sans remise à zéro, ce sera ce que montrent les captures d'écran.
Raison: