라이브러리: MovingAverages

 

MovingAverages:

MovingAverages 라이브러리에는 다양한 유형의 이동 평균을 계산하기 위한 함수가 포함되어 있습니다.

작성자: MetaQuotes

 

Line:

   if(period<=1 || rates_total-begin<period) return(0);

은 엄격하지 않은 동일성이어야 합니다:

   if(period<1 || rates_total-begin<period) return(0);
그렇지 않으면, 예를 들어 MACD.mq5 전달 코드를 컴파일하고 InpSignalSMA=1을 설정하면 신호 라인은 0이 되지만 MACD 라인과 같아야 합니다.
 
ExponentiaMA 함수에서 세 번째 매개 변수 prev_value를 입력하는 의미를 잘 이해하지 못합니다. 평균을 계산하는 순수한 공식에서 이전 기간의 값이 필요하다는 것은 분명하지만, 제 생각에는 함수가 내부적으로이 값을 계산하고 SimpleMA와 같이 함수에 3 개의 데이터 만 입력하면 일반인에게 더 명확 할 것이라고 생각합니다.
 

마지막 파라미터 가중치가 필요한 이유

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum)

에만 있는 반면 다른 세 함수에는 없습니다. 그래도 필요하다면 외부 변수 weightsum=0을 초기화할 때 사용하는 방법, 다른 함수는 비뚤어지게 작동하여 0으로 나누기 오류가 발생합니다.

 
Roman Sukhorukov:

마지막 파라미터 가중치가 필요한 이유

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum)

에만 있는 반면 다른 세 함수에는 없습니다. 그래도 필요하다면 외부 변수 weightsum=0을 초기화할 때 사용하는 방법, 다른 함수는 비뚤어지게 작동하고 0으로 나누기 오류가 발생합니다.

터미널과 함께 제공되는 유사한 인디케이터 사용자 지정 이동평균.mq5에서는 함수 내부에 선언되어 있습니다:

   static int weightsum;

즉, 인디케이터를 새로 재계산할 때마다 재설정되지 않습니다. 지표에서 정적 int 가중치 - 서로 다른 스레드이고 자체 변수가 있기 때문에 교차하지 마십시오.

그러나 기간이 다른 2 개 이상의 LWMA (전문가 고문에서 실행)를 계산하는 경우 함수 내에서 정적을 선언하여 모두 1이 아닌 각각에 대해 가중치를 다르게해야한다고 가정합니다.

따라서 각 LWMA마다 고유한 전역 변수가 필요하며, 이를 LinearWeightedMAOnBuffer()에 전달합니다,

예를 들어 LWMA가 2개인 경우 다음 변수를 전역으로 선언해야 합니다.

int weightsum1;
int weightsum2;

를 선언한 다음 함수에 전달해야 합니다.

제가 잘못 이해한 부분이 있다면 바로잡아 주세요.

 
elibrarius:

따라서 각 LWMA에 대해 전역 변수가 필요하며, 이를 LinearWeightedMAOnBuffer()에 전달합니다,

예를 들어, LWMA가 2개인 경우 전역적으로 다음과 같이 선언해야 합니다.

int weightsum1;
int weightsum2;

를 선언한 다음 함수에 전달해야 합니다.

int weightsum1; int weightsum2; ...를 선언하여 확인합니다. 를 선언하여 확인합니다. 계산이 올바르게 수행됩니다.
 
Maxim Khrolenko #:
ExponentiaMA 함수에서 세 번째 매개 변수 prev_value를 입력하는 의미를 잘 이해하지 못합니다. 평균을 계산하는 순수한 공식에서 이전 기간의 값이 필요하다는 것은 분명하지만, 제 생각에는이 값을 내부적으로 계산하고 SimpleMA와 같이 함수에 3 개의 데이터 만 입력해야하는 경우 함수가 평균적인 사람에게 더 명확 할 것입니다.

