Warum flackern die Indikatoren (Linien, Pfeile, Histogramme) auf dem MT5-Terminal?

 

Worauf kann sich das Blinken der Indikatoren (Linien, Pfeile, Histogramme) beziehen, sowohl im Hauptfenster des Charts als auch in einem separaten Fenster? Es entsteht der Eindruck, dass der Indikator neu gezeichnet wird und gleichzeitig die Markierungen und die Pufferwerte für eine Sekunde aus der Liste verschwinden, um dann wieder in der Liste zu erscheinen. Ist etwas mit dem Programmcode nicht in Ordnung?

Dies ist nur auf dem MT5-Terminal zu beobachten, nicht aber auf dem MT4.

 
Eugene Myzrov:

Womit kann das Flackern der Indikatoren (Linien, Pfeile, Histogramme) zusammenhängen, sowohl im Hauptfenster des Charts als auch in einem separaten Fenster? Es entsteht der Eindruck, dass der Indikator neu gezeichnet wird und gleichzeitig im Datenfenster die Beschriftungen und Pufferwerte für eine Sekunde aus der Liste verschwinden, um dann wieder in der Liste zu erscheinen. Ist etwas mit dem Programmiercode nicht in Ordnung?

Und dies wird nur im MT5-Terminal beobachtet, nicht aber im MT4.


Wollen Sie damit sagen, dass wir versuchen sollen, zu raten? Sie können mich gerne kontaktieren ; )
 
Vitalie PostolacheSchlagen Sie eine Wahrsagerei vor? Gern geschehen ; )

Nein, es ist nur so, dass die Suche die Frage, die mich interessiert, nicht beantwortet hat.
Wissen Sie vielleicht, warum das Flimmern nur im MT5-Börsenterminal zu beobachten ist, im MT5-Forex-Terminal tritt das Flimmern nicht auf?

 
Eugene Myzrov:

Nein, die Suche hat nur nicht die Frage beantwortet, die mich interessiert hat.
Wissen Sie vielleicht, warum das Flimmern nur im MT5-Börsenterminal auftritt , im MT5-Forex-Terminal jedoch nicht?


Flackern alle Anzeigen? Der MT5 ist derselbe, nur der Kontotyp kann unterschiedlich sein - Börse oder Forex.
 
Vitalie PostolacheDass gerade alle Anzeigen flackern? Der MT5 ist derselbe, nur der Kontotyp kann unterschiedlich sein - Börse oder Forex.

Das habe ich gemeint, als ich das Devisen- und Börsenterminal MT5 kurz erwähnt habe. Ein umfassenderes Problem klingt wie folgt. Wenn ich mich mit einem Forex-Broker verbinde, flackern die Indikatoren im MT5-Terminal nicht, aber wenn ich mich mit einem Börsenmakler verbinde, sehe ich ein Flackern und auch die Puffermarkierungen der Indikatoren und die Werte verschwinden für ein oder zwei Sekunden im Datenfenster.

Die Frage, ob sich alle Indikatoren so verhalten, kann ich nicht beantworten. Ich werde jetzt einen Beitrag schreiben, damit er nicht unsubstantiiert ist.

 
Es handelt sich um einen "AOM"-Indikator, der vom "AO"-Indikator abgeleitet ist und geringfügige Verallgemeinerungen enthält.
//+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
Nun habe ich diesen Indikator eine Zeit lang beobachtet, wenn er mit einem Börsenmakler (Tool RTS-6.17) verbunden ist, und bisher habe ich nur eines der beiden genannten Probleme festgestellt. Für einige Zeit verschwinden die Daten im Datenfenster, d.h. die Beschriftungen und Werte der beiden Puffer des AOM-Indikators.
 

Ich beobachte dieses Verhalten, wenn es viele Objekte gibt. Wenn es keine Objekte gibt, ist alles mehr oder weniger normal. Indikatorpuffer können auch manchmal blinken, wenn ein Tick kommt (wenn es Objekte gibt, die aktualisiert werden).

Ich denke, dies ist eine Funktion von MT5, es ist mit der Tatsache verbunden, dass jetzt Indikatoren in separaten Threads für jedes Symbol/Zeitstempel und für die Aktualisierung des Bildes in GUI-Thread es braucht Synchronisation, die Langsamkeit im Vergleich zu den einzelnen Thread-Modell von MT4 fügt. Die Arbeit mit Objekten ist der ressourcenintensivste Vorgang, weshalb er dieses Problem verursacht. Wenn das Problem auch ohne Objekte auftritt, liegt vielleicht eine andere Belastung im Code des Indikators vor. Wenn Sie versuchen, es zu lokalisieren und auszuschließen, sollte es besser werden.

 
Stanislav Korotky: Ich beobachte dieses Verhalten, wenn es viele Objekte gibt. Wenn es keine Objekte gibt, ist alles mehr oder weniger normal. Indikatorpuffer können manchmal auch blinken, wenn ein Tick kommt (in Gegenwart von aktualisierenden Objekten). Ich denke, dies ist eine Funktion von MT5, es ist mit der Tatsache verbunden, dass jetzt Indikatoren in separaten Threads für jedes Symbol/Zeitstempel und für die Aktualisierung eines Bildes in GUI-Thread es braucht Synchronisation, und es fügt Langsamkeit im Vergleich zu den einzelnen Thread-Modell von MT4. Die Arbeit mit Objekten ist der ressourcenintensivste Vorgang, weshalb er dieses Problem verursacht. Wenn das Problem auch ohne Objekte auftritt, liegt vielleicht eine andere Belastung im Code des Indikators vor. Wenn Sie versuchen, es zu lokalisieren und auszuschließen, sollte es besser werden.

Der Indikator funktioniert nicht mit Objekten, das kann also ausgeschlossen werden. Ich gebe zu, dass es mit dem Softwarecode zusammenhängen könnte, aber der Code, den ich oben zitiert habe, ist sehr einfach, und ich kann einfach nicht sehen, wo er versagt. Die wichtigsten Fragen sind noch immer unbeantwortet: Wer ist schuld und was ist zu tun? Gibt es irgendeine Möglichkeit, damit umzugehen, oder ist es prinzipiell unverbesserlich? Vielleicht werden die Entwickler hier ein Wörtchen mitreden!

Übrigens, es ist Morgen, die Börse hat noch nicht geöffnet, also stehen alle Indikatoren wie Stöcke, die Puffer im "Datenfenster" werden nicht neu gezeichnet, die Linien blinken nicht.

 

Nun, die Börse öffnete, und wieder alle den gleichen Film. Ich kann verstehen, dass die Indikatordaten bei jedem Tick neu berechnet werden, aber warum sollte ich alle Indikatorpuffer aus der Tabelle im Datenfenster entfernen? Reicht es nicht aus, ihre Werte vor Ort zu aktualisieren? Zum Beispiel die Art und Weise, wie es mit dem Schlusskurs gemacht wird. Denn bei einem neuen Tick verschwindet der Schlusskurs nicht aus dem Datenfenster, um mit dem aktualisierten Wert wieder zu erscheinen? Warum verschwinden dann die Indikatorpuffer für eine gewisse Zeit? Außerdem werden einige Indikatoren nicht auf dem aktuellen Nullbalken neu berechnet, aber warum werden sie auch im "Datenfenster" neu gezeichnet?

Ich hoffe immer noch auf eine Antwort von sachkundigen Personen oder zumindest auf einen Link.

 

Da scheint etwas nicht zu stimmen. Entweder ist meine Frage nicht mehr relevant und es wurde längst eine Lösung gefunden, oder ich habe sie im falschen Thread gestellt. Vielleicht gibt es keine sachkundigeren Leute im Forum, oder die Entwickler überwachen diesen Bereich des Forums nicht?
Warum verschwinden im "Datenfenster" die Indikatorpuffer für eine gewisse Zeit? Ist dieses Problem nicht grundsätzlich gelöst, oder ist es lösbar? Was ist an dem obigen Code falsch? Und der Indikator berechnet seinen Wert nicht für den aktuellen Balken neu.