MT5ターミナルでインジケーター(ライン、矢印、ヒストグラム)が点滅するのはなぜですか?

 

インジケーター(ライン、矢印、ヒストグラム)の点滅は、メインチャートまたは別ウィンドウでどのような関係があるのでしょうか?インジケータが再描画されると同時に、マークとバッファの値が一瞬リストから消え、再びリストに表示される印象です。プログラムコードに何か問題があるのでしょうか?

これはMT5ターミナルでのみ観測され、MT4では観測されません。

 
Eugene Myzrov:

インジケーター(ライン、矢印、ヒストグラム)のちらつきは、メインのチャートウィンドウと別ウィンドウの両方で、何に関係しているのでしょうか?印象としては、インジケータが再描画され、同時にデータ ウィンドウではラベルとバッファの値が一瞬リストから消え、再びリストに表示されます。プログラムコードに問題があるのでしょうか?

また、これはMT5ターミナルでのみ観測され、MT4では観測されない。


推測してみようということなのでしょうか?お気軽にご連絡ください; )
 
Vitalie Postolache占いの提案ですか? どういたしまして; )

いや、検索しても私の興味のある質問には答えられなかったということです。
MT5為替ターミナルでのみフリッカーが観測され、MT5為替ターミナルではフリッカーが発生しない理由をご存知でしょうか?

 
Eugene Myzrov:

いや、検索しても私の興味のある質問に答えられないだけだった。
MT5為替ターミナルでのみ フリッカーが観測され、MT5為替ターミナルでは フリッカーが観測されない理由をご存知でしょうか?


すべてのインジケーターが点滅していませんか?MT5も同じで、口座の種類が取引所かFXか違うだけかもしれません。
 
Vitalie Postolacheそのストレートにすべてのインジケーターが点滅している?MT5は同じで、口座の種類が取引所かFXか違うだけかもしれません。

MT5のFX・証券取引端末を略して「MT5」と言ったのは、そういう意味です。より完全な問題は、次のように聞こえます。FXブローカーに接続するとMT5ターミナルのインディケータがちらつきませんが、証券会社に接続するとちらつきが発生し、またデータウィンドウの インディケータバッファマークと値が1~2秒消えます。

すべての指標がこのような挙動を示すかというと、そうとは言い切れない。根拠がないことにならないよう、今一度投稿させてください。

 
これは、「AO」指標から派生した「AOM」指標で、細かい一般化を行っています。
//+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
さて、このインジケータを証券会社(ツールRTS-6.17)に接続してしばらく見てみましたが、今のところ、指摘されている2つの問題のうち1つだけに気づきました。データウィンドウの データ、つまりAOMインジケーターの2つのバッファのラベルと値がしばらくの間消えます。
 

この挙動は、オブジェクトがたくさんあるときに観察されます。オブジェクトがないときは、すべてが多かれ少なかれ普通である。インジケーターバッファは、ティックが来たとき(更新中のオブジェクトがあるとき)に点滅することがあります。

これはMT5の特徴だと思うのですが、インディケータがシンボル/タイムスタンプごとに別々のスレッドになり、GUIスレッドの画像を更新するために同期が必要になり、MT4のシングルスレッド・モデルと比較して遅くなっていることと関係があると思います。オブジェクトを扱う のは最もリソースを消費する操作なので、この問題が発生するのです。オブジェクトがない状態で問題が発生した場合、おそらくインジケーターのコードに他の負荷がかかっている可能性があります。ローカライズして除外するようにすれば、よくなるはずです。

 
Stanislav Korotky: この挙動は、オブジェクトがたくさんあるときに観察されます。オブジェクトがないときは、すべてが多かれ少なかれ普通である。インジケーターバッファも、ティックが来たとき(更新中のオブジェクトがあるとき)、点滅することがある。これはMT5の特徴だと思うのですが、インディケータがシンボル/タイムスタンプごとに別々のスレッドになっていることと、GUIスレッドで画像を更新するために同期が必要になり、MT4のシングルスレッド・モデルと比較して遅さが増していることが関係していると思います。オブジェクトを扱う のは最もリソースを消費する操作なので、この問題が発生するのです。オブジェクトがない状態で問題が発生した場合、おそらくインジケーターのコードに他の負荷がかかっている可能性があります。ローカライズして除外するようにすれば、よくなるはずです。

このインジケータはオブジェクトでは動作しないので、その可能性は排除できます。ソフトウェアのコードに関係している可能性は認めますが、上に引用したコードは非常にシンプルで、どこで失敗しているのかがどうしてもわかりません。誰が悪いのか、どうすればいいのか、主な疑問はまだ解決されていない。何か対処法があるのか、それとも原理的にどうしようもないのか。もしかしたら、ここで開発者が発言するかもしれませんね

ちなみに、今は朝で、証券取引所はまだ開いていないので、すべての指標は棒立ちで、「データウィンドウ」のバッファは再描画されず、ラインは点滅していません。

 

さて、交換が始まって、またまた同じような映画ばかり。インジケーターのデータがティックごとに再計算されるのは理解できますが、なぜデータウィンドウのテーブルからすべてのインジケーターバッファを削除しなければならないのでしょうか?自分たちの価値観をきちんとアップデートするだけでも十分ではないでしょうか?例えば、Close priceで行う方法です。結局のところ、新しいティックでは、クローズ価格は、更新された値で再び表示するために、データウィンドウから消えることはないのですか?では、なぜインジケーターバッファが しばらく消えてしまうのでしょうか?また、一部の指標は現在のゼロバーでは再計算されませんが、「データウィンドウ」にも再描画されるのはなぜですか?

まだ、有識者からの回答、せめてリンクを期待しています。

 

何か問題があるようだ。私の質問はもう関係なく、解決策がとっくに見つかっているのか、それとも間違ったスレッドで質問してしまったのか、どちらかでしょう。もしかしたら、これ以上詳しい人がフォーラムにいないのか、開発者がこのセクションを監視していないのか?
データウィンドウ」のインジケーターバッファが しばらく消えないのはなぜですか?これは原理的に直らないのか、直るのか?上記のコードのどこがおかしいのでしょうか?また、インジケータは現在のバーでその値を再計算しません。

理由: