Pourquoi les indicateurs (lignes, flèches, histogrammes) clignotent-ils dans le terminal MT5 ?

 

A quoi peut être lié le clignotement des indicateurs (lignes, flèches, histogrammes), à la fois dans la fenêtre principale du graphique et dans une fenêtre séparée ? On a l'impression que l'indicateur est redessiné et qu'en même temps les marques et les valeurs tampons disparaissent de la liste pendant une seconde, puis réapparaissent dans la liste. Y a-t-il un problème avec le code du programme ?

Ce phénomène est uniquement observé dans le terminal MT5, il n'est pas observé dans MT4.

 
Eugene Myzrov:

A quoi peut être lié le scintillement des indicateurs (lignes, flèches, histogrammes), à la fois dans la fenêtre principale du graphique et dans une fenêtre séparée ? L'impression est que l'indicateur est redessiné et qu'au même moment, dans la fenêtre de données, les étiquettes et les valeurs de la mémoire tampon disparaissent de la liste pendant une seconde, puis réapparaissent dans la liste. Un problème dans le code du programme ?

Et ceci n'est observé que dans le terminal MT5, il n'est pas observé dans MT4.


Suggérez-vous que nous essayions de deviner ? N'hésitez pas à me contacter ; )
 
Vitalie PostolacheVous proposez un exercice de voyance ? Vous êtes les bienvenus ; )

Non, c'est juste que la recherche n'a pas répondu à la question qui m'intéresse.
Peut-être savez-vous pourquoi le scintillement n'est observé que dans le terminal de change MT5, alors qu'il n'y a pas de scintillement dans le terminal de forex MT5 ?

 
Eugene Myzrov:

Non, la recherche n'a tout simplement pas répondu à la question qui m'intéressait.
Peut-être savez-vous pourquoi le scintillement n' est observé que dans le terminal de change MT5, alors qu' il n'y a pas de scintillement dans le terminal de forex MT5 ?


Tous les indicateurs clignotent-ils ? Le MT5 est le même, seul le type de compte peut être différent - bourse ou forex.
 
Vitalie PostolacheQue tous les indicateurs clignotent carrément ? Le MT5 est le même, seul le type de compte peut être différent - bourse ou forex.

C'est ce que je voulais dire lorsque j'ai mentionné le terminal MT5 pour le forex et la bourse en abrégé. Un problème plus complet ressemble à ceci. Lorsque je me connecte à un courtier en forex, les indicateurs du terminal MT5 ne clignotent pas, mais lorsque je me connecte à un courtier en bourse, je vois des clignotements et aussi des marques tampons des indicateurs et des valeurs qui disparaissent dans la fenêtre de données pendant une seconde ou deux.

Quant à la question de savoir si tous les indicateurs se comportent de la sorte, je ne peux pas l'affirmer. Permettez-moi d'en poster une maintenant, afin de ne pas être sans fondement.

 
Il s'agit d'un indicateur "AOM" dérivé de l'indicateur "AO" avec des généralisations mineures.
//+-----------------------------------------------------------------------------------------------------+
//| AOM = Awesome Oscillator Modernized (индикатор AO Модернизированный)
//+-----------------------------------------------------------------------------------------------------+
#property copyright  "Copyright© 2014, Scriptolog® [ myzrov@mail.ru ]"
#property link       "mailto:myzrov@mail.ru"
#property version    "2.0" // текущая версия

#property description "«AOM» - индикатор «AO» модернизированный.\n"

#property description "Предупреждение о рисках. Торговля на рынке Forex с использованием"
#property description "кредитного плеча несёт в себе значительные финансовые риски."

//#property icon "\\Images\\Constructor.ico" // путь к файлу заставки
#property strict

#property   indicator_separate_window
#property   indicator_buffers 2
#property   indicator_plots   2

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#property    indicator_label1  "AOM UP"
#property    indicator_color1  clrGreen
#property    indicator_width1  3
#property    indicator_style1  STYLE_SOLID
#property    indicator_type1   DRAW_HISTOGRAM

#property    indicator_label2  "AOM DN"
#property    indicator_color2  clrRed
#property    indicator_width2  3
#property    indicator_style2  STYLE_SOLID
#property    indicator_type2   DRAW_HISTOGRAM

#property    indicator_level1  0.0000 // Горизонтальный уровень в отдельном окне индикатора

   input int                  AOM_PERIOD_FACTOR  =   1;           // AOM. Коэф-т повышения периода усреднения
   input int                  AOM_PERIOD_FAST    =   5;           // AOM. Период усреднения MA быстрой 
   input int                  AOM_PERIOD_SLOW    =  34;           // AOM. Период усреднения MA медленной
   input int                  AOM_SHIFT          =   0;           // AOM. Сдвиг по горизонтали
   input ENUM_MA_METHOD       AOM_METHOD         =  MODE_SMA;     // AOM. Метод усреднения
   input ENUM_APPLIED_PRICE   AOM_PRICE          =  PRICE_MEDIAN; // AOM. Цена   усреднения

//+------------------------------------------------------------------+
//| Глобальные переменные
//+------------------------------------------------------------------+

   double   aUP[], aDN[]; // INDICATOR_DATA

   double   aom, last_aom;  // текущее и предыдущее значения индикатора AO

   int      ma_fast_handle; // =iMA(_Symbol, PERIOD_CURRENT, AOM_PERIOD_FAST, AOM_SHIFT, AOM_METHOD, AOM_PRICE);
   int      ma_slow_handle; // =iMA(_Symbol, PERIOD_CURRENT, AOM_PERIOD_SLOW, AOM_SHIFT, AOM_METHOD, AOM_PRICE);
 
   int      MAX_PERIOD;

// периоды усреднения быстрой и медленной MA (в барах)
   int      AOM1_PERIOD_FAST;    // =AOM_PERIOD_FAST*AOM_PERIOD_FACTOR;
   int      AOM1_PERIOD_SLOW;    // =AOM_PERIOD_SLOW*AOM_PERIOD_FACTOR;
  
//+------------------------------------------------------------------+
//| Custom indicator initialization function
//+------------------------------------------------------------------+
int OnInit()
{
// Подготовить периоды усреднения быстрой и медленной MA (в барах)
   AOM1_PERIOD_FAST=AOM_PERIOD_FAST*AOM_PERIOD_FACTOR;
   AOM1_PERIOD_SLOW=AOM_PERIOD_SLOW*AOM_PERIOD_FACTOR;

   MAX_PERIOD=(int)MathMax(AOM1_PERIOD_FAST, AOM1_PERIOD_SLOW)+1;

// Распределяет память под буферы, используемые для вычислений пользовательского индикатора
   ArraySetAsSeries(aUP, true); SetIndexBuffer(0, aUP, INDICATOR_DATA);
   ArraySetAsSeries(aDN, true); SetIndexBuffer(1, aDN, INDICATOR_DATA);

// Номер позиции начала отрисовки линии индикатора // sets drawing line empty value
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MAX_PERIOD); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, MAX_PERIOD); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

// set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits+1);
   string short_name; StringConcatenate(short_name, "AOM [", AOM_PERIOD_FACTOR, "]  (", AOM_PERIOD_FAST, ",", AOM_PERIOD_SLOW, ")");

   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

   ResetLastError();

// Инициализация 2-х индикаторов MA
   ma_fast_handle=iMA(_Symbol, PERIOD_CURRENT, AOM1_PERIOD_FAST, AOM_SHIFT, AOM_METHOD, AOM_PRICE);
   ma_slow_handle=iMA(_Symbol, PERIOD_CURRENT, AOM1_PERIOD_SLOW, AOM_SHIFT, AOM_METHOD, AOM_PRICE);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Функция деинициализации является обработчиком события Deinit
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Удалить хэндлы индикаторов и освобождить расчетную часть индикатора
   if (ma_slow_handle!=INVALID_HANDLE) IndicatorRelease(ma_slow_handle);
   if (ma_fast_handle!=INVALID_HANDLE) IndicatorRelease(ma_fast_handle);
   return;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
                 const datetime& time[],     // Time 
                 const double&   open[],     // Open 
                 const double&   high[],     // High 
                 const double&   low [],     // Low 
                 const double&   close[],    // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& real_volume[],  // Real Volume 
                 const int&  spread[])       // Spread 
{
   int N=rates_total-prev_calculated; if (N>MAX_PERIOD) N-=MAX_PERIOD;

   for (int i=N; i>0 && !IsStopped(); i--) {
      double ma_fast=getMA(ma_fast_handle, i);
      double ma_slow=getMA(ma_slow_handle, i);;
      aom=ma_fast-ma_slow;
      if (aom>last_aom) {aUP[i]=aom; aDN[i]=EMPTY_VALUE;}
      else              {aDN[i]=aom; aUP[i]=EMPTY_VALUE;}
      last_aom=aom;
   }
   aUP[0]=EMPTY_VALUE; aDN[0]=EMPTY_VALUE;
   return(rates_total);
}
//+-------------------------------------------------------+
//| Возвращает значение индикатора «MA»
//+-------------------------------------------------------+
double getMA(int handle, int i) // откуда начнем копирование
{
   double aMA[1]; // массив для получения значениz индикатора
   double nMA=0;
   int k=CopyBuffer(handle, 0, i, 1, aMA); nMA=aMA[0];
   if (k<1) {int err=GetLastError(); Print("*** MA=", handle, " CopyBuffer error #", err);}
   return(nMA);
}
 