전적으로 동의합니다! 사용 방법이 명확하지 않습니다. 결국 저는 prev_value를 어디에서 가져와야 할지 몰라서 ExponentialMAOnBuffer를 선택했습니다. 이 함수는 Expert Advisor에서 외부 지표를 호출하는 것이 아니라 내부의 모든 것을 읽는 데 필요합니다. 개발자는 무엇을 제안했나요?

"필요하지 않은 것을 팔기 위해서는 먼저 필요하지 않은 것을 사야하는데 우리는 돈이 없다"는 만화 "Prostokvashino"의 인용문이 생각납니다.

 
Konstantin Efremov #:

전적으로 동의합니다! 사용 방법이 명확하지 않습니다. 결국 저는 prev_value를 어디에서 가져와야 하는지 이해하지 못해서 ExponentialMAOnBuffer를 선택했습니다. 이 함수는 전문가 어드바이저에서 외부 지표를 호출하는 것이 아니라 내부의 모든 것을 읽는 데 필요합니다. 개발자는 무엇을 제안했나요?

"필요하지 않은 것을 팔려면 먼저 필요하지 않은 것을 사야하는데 우리는 돈이 없다"는 만화 "Prostokvashino"의 인용문이 생각납니다.

네, 동의합니다. 이것도 마찬가지입니다:

//+------------------------------------------------------------------+
//| 평활 이동 평균|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- 확인 기간
   if(period>0 && period<=(position+1))
     {
      if(position==period-1)
        {
         for(int i=0; i<period; i++)
            result+=price[position-i];

         result/=period;
        }

      result=(prev_value*(period-1)+price[position])/period;
     }

   return(result);
  }

노란색의 코드가 어떻게 계산되는지는 중요하지 않습니다. 결과는 여전히 녹색 문자열이 될 것입니다. 그리고 이것은 표준 MT5 라이브러리에 있습니다! 예!

기능을 개선하지 않으면 쓸모가 없습니다. MQL5에서는 여러 상품에서 MA 값을 계산해야 할 때 매우 유용합니다. 그리고 어떤 상품인지 미리 알 수 없습니다. 시장 개요에서 모든 상품의 MA 핸들을 만들 수는 없습니다!

 
Konstantin Efremov #:

전적으로 동의합니다! 사용 방법이 명확하지 않습니다. 결국 저는 prev_value를 어디에서 가져와야 하는지 이해하지 못해서 ExponentialMAOnBuffer를 선택했습니다. 이 함수는 전문가 어드바이저에서 외부 지표를 호출하는 것이 아니라 내부의 모든 것을 읽는 데 필요합니다. 개발자는 무엇을 제안했나요?

"필요하지 않은 것을 팔려면 먼저 필요하지 않은 것을 사야하는데 우리는 돈이 없다"는 만화 "Prostokvashino"의 인용문이 생각납니다.

안드레이 카우노프 #:

네, 저도 동의합니다. 저도 마찬가지입니다:

노란색으로 강조 표시된 코드가 어떻게 계산되는지는 중요하지 않습니다. 결과는 여전히 녹색 문자열입니다. 그리고 이것은 표준 MT5 라이브러리에 있습니다! 네!

기능을 개선하지 않으면 쓸모가 없습니다. MQL5에서는 여러 상품에서 MA 값을 계산해야 할 때 매우 유용합니다. 그리고 어떤 상품인지 미리 알 수 없습니다. 시장 개요에서 모든 상품의 MA 핸들을 만들 수는 없습니다!

코드베이스에서 검색해서 찾아볼 수 있습니다. 이 라이브러리를 사용한 사람은 저뿐만이 아닙니다...

MA on ATR
MA on ATR
  • www.mql5.com
Индикатор Moving Average по значениям индикатора Average True Range
 

실례합니다만, "위치"라는 변수가 무엇인가요?

double SimpleMA(const int position,const int period,const double &price[])
 
double SimpleMA( const int position, const int period, const double &price[])
  {
   double result= 0.0 ;
 //--- 확인 기간 
   if (period> 0 && period<=(position+ 1 ))
     {
       for ( int i= 0 ; i<period; i++)
         result+=price[position-i];

      result/=period;
     }

   return (result);
  }

좋은 아침

이렇게 하면 더 명확해지나요?