prev_calculé - page 2

 
Alexey Kozitsyn:
Pourquoi ne pas simplement recalculer l'ensemble de l'indicateur lorsqu'il est à 0 ? Cela me semble être la meilleure solution.
Pour un indicateur lourd avec des tonnes de graphiques - pas le meilleur. Non, la solution est simple - utiliser votre propre variable au lieu de prev_calculated, statique ou globale. Mais c'est une béquille et nous voulons autre chose.
 
Alexey Kozitsyn:
:) C'est ce que je fais...
C'est ce que j'ai compris, je ne faisais que citer votre question, mais en réalité je répondais àAlexandre Puzanov. :)
 
Alexander Puzanov:
Pour un indicateur lourd avec des tonnes de graphiques, ce n'est pas la meilleure solution. La solution est simple - utiliser votre propre variable au lieu de prev_calculated, statique ou globale. Mais c'est une béquille et nous voulons autre chose.

Une personne qui utilise le mot "béquille" :

  • est soit trop paresseux pour lire la documentation
  • ou ne sait pas encore comment il devrait être correct.
La seule solution correcte : à prev_calcul==0 recalculer l'indicateur.

 
Alexander Puzanov:
Pour un indicateur lourd avec des tonnes de graphiques - pas le meilleur. Non, la solution est simple - utiliser sa propre variable au lieu de prev_calculated, statique ou globale. Mais c'est une béquille et nous voulons autre chose.
Pas du tout une béquille. C'est comme ça que je fais.
 
Karputov Vladimir:
Et si l'historique a été échangé, cela signifie qu'il peut y avoir de nouvelles barres qui ont été manquées ou qui n'ont pas été calculées auparavant - c'est-à-dire que les lectures de l'indicateur seront déjà fausses.

Slawa:

Si prev_calculated=0, cela signifie qu'un recalcul complet doit être effectué. Tous les indicateurs standard sont entièrement recalculés dans ce cas.

Tout est clair, mais hélas, tout n'annule pas cela :

Alexander Puzanov:

Tout cela est utile, mais ne peut pas être utilisé conformément à son objectif direct - montrer combien de "barres ont été traitées lors de l'appel précédent" - prev_calculated.

Les indicateurs sont différents ; certains n'ont pas du tout besoin de barres pour les calculs, d'autres n'ont besoin que de ticks en direct, d'autres encore ont des limitations sur la profondeur de conversion - ils ne se soucient pas de ce qui a changé ensuite dans l'historique, d'autres ont besoin de suivre des objets graphiques, etc. Ils n'ont pas besoin de fonctions supplémentaires pour suivre les changements dans l'historique attaché à prev_calculated, ils ont seulement besoin de ceci - "barres traitées lors de l'appel précédent". Ils n'en ont pas besoin.

Quoi qu'il en soit, M. les programmeurs, s'il vous plaît, n'empêchez pas le participant de "saisir l'événement".

 
Alexey Kozitsyn:
Et si je recalculais simplement l'indicateur entier à 0 ? À mon avis, c'est la meilleure solution.

Je ne dirais pas que c'est la meilleure solution. Du moins pas encore.

J'ai décidé d'écrire un indicateur qui enregistre le tirage actuel sur le compte, afin de ne pas avoir à recalculer quoi que ce soit dans l'historique. La première ligne ressemblait à ceci au début.

if(prev_calculated == 0)  return(rates_total);
Mais après le démarrage, j'ai constaté que les tampons ne sont pas vides et ne sont pas mis à zéro. Il y a un prix dans les tampons d'origine inconnue. J'ai dû forcer les tampons à zéro... Ensuite, un autre problème a été découvert. Le prev_calcul est mis à zéro et l'indicateur est recalculé, respectivement, en mettant à zéro tous les tampons jusqu'à la dernière barre. Quoi qu'il en soit, j'ai abandonné l'idée pour le moment.
 
Alexey Viktorov:

Je ne dirais pas que c'est la meilleure solution. Du moins pas encore.

J'ai décidé d'écrire un indicateur qui enregistre le tirage actuel sur le compte, afin de ne pas avoir à recalculer quoi que ce soit dans l'historique. Au début, la première ligne ressemblait à ceci.

if(prev_calculated == 0)  return(rates_total);
Mais après le démarrage, j'ai constaté que les tampons ne sont pas vides et ne sont pas mis à zéro. Il y a un prix dans les tampons dont je ne sais pas d'où il vient. J'ai dû forcer les tampons à zéro... Ensuite, un autre problème a été découvert. Le prev_calcul est mis à zéro et l'indicateur est recalculé, respectivement, en mettant à zéro tous les tampons jusqu'à la dernière barre. Quoi qu'il en soit, j'ai abandonné l'idée pour le moment.

"... un prix d'origine inconnue... "Il s'agit d'éléments non initialisés d'un tableau de tampons indicateurs. Ce qui devrait être fait :

  • à prev_calcul==0, parcourir tous les éléments du tampon indicateur dans la boucle et leur attribuer des valeurs. Dans ce cas, vous devez surveiller la situation lorsqu'une nouvelle barre apparaît (rates_total moins prev_calculate sera supérieur à zéro) - le tampon de l'indicateur augmente en conséquence et ce nouvel élément doit également être initialisé.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bugs, bugs, questions

Alexey Viktorov, 2016.10.17 09:58

Comprends-tu ce que tu as écrit ?

Mieux vaut expliquer comment se débarrasser des déchets. C'est la première fois que l'indicateur est utilisé. D'où viennent ces déchets ? Ne devrait-il pas y avoir une initialisation lors de la liaison entre le tampon et le tableau ? ou est-ce lors de l'initialisation que les déchets spatiaux entrent dans le tableau ? ?? Pourquoi n'y a-t-il pas de telles ordures dans le mql4 ?

Donnez-moi un exemple de la façon dont on peut séparer les déchets des valeurs normales sans utiliser de variables statiques ou globales supplémentaires.

Tout le monde a le droit de citer la documentation.


 

Personne ne doit rien à personne. Il y aura donc des déchets dans le tampon de l'indicateur, après la liaison, jusqu'à ce que vous initialisiez vous-même tous les éléments du tableau.

Ajouté :

Je vais maintenant créer un exemple...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   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)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Passe-le sur M1. Vous verrez que seule la barre la plus à droite est recalculée.
Dossiers :
 
Karputov Vladimir:

Personne ne doit rien à personne. Il y aura donc des déchets dans le tampon de l'indicateur, après la liaison, jusqu'à ce que vous initialisiez vous-même tous les éléments du tableau.

Ajouté :

Je vais maintenant créer un exemple...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,INDICATOR_DATA);
//---
   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)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Passe-le sur M1. Vous verrez que seule la barre la plus à droite est recalculée.

Une capacité étonnante à répondre à la mauvaise question...

Maintenant, expliquez-moi ce qui se passe si :

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

2. Soudain l'historique est chargé et prev_calculated devient 0

À partir de quelle barre, il sera de 1,03 ?