캔버스 멋지다! - 페이지 20

 
Anatoli Kazharski :

제한이 있습니다. 최대 512개의 표시기 버퍼를 만들 수 있습니다. >>> https://www.mql5.com/ru/docs/indicators

고맙습니다.
예, 수백 개의 표시기 버퍼 후에 코드의 길이 외에도 엄청난 메모리 낭비가 발생합니다. 내 버전에서는 하나의 배열이 차원과 함께 사용됩니다: 화면의 숫자 막대 + 최대. 기간.
 
Nikolai Semko :

Canvas에서 구현된 수백 이동 평균의 초고속 표시기.

100 MA 라인(기간 단계 10) - 계산 및 표시 시간 - 4-7밀리초


1000 MA 라인(기간 단계 1) - 계산 및 표시 시간 - 20-30밀리초


코드는 많이 테스트되지 않았습니다. 버그가 있을 수 있습니다. 두께가 1픽셀인 막대에 대해서만 구현됩니다(이러한 축척으로 강제 변환됨). 또한 화면 새로 고침 빈도가 최적화되지 않았습니다. 모든 라인이 계산되어 각 눈금에 완전히 표시됩니다.

평균 단순을 어떻게 이해했습니까? 이제 지수 에 대해서도 마찬가지입니다.

 
Dmitry Fedoseev :

평균 단순을 어떻게 이해했습니까? 이제 지수도 마찬가지일 것입니다.

이것은 단지 데모입니다. 모든 유형의 MA 구현이 가능합니다. 당신에게 필요한 것은 욕망과 필요입니다. 지수를 사용하면 코드가 약간 더 복잡해집니다. 나는 당신이 시도하는 것이 좋습니다.
 

속도를 보여주기 위해...

마우스 포인터를 통해 두 매개변수 변경

X - MA 변경의 최대 기간

Y - MA 기간 변경 단계


 #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 ));
  }
//+------------------------------------------------------------------+
파일:
MultiMA.mq5  8 kb
 
Nikolai Semko :

속도를 보여주기 위해...

마우스 포인터를 통해 두 매개변수 변경

X - MA 변경의 최대 기간

Y - MA 기간 변경 단계


아름답지만 컴파일러는 맹세합니다.

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

아름답지만 컴파일러는 맹세합니다.

물론 성경을 설치해야 합니다. 코드에 이 라이브러리에 대한 링크가 있습니다.
 
Nikolai Semko :
물론 성경을 설치해야 합니다. 코드에 이 라이브러리에 대한 링크가 있습니다.

고맙습니다! 모든 것이 작동했습니다!

차트를 다시 그리거나 이동할 때 표시기를 다시 그리도록 하려면 어떻게 해야 합니까?

 
Aleksey Vyazmikin :

고맙습니다! 모든 것이 작동했습니다!

차트를 다시 그리거나 이동할 때 표시기를 다시 그리 려면 어떻게 해야 합니까?

이것이 다시 그리기가 작동하는 방식입니다.
 
Nikolai Semko :
이것이 다시 그리기가 작동하는 방식입니다.

마우스를 움직일 때만 작동합니다.

 
Aleksey Vyazmikin :

마우스를 움직일 때만 작동합니다.

예, 작은 관절이 있었습니다. 수정했습니다.

고맙습니다.