¿Por qué los indicadores (líneas, flechas, histogramas) parpadean en el terminal MT5?

 

¿Con qué puede relacionarse el parpadeo de los indicadores (líneas, flechas, histogramas), tanto en la ventana principal del gráfico como en una ventana aparte? Da la impresión de que el indicador se vuelve a dibujar y al mismo tiempo las marcas y los valores de la memoria intermedia desaparecen de la lista durante un segundo, y luego vuelven a aparecer en la lista. ¿Hay algún problema con el código del programa?

Esto sólo se observa en el terminal MT5, no se observa en MT4.

 
Eugene Myzrov:

¿A qué puede deberse el parpadeo de los indicadores (líneas, flechas, histogramas), tanto en la ventana principal del gráfico como en una ventana aparte? La impresión es que el indicador se vuelve a dibujar, y al mismo tiempo en la ventana de datos las etiquetas y los valores del buffer desaparecen de la lista durante un segundo, y luego vuelven a aparecer en la lista. ¿Hay algún problema con el código de programación?

Y esto sólo se observa en el terminal MT5, no se observa en MT4.


¿Está sugiriendo que tratemos de adivinar? No dude en ponerse en contacto conmigo ; )
 
Vitalie Postolache¿Estás proponiendo un ejercicio de adivinación? De nada ; )

No, es que la búsqueda no responde a la pregunta que me interesa.
¿Quizás sepas por qué el parpadeo se observa sólo en el terminal de intercambio MT5, en el terminal de divisas MT5 el parpadeo no se produce?

 
Eugene Myzrov:

No, la búsqueda no respondía a la pregunta que me interesaba.
¿Quizás sepas por qué el parpadeo sólo se observa en el terminal de intercambio MT5, en el terminal de divisas MT5 no hay parpadeo?


¿Todos los indicadores parpadean? La MT5 es la misma, sólo que el tipo de cuenta puede ser diferente: exchange o forex.
 
Vitalie Postolache¿Que directamente todos los indicadores parpadean? La MT5 es la misma, sólo que el tipo de cuenta puede ser diferente: exchange o forex.

A eso me refería cuando mencionaba el terminal de forex y bolsa MT5 para abreviar. Un problema más completo suena así. Cuando me conecto al broker de forex los indicadores en el terminal MT5 no parpadean, pero cuando me conecto al broker de bolsa veo parpadeos y también las marcas del buffer de los indicadores y los valores desaparecen en la ventana de datos durante un segundo o dos.

En cuanto a la pregunta de si todos los indicadores se comportan así, no puedo decirlo. Permítanme que publique uno ahora, para que no quede sin sustento.

 
Se trata de un indicador "AOM" derivado del indicador "AO" con pequeñas generalizaciones.
//+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
Ahora he observado este indicador durante un tiempo cuando está conectado a un corredor de bolsa (herramienta RTS-6.17) y hasta ahora sólo he notado uno de los dos problemas indicados. Durante algún tiempo, los datos de la ventana de datos, es decir, las etiquetas y los valores de los dos búferes del indicador AOM desaparecen.
 

Observo este comportamiento cuando hay muchos objetos. Cuando no hay objetos, todo es más o menos normal. Los búferes de los indicadores también pueden parpadear a veces cuando llega un tic (cuando hay objetos que se actualizan).

Creo que esto es una característica de MT5, está conectado con el hecho de que ahora los indicadores están en hilos separados para cada símbolo / marca de tiempo y para la actualización de la imagen en el hilo GUI necesita sincronización, lo que añade lentitud en comparación con el modelo de un solo hilo de MT4. Trabajar con objetos es la operación que más recursos consume, por eso causa este problema. Si el problema se observa sin objetos, quizás haya alguna otra carga en el código del indicador. Si intentas localizarlo y excluirlo, debería mejorar.

 
Stanislav Korotky: Observo este comportamiento cuando hay muchos objetos. Cuando no hay objetos, todo es más o menos normal. Los búferes de los indicadores a veces pueden parpadear también, cuando llega un tic (cuando hay objetos que se actualizan). Creo que esto es una característica de MT5, está conectado con el hecho de que ahora los indicadores están en hilos separados para cada símbolo / marca de tiempo y para la actualización de una imagen en el hilo de la interfaz gráfica de usuario que necesita la sincronización, y añade lentitud en comparación con el modelo de un solo hilo de MT4. Trabajar con objetos es la operación que más recursos consume, por eso causa este problema. Si el problema se observa sin objetos, quizás haya alguna otra carga en el código del indicador. Si intentas localizarlo y excluirlo, debería mejorar.

El indicador no funciona con objetos, así que se puede descartar. Admito que puede estar relacionado con el código del software, pero el código que he citado arriba es muy sencillo y no veo dónde está fallando. Las principales preguntas siguen sin respuesta: ¿quién es el culpable y qué hay que hacer? ¿Existe alguna forma de solucionarlo o en principio es incorregible? Tal vez los desarrolladores den su opinión al respecto.

Por cierto, es por la mañana, la bolsa aún no ha abierto, por lo que todos los indicadores están parados como palos, los buffers en la "Ventana de Datos" no se redibujan, las líneas no parpadean.

 

Bueno, el intercambio se abrió, y de nuevo toda la misma película. Puedo entender que los datos del indicador se recalculen con cada tick, pero ¿por qué debería eliminar todos los topes del indicador de la tabla de la ventana de datos? ¿No basta con actualizar sus valores en el lugar? Por ejemplo, la forma en que se hace con el precio de cierre. Al fin y al cabo, con un nuevo tick el precio de Cierre no desaparece de la ventana de datos para volver a aparecer con el valor actualizado? ¿Por qué entonces desaparecen los topes indicadores durante algún tiempo? Además, algunos indicadores no se recalculan en la barra cero actual, pero ¿por qué se redibujan también en la "Ventana de datos"?

Sigo esperando una respuesta de gente entendida, o al menos un enlace.

 

Parece que hay algo que no funciona. O bien mi pregunta ya no es pertinente y hace tiempo que se encontró una solución, o bien la hice en el hilo equivocado. ¿Quizás no hay más gente con conocimientos en el foro, o los desarrolladores no supervisan esta sección del foro?
¿Por qué en la "Ventana de datos" desaparecen los topes de los indicadores durante algún tiempo? En principio, ¿no se arregla o se puede arreglar? ¿Qué hay de malo en el código anterior? Y el indicador no recalcula su valor en la barra actual.

Razón de la queja: