いや、検索しても私の興味のある質問に答えられないだけだった。
MT5為替ターミナルでのみ フリッカーが観測され、MT5為替ターミナルでは フリッカーが観測されない理由をご存知でしょうか?
すべてのインジケーターが点滅していませんか?MT5も同じで、口座の種類が取引所かFXか違うだけかもしれません。
//+-----------------------------------------------------------------------------------------------------+ //| 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); }
この挙動は、オブジェクトがたくさんあるときに観察されます。オブジェクトがないときは、すべてが多かれ少なかれ普通である。インジケーターバッファは、ティックが来たとき(更新中のオブジェクトがあるとき)に点滅することがあります。
これはMT5の特徴だと思うのですが、インディケータがシンボル/タイムスタンプごとに別々のスレッドになり、GUIスレッドの画像を更新するために同期が必要になり、MT4のシングルスレッド・モデルと比較して遅くなっていることと関係があると思います。オブジェクトを扱う のは最もリソースを消費する操作なので、この問題が発生するのです。オブジェクトがない状態で問題が発生した場合、おそらくインジケーターのコードに他の負荷がかかっている可能性があります。ローカライズして除外するようにすれば、よくなるはずです。
このインジケータはオブジェクトでは動作しないので、その可能性は排除できます。ソフトウェアのコードに関係している可能性は認めますが、上に引用したコードは非常にシンプルで、どこで失敗しているのかがどうしてもわかりません。誰が悪いのか、どうすればいいのか、主な疑問はまだ解決されていない。何か対処法があるのか、それとも原理的にどうしようもないのか。もしかしたら、ここで開発者が発言するかもしれませんね
ちなみに、今は朝で、証券取引所はまだ開いていないので、すべての指標は棒立ちで、「データウィンドウ」のバッファは再描画されず、ラインは点滅していません。
さて、交換が始まって、またまた同じような映画ばかり。インジケーターのデータがティックごとに再計算されるのは理解できますが、なぜデータウィンドウのテーブルからすべてのインジケーターバッファを削除しなければならないのでしょうか?自分たちの価値観をきちんとアップデートするだけでも十分ではないでしょうか?例えば、Close priceで行う方法です。結局のところ、新しいティックでは、クローズ価格は、更新された値で再び表示するために、データウィンドウから消えることはないのですか?では、なぜインジケーターバッファが しばらく消えてしまうのでしょうか?また、一部の指標は現在のゼロバーでは再計算されませんが、「データウィンドウ」にも再描画されるのはなぜですか?
まだ、有識者からの回答、せめてリンクを期待しています。
何か問題があるようだ。私の質問はもう関係なく、解決策がとっくに見つかっているのか、それとも間違ったスレッドで質問してしまったのか、どちらかでしょう。もしかしたら、これ以上詳しい人がフォーラムにいないのか、開発者がこのセクションを監視していないのか?
データウィンドウ」のインジケーターバッファが しばらく消えないのはなぜですか?これは原理的に直らないのか、直るのか?上記のコードのどこがおかしいのでしょうか?また、インジケータは現在のバーでその値を再計算しません。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
インジケーター(ライン、矢印、ヒストグラム)の点滅は、メインチャートまたは別ウィンドウでどのような関係があるのでしょうか?インジケータが再描画されると同時に、マークとバッファの値が一瞬リストから消え、再びリストに表示される印象です。プログラムコードに何か問題があるのでしょうか?
これはMT5ターミナルでのみ観測され、MT4では観測されません。