Tuval harika! - sayfa 20

 
Anatoli Kazharski :

Bir sınır var. 512'ye kadar gösterge tamponu yapılabilir >>> https://www.mql5.com/en/docs/indicators

Teşekkür ederim.
Evet, yüzlerce gösterge tamponundan sonra, kodun uzunluğuna ek olarak, korkunç bir hafıza kaybı da olacaktır. Benim versiyonumda, boyut ile bir dizi kullanılır: ekrandaki sayı çubuğu + maks. dönem.
 
Nikolai Semko :

Canvas'ta uygulanan yüzlerce hareketli ortalamanın ultra hızlı göstergesi.

100 MA satırı (nokta adım 10) - hesaplama ve görüntüleme süresi - 4-7 milisaniye


1000 MA satırı (dönem adım 1) - hesaplama ve görüntüleme süresi - 20-30 milisaniye


Kod fazla test edilmedi. Hatalar olabilir. Yalnızca bir piksel kalınlığında bir çubuk için uygulanır (zorla böyle bir ölçeğe çevrilir). Ayrıca, ekran yenileme hızı optimize edilmemiş. Tüm satırlar hesaplanır ve her onay işareti üzerinde tam olarak görüntülenir.

Ortalama basiti nasıl anladınız? Ve şimdi üstel için aynı olurdu.

 
Dmitry Fedoseev :

Ortalama basiti nasıl anladınız? Ve şimdi üstel için aynı olurdu.

Bu sadece bir demo. Her türlü MA'yı uygulamak mümkündür. İhtiyacın olan tek şey arzu ve ihtiyaç. Üstel ile kod biraz daha karmaşık hale gelir. denemenizi öneririm.
 

Hızı göstermek için...

Fare işaretçisi aracılığıyla iki parametreyi değiştirme

X - MA değişikliklerinin maksimum süresi

Y - MA dönem değişim adımı


 #include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#property indicator_chart_window

double    Close [];
long Total;
int Ma= 0 ;
int stepMa= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ChartSetInteger ( 0 , CHART_SCALE , 0 , 0 );
   ChartSetInteger ( 0 , CHART_FOREGROUND , true );
   CopyClose ( _Symbol , _Period ,( int )W.Right_bar,W.BarsInWind+Ma- 1 , Close );
   Total= SeriesInfoInteger ( _Symbol , _Period , SERIES_BARS_COUNT );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[])
  {
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
   static int MaOld=- 1 ,stepMaOld=- 1 ;
   Ma=W.MouseX+ 100 ;
   stepMa=W.MouseY;
   if (stepMa<= 0 ) stepMa= 1 ;
   stepMa= 1 +stepMa/ 10 ;
   if (stepMa>Ma) stepMa=Ma- 1 ;
   if (id== CHARTEVENT_CHART_CHANGE || MaOld!=Ma || stepMaOld!=stepMa)
     {
       ChartSetInteger ( 0 , CHART_SCALE , 0 , 0 );
       CopyClose ( _Symbol , _Period ,( int )W.Right_bar,W.BarsInWind+Ma- 1 , Close );
      nMA();
      MaOld=Ma; stepMaOld=stepMa;
     }
  }
//+------------------------------------------------------------------+

void nMA()
  {
   int preY= 0 ;
   Canvas.Erase();
   double S= 0 ;
   for ( int i= 0 ;i<Ma; i++) S+= Close [i];

   for ( int Per=Ma;Per> 0 ;)
     {
       double s=S;
       uint Clr=Grad(( double )Per/Ma);
       for ( int x= 0 ; x<W.BarsInWind;x++)
        {
         int Y=( int )(Canvas.Y(s/Per)- 0.5 );
         if (x> 0 ) if ( fabs (Y-preY)> 1 ) Canvas.Line(x- 1 ,preY,x,Y,Clr);
         else Canvas.PixelSet(x,Y,Clr);
         if ((Ma+x)< ArraySize ( Close )) s=s- Close [x+Ma-Per]+ Close [Ma+x]; else break ;
         preY=Y;
        }
       for ( int j= 0 ; j<stepMa; j++) if (Per> 0 ) {S=S- Close [Ma-Per]; Per--;} else break ;
     }
   Canvas.Update();
  }
//+------------------------------------------------------------------+
uint Grad( double p)
  {
   static uint Col[ 6 ]={ 0xFF0000FF , 0xFFFF00FF , 0xFFFF0000 , 0xFFFFFF00 , 0xFF00FF00 , 0xFF00FFFF };
   if (p> 0.9999 ) return Col[ 5 ];
   if (p< 0.0001 ) return Col[ 0 ];
   p=p* 5 ;
   int n=( int )p;
   double k=p-n;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+ 1 ];
   return ARGB( 255 ,c1.c[ 2 ]+ uchar (k*(c2.c[ 2 ]-c1.c[ 2 ])+ 0.5 ),
                   c1.c[ 1 ]+ uchar (k*(c2.c[ 1 ]-c1.c[ 1 ])+ 0.5 ),
                   c1.c[ 0 ]+ uchar (k*(c2.c[ 0 ]-c1.c[ 0 ])+ 0.5 ));
  }
//+------------------------------------------------------------------+
Dosyalar:
MultiMA.mq5  8 kb
 
Nikolai Semko :

Hızı göstermek için...

Fare işaretçisi aracılığıyla iki parametreyi değiştirme

X - MA değişikliklerinin maksimum süresi

Y - MA dönem değişim adımı


Güzel, ama derleyici yemin ediyor

can't open "..\MQL5\Include\Canvas\iCanvas.mqh" include file    MultiMA.mq5     9       11
 
Aleksey Vyazmikin :

Güzel, ama derleyici yemin ediyor

İncil'in elbette yüklenmesi gerekiyor. Kodda bu kütüphaneye bir bağlantı var.
 
Nikolai Semko :
İncil'in elbette yüklenmesi gerekiyor. Kodda bu kütüphaneye bir bağlantı var.

Teşekkür ederim! Her şey çalıştı!

Ve grafik yeniden çizildiğinde/değiştirildiğinde göstergenin yeniden çizilmesini nasıl sağlayabilirim?

 
Aleksey Vyazmikin :

Teşekkür ederim! Her şey çalıştı!

Grafik yeniden çizildiğinde/kaydığında göstergenin yeniden çizilmesini nasıl sağlayabilirim?

Yeniden çizim bu şekilde çalışır.
 
Nikolai Semko :
Yeniden çizim bu şekilde çalışır.

Sadece fareyi hareket ettirirken benim için çalışıyor.

 
Aleksey Vyazmikin :

Sadece fareyi hareket ettirirken benim için çalışıyor.

Evet, küçük bir eklem vardı. Düzeltildi.

Teşekkür ederim.