MT5 değişim terminalinde göstergeler (çizgiler, oklar, histogramlar) neden titriyor?

 

Hem ana grafik penceresinde hem de ayrı bir pencerede göstergelerin (çizgiler, oklar, histogramlar) titremesine ne sebep olabilir? Gösterge yeniden çiziliyor gibi görünüyor ve şu anda veri penceresinde etiketler ve arabellek değerleri bir saniye listeden kayboluyor ve ardından listede yeniden görünüyor. Kodda yanlış bir şey mi var?

Ayrıca, bu sadece MT5 değişim terminalinde gözlenir, bu MT4'te gözlenmez.

 
Eugene Myzrov :

Hem ana grafik penceresinde hem de ayrı bir pencerede göstergelerin (çizgiler, oklar, histogramlar) titremesine ne sebep olabilir? Gösterge yeniden çiziliyor gibi görünüyor ve şu anda veri penceresinde etiketler ve arabellek değerleri bir saniye listeden kayboluyor ve ardından listede yeniden görünüyor. Kodda yanlış bir şey mi var?

Ayrıca, bu sadece MT5 terminalinde gözlenir, bu MT4'te gözlenmez.


Falcılık sunuyor musunuz? iletişime geç ;)
 
Vitalie Postolache : teklif ediyorsun? iletişime geç ;)

Hayır, sadece bir arama soruma cevap vermedi.
Belki de neden titremenin sadece MT5 değişim terminalinde gözlemlendiğini biliyorsunuzdur, MT5 forex terminalinde titreme yok mu?

 
Eugene Myzrov :

Hayır, sadece bir arama soruma cevap vermedi.
Belki de neden titremenin sadece MT5 değişim terminalinde gözlemlendiğini biliyorsunuzdur, MT5 forex terminalinde titreme yok mu?


Neden tüm göstergeler titriyor? MT5 aynıdır, yalnızca hesap türü farklılık gösterebilir - exchange veya forex.
 
Vitalie Postolache : Neden tüm göstergeler titriyor? MT5 aynıdır, yalnızca hesap türü farklılık gösterebilir - exchange veya forex.

Forex ve döviz terminali MT5 hakkında kısalık için konuşurken demek istediğim buydu. Daha tam olarak sorun şuna benziyor. Bir forex komisyoncusuna bağlandığında, MT5 terminalindeki göstergeler titremez ve bir borsa komisyoncusuna bağlandığında titreme görülür, ayrıca veri penceresinde gösterge arabelleklerinin etiketleri ve değerleri kaybolur bir veya iki saniye için.

Tüm göstergelerin bu şekilde davranıp davranmadığı sorusuna gelince, söyleyemem. Asılsız kalmamak için şimdi bir tane yayınlayayım.

 
Bu, birkaç genelleme ile AO göstergesinden türetilen AOM göstergesidir.
 //+-----------------------------------------------------------------------------------------------------+
//| 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);
}
 
Şimdi, bir borsa komisyoncusuna (RTS-6.17 aracı) bağlandığımda bu göstergenin biraz çalıştığını izledim, şimdiye kadar bununla ilgili iki sorundan sadece birini fark ettim. Bir süre için veri penceresindeki veriler kaybolur, yani. iki AOM gösterge tamponunun etiketleri ve değerleri.
 

Birçok nesne olduğunda bu davranışı gözlemliyorum. Hiçbir nesne olmadığında, her şey az çok normaldir. Gösterge arabellekleri bazen bir onay işareti geldiğinde (güncelleme nesnelerinin varlığında) yanıp sönebilir.

Bunun MT5'in bir özelliği olduğuna inanıyorum, çünkü göstergeler artık her sembol / zaman dilimi için ayrı iş parçacıklarında ve GUI iş parçacığındaki resmi güncellemek için senkronizasyon gerekiyor ve bu, tek iş parçacıklı ile karşılaştırıldığında frenler ekliyor MT4 modeli. Nesnelerle çalışmak en yoğun kaynak gerektiren işlemdir, çünkü bu şekilde ortaya çıkar. Sorun nesneler olmadan gözlemleniyorsa, muhtemelen gösterge kodunda başka bir yükleme var. Yerelleştirmeye ve dışlamaya çalışırsanız, daha iyi olması gerekir.

 
Stanislav Korotky : Birçok nesne olduğunda bu davranışı gözlemliyorum. Hiçbir nesne olmadığında, her şey az çok normaldir. Gösterge arabellekleri bazen bir onay işareti geldiğinde (güncelleme nesnelerinin varlığında) yanıp sönebilir. Bunun MT5'in bir özelliği olduğuna inanıyorum, çünkü göstergeler artık her sembol / zaman dilimi için ayrı iş parçacıklarında ve GUI iş parçacığındaki resmi güncellemek için senkronizasyon gerekiyor ve bu, tek iş parçacıklı ile karşılaştırıldığında frenler ekliyor MT4 modeli. Nesnelerle çalışmak en yoğun kaynak gerektiren işlemdir, çünkü bu şekilde ortaya çıkar. Sorun nesneler olmadan gözlemleniyorsa, muhtemelen gösterge kodunda başka bir yükleme var. Yerelleştirmeye ve dışlamaya çalışırsanız, daha iyi olması gerekir.

Gösterge nesnelerle çalışmaz, bu nedenle bu neden göz ardı edilebilir. Bunun m.b olduğunu kabul ediyorum. program koduyla ilgili ama kodu biraz daha yüksek verdim, çok basit ve sadece başarısız olabileceği bir yer göremiyorum. Şimdiye kadarki ana sorular cevapsız kaldı - kim suçlu ve ne yapmalı? Bununla bir şekilde başa çıkılabilir mi yoksa prensipte düzeltilemez mi? M.b. geliştiriciler ağır sözlerini burada mı söyleyecekler ?!

Bu arada sabah oldu, borsa henüz açılmadı, yani tüm göstergeler rayında, "Veri Penceresi"ndeki arabellekler yeniden çizilmedi, çizgiler titremiyor.

 

Eh, borsa açıldı ve yine her şey aynı zamanda bir film. Yine de, her işaretin gelişiyle gösterge verilerinin yeniden hesaplandığını anlayabiliyorum, ancak neden tüm gösterge arabelleklerini veri penceresi tablosundan silelim? Sadece değerlerini yerinde güncellemek yeterli değil mi? Örneğin, Kapanış fiyatı ile yapılma şekli. Ne de olsa, yeni bir işaretin ortaya çıkmasıyla, Kapat'ın kapanış fiyatı, güncellenmiş bir değerle yeniden görünecek şekilde veri penceresinden kaybolmuyor mu? O halde gösterge arabellekleri neden bir süreliğine kayboluyor? Ek olarak, bazı göstergeler mevcut sıfır çubuğunda yeniden hesaplanmaz, ancak bir nedenden dolayı "Veri Penceresinde" de yeniden çizilirler mi?

Hala bilgili kişilerden bir cevap veya en azından bir bağlantı bekliyorum.

 

Bir şeyler yanlış gibi görünüyor. Ya sorum alakalı olmaktan çıktı ve çözüm uzun zamandır bulundu ya da yanlış başlıkta sordum. Belki forumda bilgili insanlar vardır veya geliştiriciler forumun bu bölümünü izlemiyor mu?
Gösterge arabellekleri neden "Veri Penceresinde" bir süreliğine kayboluyor? Temelde tedavi edilmiyor mu yoksa düzeltilebilir mi? Yukarıdaki kodda yanlış olan nedir? Ayrıca gösterge, mevcut çubuktaki değerini yeniden hesaplamaz.

Neden: