Por que os indicadores (linhas, setas, histogramas) estão cintilando no terminal MT5?

 

A que pode estar relacionado o piscar dos indicadores (linhas, setas, histogramas), tanto na janela principal do gráfico como em uma janela separada? A impressão é que o indicador é redesenhado e, ao mesmo tempo, as marcas e os valores tampão desaparecem da lista por um segundo, e depois aparecem novamente na lista. Há algo errado com o código do programa?

Isto só é observado no terminal MT5, não é observado no MT4.

 
Eugene Myzrov:

A que a cintilação dos indicadores (linhas, setas, histogramas) pode estar relacionada, tanto na janela principal do gráfico quanto em uma janela separada? A impressão é que o indicador é redesenhado e, ao mesmo tempo, na janela de dados, as etiquetas e os valores tampão desaparecem da lista por um segundo e, em seguida, reaparecem na lista. Algo errado no código do programa?

E isto só é observado no terminal MT5, não é observado no MT4.


Você está sugerindo que tentemos adivinhar? Esteja à vontade para entrar em contato comigo ; )
 
Vitalie PostolacheVocê está propondo um exercício de adivinhação? De nada; )

Não, é que a busca não respondeu à pergunta que me interessa.
Talvez você saiba por que a cintilação só é observada no terminal de câmbio MT5, no terminal MT5 a cintilação não ocorre?

 
Eugene Myzrov:

Não, é que a busca não respondeu à pergunta que me interessava.
Talvez você saiba porque a cintilação é observada no terminal de câmbio MT5, no terminal MT5 não há cintilação?


Todos os indicadores estão piscando? O MT5 é o mesmo, somente o tipo de conta pode ser diferente - câmbio ou divisas.
 
Vitalie PostolacheQue todos os indicadores cintilam? O MT5 é o mesmo, somente o tipo de conta pode ser diferente - câmbio ou divisas.

Foi o que eu quis dizer quando mencionei o terminal de câmbio e bolsa MT5 para abreviar. Um problema mais completo soa como este. Quando me conecto à corretora, os indicadores no terminal MT5 não piscam, mas quando me conecto à corretora, vejo piscar e também as marcas e valores dos indicadores desaparecem na janela de dados por um segundo ou dois segundos.

Quanto à questão de saber se todos os indicadores se comportam dessa forma, não posso dizê-lo. Deixe-me colocar um agora, para não ser infundado.

 
Este é um indicador "AOM" derivado do indicador "AO" com generalizações menores.
//+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
Agora eu tenho observado este indicador por um tempo quando conectado a um corretor de bolsa (ferramenta RTS-6.17) e até agora notei apenas um dos dois problemas indicados. Durante algum tempo, os dados na janela de dados, ou seja, as etiquetas e os valores dos dois amortecedores do indicador AOM, desaparecem.
 

Eu observo este comportamento quando há muitos objetos. Quando não há objetos, tudo é mais ou menos normal. Os amortecedores indicadores também podem piscar às vezes quando um tique vem (quando há atualização de objetos).

Acho que esta é uma característica do MT5, ela está conectada com o fato de que agora os indicadores estão em roscas separadas para cada símbolo/carimbo de hora e para atualizar a imagem na rosca GUI ela precisa de sincronização, o que acrescenta lentidão em comparação com o modelo de rosca única do MT4. Trabalhar com objetos é a operação mais intensiva em recursos, e é por isso que causa este problema. Se o problema for observado sem objetos, talvez haja algum outro carregamento no código do indicador. Se você tentar localizá-la e excluí-la, ela deverá melhorar.

 
Stanislav Korotky: Eu observo este comportamento quando há muitos objetos. Quando não há objetos, tudo é mais ou menos normal. Os amortecedores indicadores às vezes também podem piscar quando um tique vem (quando há atualização de objetos). Acho que esta é uma característica do MT5, ela está conectada com o fato de que agora os indicadores estão em roscas separadas para cada símbolo/máquina e para atualizar uma imagem na rosca GUI ela precisa de sincronização, e adiciona lentidão em comparação com o modelo de rosca única do MT4. Trabalhar com objetos é a operação mais intensiva em recursos, e é por isso que causa este problema. Se o problema for observado sem objetos, talvez haja algum outro carregamento no código do indicador. Se você tentar localizá-la e excluí-la, ela deverá melhorar.

O indicador não funciona com objetos, portanto isso pode ser descartado. Admito que pode estar relacionado ao código do software, mas o código que citei acima é muito simples e não consigo ver onde ele está falhando. As principais questões ainda permanecem sem resposta - quem é o culpado e o que fazer? Existe alguma maneira de lidar com isso ou é incorrigível em princípio? Talvez os desenvolvedores tenham uma palavra a dizer aqui!

A propósito, é de manhã, a bolsa de valores ainda não abriu, então todos os indicadores estão de pé como paus, os tampões na "Janela de Dados" não estão redesenhados, as linhas não piscam.

 

Bem, a troca foi aberta, e novamente o mesmo filme. Posso entender que os dados indicadores são recalculados a cada tick, mas por que eu deveria remover todos os buffers indicadores da tabela da janela de dados? Não é suficiente apenas atualizar seus valores no lugar? Por exemplo, a forma como é feito com o preço Fechar. Afinal, com um novo tick o preço Fechar não desaparece da janela de dados para aparecer novamente com o valor atualizado? Por que então os amortecedores indicadores desaparecem por algum tempo? Além disso, alguns indicadores não são recalculados na barra zero atual, mas por que eles também são redesenhados na "Janela de Dados"?

Ainda esperando uma resposta de pessoas conhecedoras, ou pelo menos um link.

 

Parece haver algo errado. Ou minha pergunta não é mais relevante e há muito tempo foi encontrada uma solução, ou eu a coloquei na linha errada. Talvez não haja mais pessoas conhecedoras no fórum, ou os desenvolvedores não monitoram esta seção do fórum?
Por que na "Janela de Dados" os buffers indicadores desaparecem por algum tempo? Isto não é consertado em princípio ou é consertável? O que há de errado no código acima? E o indicador não recalcula seu valor na barra atual.