J'ai observé cet indicateur pendant un certain temps lorsqu'il était connecté à un agent de change (outil RTS-6.17) et jusqu'à présent, je n'ai remarqué qu'un seul des deux problèmes indiqués. Pendant un certain temps, les données de la fenêtre de données, c'est-à-dire les étiquettes et les valeurs des deux tampons de l'indicateur AOM, disparaissent.
 

J'observe ce comportement lorsqu'il y a beaucoup d'objets. Quand il n'y a pas d'objets, tout est plus ou moins normal. Les tampons des indicateurs peuvent aussi parfois clignoter lorsqu'un tick arrive (lorsqu'il y a des objets qui se mettent à jour).

Je pense que c'est une caractéristique de MT5, c'est lié au fait que maintenant les indicateurs sont dans des threads séparés pour chaque symbole/horodatage et pour mettre à jour l'image dans le thread GUI il faut une synchronisation, ce qui ajoute de la lenteur par rapport au modèle de thread unique de MT4. Le travail avec les objets est l'opération la plus gourmande en ressources, c'est pourquoi elle cause ce problème. Si le problème est observé sans objets, peut-être y a-t-il un autre chargement dans le code de l'indicateur. Si vous essayez de le localiser et de l'exclure, il devrait s'améliorer.

 
Stanislav Korotky: J'observe ce comportement lorsqu'il y a beaucoup d'objets. Quand il n'y a pas d'objets, tout est plus ou moins normal. Les tampons des indicateurs peuvent aussi parfois clignoter, lorsqu'un tick se produit (lorsque des objets sont mis à jour). Je pense que c'est une caractéristique de MT5, c'est lié au fait que maintenant les indicateurs sont dans des threads séparés pour chaque symbole/timestamp et pour mettre à jour une image dans le thread GUI il faut une synchronisation, et cela ajoute de la lenteur par rapport au modèle à un seul thread de MT4. Le travail avec les objets est l'opération la plus gourmande en ressources, c'est pourquoi elle provoque ce problème. Si le problème est observé sans objets, peut-être y a-t-il un autre chargement dans le code de l'indicateur. Si vous essayez de le localiser et de l'exclure, il devrait s'améliorer.

L'indicateur ne fonctionne pas avec les objets, donc on peut exclure cette possibilité. J'admets que cela peut être lié au code du logiciel, mais le code que j'ai cité ci-dessus est très simple et je ne vois pas où il échoue. Les principales questions restent toujours sans réponse : qui est à blâmer et que faire ? Existe-t-il un moyen d'y remédier ou est-il par principe incorrigible ? Peut-être les développeurs auront-ils leur mot à dire ici !

D'ailleurs, c'est le matin, la bourse n'a pas encore ouvert, donc tous les indicateurs sont debout comme des bâtons, les tampons dans la "fenêtre de données" ne sont pas redessinés, les lignes ne clignotent pas.

 

Eh bien, l'échange s'est ouvert, et à nouveau le même film. Je peux comprendre que les données des indicateurs sont recalculées à chaque tick, mais pourquoi devrais-je supprimer tous les tampons des indicateurs du tableau de la fenêtre de données ? N'est-il pas suffisant de mettre à jour leurs valeurs en place ? Par exemple, la façon dont on procède avec le prix de clôture. Après tout, avec un nouveau tick, le prix de clôture ne disparaît pas de la fenêtre de données pour réapparaître avec la valeur actualisée ? Pourquoi alors les tampons indicateurs disparaissent-ils pendant un certain temps ? De même, certains indicateurs ne sont pas recalculés sur la barre zéro actuelle, mais pourquoi sont-ils également redessinés dans la "fenêtre de données" ?

J'espère toujours une réponse de personnes compétentes, ou au moins un lien.

 

Il semble y avoir un problème. Soit ma question n'est plus pertinente et une solution a été trouvée depuis longtemps, soit je l'ai posée dans le mauvais fil. Peut-être n'y a-t-il pas de personnes plus compétentes sur le forum, ou bien les développeurs ne surveillent-ils pas cette section du forum ?
Pourquoi les tampons des indicateurs disparaissent-ils pendant un certain temps dans la "fenêtre de données" ? Ce problème n'est pas résolu en principe ou peut-il l'être ? Quel est le problème dans le code ci-dessus ? Et l'indicateur ne recalcule pas sa valeur sur la barre actuelle.