Eugene Myzrov:
不,只是搜索结果没有回答我感兴趣的问题。
也许你知道为什么只在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); }
Stanislav Korotky: 我观察到,当有许多对象时,会有这种行为。当没有物体时,一切或多或少都是正常的。指示器缓冲区有时也会闪动,当有刻度线出现时(在有更新对象的情况下)。我认为这是MT5的一个特点,这与现在指标在每个符号/时间戳的独立线程中有关,在GUI线程中更新图像需要同步,与MT4的单线程模式相比,它增加了速度。处理对象 是最耗费资源的操作,这就是为什么它会导致这个问题。如果在没有对象的情况下观察到这个问题,也许在指标的代码中存在一些其他的加载。如果你试着把它本地化并排除在外,它应该会变得更好。
该指标对物体不起作用,所以可以排除这种情况。我承认,这可能与软件代码有关,但我上面引用的代码非常简单,我实在看不出它在哪里出了问题。主要的问题仍然没有答案--谁该受到责备,该怎么做?有什么办法可以处理它,或者它在原则上是不可救药的?也许开发商在这里会有自己的说法!
对了,现在是早上,证券交易所还没有开盘,所以所有的指标都像棍子一样站着,"数据窗口 "中的缓冲区没有重绘,线条没有闪烁。
指标(线、箭头、柱状图)在主图表窗口或单独窗口中闪烁,这与什么有关?给人的印象是,指标被重新绘制,同时标记和缓冲值从列表中消失一秒钟,然后又出现在列表中。程序代码有问题吗?
这只在MT5终端观察到,在MT4中没有观察到。