prev_calculé - page 3

 
Alexey Viktorov:

La capacité étonnante de répondre à la mauvaise question...

Maintenant, expliquez-moi ce qui se passe si :

1. 100 barres recalculées, entrées dans les tampons de 0 à 99 inclus (considérons la direction comme une série chronologique) la valeur 1.03

2. Soudain, l'historique a été chargé et prev_calculé est devenu 0.

A partir de quelle barre de l'indicateur la valeur sera de 1.03 ?

  1. Afin de calculer l'indexation comme dans les séries temporelles, nous devons définir le drapeau AS_SERIES dans OnInit() du tampon de l'indicateur - c'est pourquoi je préfère utiliser le concept "la barre la plus à droite" - de cette façon, personne ne sera informé par erreur.
  2. Voici la réponse :
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    à "prev_calculated==0" absolument tous les éléments du tampon de l'indicateur seront réinitialisés avec les valeurs "1.01" et on sortira immédiatement par "return(rates_total) ;". C'est-à-dire qu'aucune trace des valeurs précédentes de "1.03" ne restera dans le tampon de l'indicateur.
 
Alexey Viktorov:

Mieux vaut expliquer comment se débarrasser des ordures laPREMIÈRE fois que l'indicateur est mis en marche.

C'est simple : oubliez prev_calculated et créez votre propre copie sans le "trou sur le côté". Si vous voulez garder la trace des barres calculées précédemment - commefxsaber dans l'exemple.
fxsaber:
Pas du tout une béquille. C'est comme ça que je fais.
Si un simple indicateur first run / no longer first run est suffisant, remplacez prev_calculated par static bool b_First_Run. Ou vous pouvez mettre l'initialisation du tampon à OnInint
 
Karputov Vladimir:
  1. Pour considérer l'indexation comme dans les séries temporelles, nous devons définir l'indicateur AS_SERIES dans OnInit() du tampon de l'indicateur - c'est pourquoi je préfère utiliser la "barre la plus à droite" - ainsi personne ne sera informé par erreur.
  2. Voici la réponse :
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    à "prev_calculated==0" absolument tous les éléments du tampon de l'indicateur seront réinitialisés avec les valeurs "1.01" et on sortira immédiatement par "return(rates_total) ;". C'est-à-dire qu'aucune trace des valeurs précédentes de "1.03" ne restera dans le tampon de l'indicateur.

C'est donc ce problème qu'il faut résoudre. Je n'ai pas besoin de déchets (pas vraiment, mais ils interfèrent avec l'affichage), mais j'ai besoin de sauvegarder les calculs précédents de l'indicateur. Lorsque vous démarrez l'indicateur pour la PREMIÈRE fois, le tampon se vide, et lorsque vous chargez l'historique, tout ce qui a été inséré dans les tampons devrait être sauvegardé ... et de préférence sans l'enregistrer dans un fichier ou dans GV.


ajouté :

Il s'agit d'estimer le drawdown en temps réel toutes les minutes. L'Expert Advisor travaille pendant une semaine sans s'arrêter, et au lieu de l'affichage hebdomadaire, nous ne verrons que la dernière valeur, qui est visible même sans l'indicateur.

 
Alexander Puzanov:
Si un simple indicateur de première exécution / plus de première exécution est suffisant, remplacez prev_calculated par static bool b_First_Run. Et vous pouvez mettre l'initialisation du tampon dans OnInint
Non, les objectifs ne sont pas si primitifs.
 
fxsaber:
Non, les objectifs là-bas ne sont pas si primitifs.
Ce n'est pas ce que vous suggérez,Alexey Viktorov. D'après ce que j'ai compris, il suffit de mettre à zéro les tampons au premier démarrage et de ne rien toucher dans les tampons pendant la pagination.
 
Alexey Viktorov:

C'est donc ce problème qu'il faut résoudre. Je n'ai pas besoin de déchets (je n'en ai pas besoin, mais ils interfèrent avec l'affichage), mais j'ai besoin de sauvegarder les calculs précédents de l'indicateur. Lorsque vous démarrez l'indicateur pour la PREMIÈRE fois, le tampon se vide, et lorsque vous chargez l'historique, tout ce qui a été inséré dans les tampons devrait être sauvegardé ... et de préférence sans l'enregistrer dans un fichier ou dans GV.


ajouté :

Il s'agit d'une estimation en temps réel du drawdown chaque minute. L'Expert Advisor travaille pendant une semaine sans s'arrêter, et au lieu de l'affichage hebdomadaire, nous ne verrons que la dernière valeur, qui est visible même sans indicateur...

О ! Maintenant, ça a plus de sens. Je vous répondrai dans la soirée.
 
Alexander Puzanov:
Ce n'est pas ce que vous suggérez,Alexey Viktorov, si j'ai bien compris, vous n'avez besoin que de ceci : mettre les tampons à zéro au premier démarrage et ne rien toucher dans ces tampons pendant toutes sortes de pagination.
Bien sûr, j'ai commencé par initialiser les buffers dans OnInit(), mais quelque chose n'allait pas. Je ne me souviens plus quoi et je les ai initialisés dans OnCalculate avec prev_calculated == 0
 

Revérification de ce qui se passe si les tableaux de tampons sont initialisés dans OnInit().

Même lorsque l'indicateur est retiré du graphique et réinstallé, PAS TOUTES les mémoires tampons, mais certaines, conservent les anciennes valeurs. Elles ne sont même pas exactement ce qu'elles étaient avant, mais l'une de ces valeurs s'étend sur plusieurs barres.

 
Karputov Vladimir:
Oh ! Ça a plus de sens maintenant. Je vous recontacterai ce soir.
Désolé pour le retard dans la réponse. Le seul moyen de sauvegarder les valeurs calculées pour cette période est de les enregistrer dans un fichier. Cela nécessite une synchronisation - les données doivent être distribuées sur leurs barres lors de la lecture du fichier. La façon la plus logique est de le synchroniser avec l'heure d'ouverture de la barre, mais il peut y avoir quelques nuances : par exemple, l'heure d'ouverture de la barre (enregistrée dans un fichier) était 2016.09.05. 25:02, mais maintenant il y a une barre sur le graphique avec une heure égale à 2016.09.05. 25:01.
 
Karputov Vladimir:
Désolé pour le retard dans la réponse. Le seul moyen d'enregistrer les valeurs calculées pour une période donnée est de les sauvegarder dans un fichier. Vous devez vous occuper de la synchronisation - de sorte que lors de la lecture du fichier, les données soient placées sur leurs barres. La solution la plus logique est la synchronisation en fonction de l'heure d'ouverture de la barre, mais il peut y avoir quelques subtilités : par exemple, l'heure d'ouverture de la barre (enregistrée dans le fichier) était 2016.09.05. 25:02, mais il y a maintenant une barre sur le graphique dont l'heure est égale à 2016.09.05. 25:01.

Ou peut-être serait-il préférable d'attirer l'attention des développeurs sur le problème de l'initialisation des tampons indicateurs ? Pourquoi ce problème n'existe-t-il pas dans MT4 ? Peut-être encore une fois pas une compréhension complète ? Le problème est que même après l'initialisation obligatoire des tampons après avoir retiré un indicateur d'un graphique dans CHACUN d'eux, tous les tampons ne contiennent pas de déchets, et nous ne pouvons pas les décharger à partir de là...

Personnellement, je n'ai rien contre les béquilles, mais seulement si ces béquilles ne sont pas trop compliquées et si elles ont un effet positif. Mais écrire dans un fichier et le lire ensuite est une béquille minable.