为什么MT5终端中的指标(线、箭头、柱状图)会闪烁?

 

指标(线、箭头、柱状图)在主图表窗口或单独窗口中闪烁,这与什么有关?给人的印象是,指标被重新绘制,同时标记和缓冲值从列表中消失一秒钟,然后又出现在列表中。程序代码有问题吗?

这只在MT5终端观察到,在MT4中没有观察到。

 
Eugene Myzrov:

指标(线条、箭头、柱状图)的闪烁与什么有关,在主图表窗口和独立窗口中都是如此?给人的印象是,指标被重新绘制,同时在数据窗口 中,标签和缓冲区的值从列表中消失一秒钟,然后又出现在列表中。程序代码中有什么问题吗?

而且这只在MT5终端观察到,在MT4中没有观察到。


你是在建议我们尝试猜测吗?请随时与我联系; )
 
Vitalie Postolache你是在提议进行算命吗? 不客气; )

不,只是搜索结果没有回答我感兴趣的问题。
也许你知道为什么只在MT5交易终端观察到闪烁,而在MT5外汇终端没有发生闪烁?

 
Eugene Myzrov:

不,只是搜索结果没有回答我感兴趣的问题。
也许你知道为什么只在MT5交易所终端 观察到闪烁,而在MT5外汇终端 却没有闪烁?


所有指示灯都在闪烁吗?MT5是一样的,只是账户类型可能不同--交易所或外汇。
 
Vitalie Postolache那直截了当的所有指标都在闪烁?MT5是一样的,只是账户类型可能不同--交易所或外汇。

这就是我提到MT5外汇和股票交易终端的简称的意思。一个更完整的问题听起来是这样的。当我连接到外汇经纪商时,MT5终端的指标没有闪烁,但当我连接到股票经纪商时,我看到闪烁,而且指标的缓冲标记和数值在数据窗口 中消失了一两秒钟。

至于是否所有指标都有这样的表现,我不能这么说。现在让我贴一张,以免没有证据。

 
这是一个从 "AO "指标中衍生出来的 "AOM "指标,有一些小的概括。
//+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
现在,当连接到一个股票经纪人(工具RTS-6.17)时,我已经观察了这个指标一段时间,到目前为止,我只注意到两个问题中的一个。在一段时间内,数据窗口 中的数据,即AOM指标的两个缓冲区的标签和数值消失。
 

我观察到,当有许多对象时,会有这种行为。当没有物体时,一切或多或少都是正常的。指标缓冲区有时也会在刻度线到来时闪烁(当有对象更新时)。

我想这是MT5的一个特点,这与现在指标在每个符号/时间戳的独立线程中有关,在GUI线程中更新图片需要同步,与MT4的单线程模式相比,这增加了速度。处理对象 是最耗费资源的操作,这就是为什么它会导致这个问题。如果在没有对象的情况下观察到这个问题,也许在指标的代码中存在一些其他的加载。如果你试着把它本地化并排除在外,它应该会变得更好。

 
Stanislav Korotky: 我观察到,当有许多对象时,会有这种行为。当没有物体时,一切或多或少都是正常的。指示器缓冲区有时也会闪动,当有刻度线出现时(在有更新对象的情况下)。我认为这是MT5的一个特点,这与现在指标在每个符号/时间戳的独立线程中有关,在GUI线程中更新图像需要同步,与MT4的单线程模式相比,它增加了速度。处理对象 是最耗费资源的操作,这就是为什么它会导致这个问题。如果在没有对象的情况下观察到这个问题,也许在指标的代码中存在一些其他的加载。如果你试着把它本地化并排除在外,它应该会变得更好。

该指标对物体不起作用,所以可以排除这种情况。我承认,这可能与软件代码有关,但我上面引用的代码非常简单,我实在看不出它在哪里出了问题。主要的问题仍然没有答案--谁该受到责备,该怎么做?有什么办法可以处理它,或者它在原则上是不可救药的?也许开发商在这里会有自己的说法!

对了,现在是早上,证券交易所还没有开盘,所以所有的指标都像棍子一样站着,"数据窗口 "中的缓冲区没有重绘,线条没有闪烁。

 

好了,交流会开幕了,又都是同样的电影。我可以理解,指标数据在每个tick都要重新计算,但为什么要从数据窗口表中删除所有指标缓冲区?仅仅将他们的价值观念更新到位还不够吗?例如,以收盘价的方式进行。毕竟,在一个新的刻度线下,收盘价不会从数据窗口中消失,而是以更新的值再次出现?那为什么指标缓冲区 会消失一段时间?另外,有些指标没有在当前的零点栏上重新计算,但为什么它们也在 "数据窗口 "中重新绘制?

仍然希望有识之士提供答案,或至少提供一个链接。

 

似乎有些不对劲。要么是我的问题不再有意义,早已找到了解决方案,要么是我在错误的主题中问了这个问题。也许论坛上没有更多的有识之士,或者开发者不监督论坛的这一部分?
为什么在 "数据窗口 "中,指标缓冲区 在一段时间内消失?这在原则上是不能解决的,还是可以解决的?上面的代码有什么问题?而且该指标不会在当前柱状图上重新计算其数值。