Perché gli indicatori (linee, frecce, istogrammi) lampeggiano nel terminale MT5?

 

A cosa può essere collegato il lampeggiare degli indicatori (linee, frecce, istogrammi), sia nella finestra principale del grafico che in una finestra separata? L'impressione è che l'indicatore venga ridisegnato e che allo stesso tempo i segni e i valori del buffer scompaiano dalla lista per un secondo, per poi ricomparire nella lista. C'è qualcosa di sbagliato nel codice del programma?

Questo si osserva solo nel terminale MT5, non si osserva in MT4.

 
Eugene Myzrov:

A cosa può essere collegato lo sfarfallio degli indicatori (linee, frecce, istogrammi), sia nella finestra principale del grafico che in una finestra separata? L'impressione è che l'indicatore venga ridisegnato, e allo stesso tempo nella finestra dei dati le etichette e i valori del buffer spariscono dalla lista per un secondo, e poi appaiono di nuovo nella lista. Qualcosa di sbagliato nel codice del programma?

E questo si osserva solo nel terminale MT5, non si osserva in MT4.


Sta suggerendo di provare a indovinare? Sentitevi liberi di contattarmi ; )
 
Vitalie PostolacheSta proponendo un esercizio di cartomanzia? Sei il benvenuto ; )

No, è solo che la ricerca non ha risposto alla domanda che mi interessa.
Forse sapete perché il flicker si osserva solo nel terminale di scambio MT5, nel terminale forex MT5 il flicker non si verifica?

 
Eugene Myzrov:

No, la ricerca non ha risposto alla domanda che mi interessava.
Forse sapete perché il flicker si osserva solo nel terminale di scambio MT5, nel terminale forex MT5 non c'è flicker?


Tutti gli indicatori lampeggiano? La MT5 è la stessa, solo il tipo di conto può essere diverso - scambio o forex.
 
Vitalie PostolacheChe direttamente tutti gli indicatori sfarfallano? La MT5 è la stessa, solo il tipo di conto può essere diverso - scambio o forex.

Questo è quello che intendevo quando ho menzionato il terminale MT5 per il forex e la borsa in breve. Un problema più completo suona così. Quando mi connetto al broker forex gli indicatori nel terminale MT5 non sfarfallano, ma quando mi connetto al broker azionario vedo lo sfarfallio e anche i segni del buffer degli indicatori e i valori scompaiono nella finestra dei dati per un secondo o due.

Per quanto riguarda la domanda se tutti gli indicatori si comportano così, non posso dirlo. Permettetemi di postarne uno ora, per non essere infondato.

 
Questo è un indicatore "AOM" derivato dall'indicatore "AO" con piccole generalizzazioni.
//+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
Ora ho osservato questo indicatore per un po' quando è collegato a un agente di cambio (strumento RTS-6.17) e finora ho notato solo uno dei due problemi indicati. Per qualche tempo i dati nella finestra dei dati, cioè le etichette e i valori dei due buffer dell'indicatore AOM scompaiono.
 

Osservo questo comportamento quando ci sono molti oggetti. Quando non ci sono oggetti, tutto è più o meno normale. I buffer degli indicatori possono anche lampeggiare a volte quando arriva un tick (quando ci sono oggetti in aggiornamento).

Penso che questa sia una caratteristica di MT5, è collegata al fatto che ora gli indicatori sono in thread separati per ogni simbolo/timestamp e per aggiornare l'immagine nel thread della GUI è necessaria la sincronizzazione, che aggiunge lentezza rispetto al modello a thread singolo di MT4. Lavorare con gli oggetti è l'operazione che richiede più risorse, ecco perché causa questo problema. Se il problema si osserva senza oggetti, forse c'è qualche altro caricamento nel codice dell'indicatore. Se provate a localizzarlo ed escluderlo, dovrebbe migliorare.

 
Stanislav Korotky: Osservo questo comportamento quando ci sono molti oggetti. Quando non ci sono oggetti, tutto è più o meno normale. Anche i buffer degli indicatori a volte possono lampeggiare quando arriva un tick (quando ci sono oggetti in aggiornamento). Penso che questa sia una caratteristica di MT5, è collegata al fatto che ora gli indicatori sono in thread separati per ogni simbolo/timestamp e per aggiornare un'immagine nel thread della GUI è necessaria la sincronizzazione, e aggiunge lentezza rispetto al modello a thread singolo di MT4. Lavorare con gli oggetti è l'operazione che richiede più risorse, ecco perché causa questo problema. Se il problema si osserva senza oggetti, forse c'è qualche altro caricamento nel codice dell'indicatore. Se provate a localizzarlo ed escluderlo, dovrebbe migliorare.

L'indicatore non funziona con gli oggetti, quindi questo può essere escluso. Ammetto che potrebbe essere legato al codice del software, ma il codice che ho citato sopra è molto semplice e non riesco proprio a vedere dove sta fallendo. Le domande principali rimangono ancora senza risposta - di chi è la colpa e cosa fare? C'è un modo per affrontarlo o è incorreggibile in linea di principio? Forse gli sviluppatori potranno dire la loro qui!

A proposito, è mattina, la borsa non ha ancora aperto, quindi tutti gli indicatori sono fermi come bastoni, i buffer nella "Finestra dati" non vengono ridisegnati, le linee non lampeggiano.

 

Bene, lo scambio si è aperto, e di nuovo tutto lo stesso film. Posso capire che i dati degli indicatori siano ricalcolati ad ogni tick, ma perché dovrei rimuovere tutti i buffer degli indicatori dalla tabella della finestra dei dati? Non è sufficiente aggiornare i loro valori sul posto? Per esempio, il modo in cui si fa con il prezzo di chiusura. Dopo tutto, con un nuovo tick il prezzo di chiusura non scompare dalla finestra dei dati per apparire di nuovo con il valore aggiornato? Perché allora i buffer degli indicatori spariscono per qualche tempo? Inoltre, alcuni indicatori non vengono ricalcolati sulla barra zero corrente, ma perché vengono ridisegnati anche nella "Finestra dati"?

Spero ancora in una risposta da persone competenti, o almeno in un link.

 

Sembra che ci sia qualcosa che non va. O la mia domanda non è più rilevante e una soluzione è stata trovata da tempo, o l'ho posta nel thread sbagliato. Forse non ci sono persone più esperte sul forum, o gli sviluppatori non controllano questa sezione del forum?
Perché nella "Finestra dei dati" i buffer degli indicatori scompaiono per qualche tempo? Non è fissato in linea di principio o è risolvibile? Cosa c'è di sbagliato nel codice di cui sopra? E l'indicatore non ricalcola il suo valore sulla barra corrente.