English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
기술 지표 및 디지털 필터

기술 지표 및 디지털 필터

MetaTrader 5통합 | 3 9월 2021, 09:56
140 0
GT788
[삭제]

소개

몇 년 동안 Code Base는 많은 지표를 축적했습니다. 그들 중 대부분은 약간만 수정한 서로의 복사본입니다. 차트의 지표를 몇 시간 동안 시각적으로 비교한 후 우리는 "보다 객관적이고 효율적인 비교 방법을 찾을 수 있을까?"라고 묻지 않을 수 없었습니다. 이에 대한 대답을 하자면 물론 가능합니다. 지표가 디지털 필터라는 것을 인정해야 합니다. 위키피디아로 돌아가봅시다.

필터(화학), 특정 물체나 물질은 물리적으로 차단하고 다른 물질은 통과시키도록 설계된 장치(일반적으로 막 또는 층).

지표가 일부 "불필요한" 개체를 차단하고 중요한 개체에 집중할 수 있다는 데 동의합니까? 이제 디지털 필터가 무엇인지 봅시다.

전자공학, 컴퓨터 과학 및 수학에서 디지털 필터는 샘플링된 이산 시간 신호에 대해 수학 연산을 수행하여 해당 신호의 특정 측면을 줄이거나 향상시키는 시스템입니다.

즉, 디지털 필터는 이산 신호를 처리하는 필터입니다. 터미널에서 볼 수 있는 가격은 그 값이 연속적이지 않고 일정 기간 동안 기록되기 때문에 이산 신호로 취급될 수 있습니다. 예를 들어, 가격 값은 H1 차트에 매시간 기록되고 M5에서는 5분에 한 번 기록됩니다. 많은 지표가 선형 필터로 처리될 수 있습니다. 이것이 바로 이 글에서 논의되는 지표 유형입니다. 

이제 우리가 디지털 필터를 다루고 있다는 것을 알았을 때, 어떤 매개변수를 비교해야 하는지 정의하기 위해 이론을 검토해 보겠습니다.


1. 빈도 및 기간

우선, 모든 곡선은 사인파의 합으로 나타낼 수 있다는 점을 언급해야 합니다.

진동 주기는 신체가 같은 위치와 같은 방향으로 연속적으로 두 번 통과하는 시간 간격입니다. 이 값은 주파수에 반비례합니다.

이 정의는 사인파를 사용하면 가장 쉽게 이해할 수 있습니다. 10카운트와 같은 기간을 생각해 봅시다. 단순화를 위해 바로 계산을 수행합니다.

그림 1 

 그림 1. 샘플 주기 신호

보시다시피, 라인은 10 카운트 내에서 전체 주기를 완료하는 반면 열한 번째 바는 새 주기의 첫 번째 지점입니다.

사인파의 주파수는 얼마입니까? 정의에 따르면 주기는 빈도의 역수 값입니다. 그러면 주기가 10(바)이면 주파수는 1/10=0.1(1/바)이 됩니다.

물리학에서 주기(T)는 초(s)로 측정되는 반면 주파수(f)는 헤르츠(Hz)로 측정됩니다. 분 시간 프레임을 다루는 경우 T=60*10=600초이고 f=1/Т=1/600=0.001667Hz입니다. 헤르츠와 초는 주로 아날로그 필터에 사용됩니다. 디지털 방식에서는 일반적으로 카운트가 사용됩니다(바를 사용하는 방식). 필요한 경우 필요한 시간(초)을 곱합니다.

이것이 사인파와 무슨 관련이 있는지 궁금할 것입니다. 필터의 물리적 의미를 설명하고 주파수로 이동하기 위해서는 사인파가 필요합니다. 이 개념이 적절한 작품에서 사용되기 때문입니다. 이제 주기가 10에서 70이고 단계가 10인 사인파 대신 7개의 사인파를 사용하겠습니다. 그림 2의 상단 서브 윈도우에 있는 Bars는 카운트 수를 시각적으로 추정하기 위한 가이드 역할을 합니다.

그림 2 

 그림 2. 주기가 10, 20, ... 70바인 동일한 진폭을 갖는 7개의 사인파.

규모는 충분히 크지만 여전히 혼란스러울 수 있습니다. 사인파가 훨씬 더 많으면 혼동하기가 훨씬 쉽습니다.

사인파의 합은 다음과 같이 표시됩니다.

그림 3  

그림 3. 그림 2에 표시된 7개의 사인파의 합

주파수는 다음과 같이 표시됩니다.

 그림 4 

그림 4. 사인파 합의 스펙트럼(주파수에서)

7개의 카운트는 7개의 사인파를 표시하기에 충분합니다. 색상에 주의하십시오. 이전 그림과 일치합니다. 느린 사인파 다음에 빠른 사인파가 따라옵니다. 가능한 가장 낮은 주파수는 0(상수 성분)이고 가장 높은 주파수는 0.5(1/bars)입니다. 기간 동안의 경우는 반대입니다.

 그림 5

 그림 5. 사인파 합의 스펙트럼(주기)

주파수는 1/주기와 같습니다. 따라서 주기는 2에서 무한대 사이여야 합니다. 왜 0.5와 2인가? 하나의 사인파는 최소 2개의 카운트로 설명할 수 있습니다(Nyquist-Shannon 샘플링 정리 참조). 아날로그(연속) 신호를 복원하려면 하나의 사인파당 두 개 이상의 카운트가 필요합니다(0.5는 1/2에서 수신됨).

기간 및 빈도와의 혼동을 피하기 위해 다음 표를 살펴보겠습니다.

기간
  
 100     50
   16
  10
   4
   2
빈도
0
 0.01 
 0.02 
0.0625
  0.1 
 0.25 
  0.5 

 

우리는 주기와 빈도의 개념을 기본적으로 살펴보았습니다. 모든 추가 정보는 이러한 조건과 관련이 있습니다.

 

2. 디지털 필터

그래서 우리는 마침내 필터에 대해 논의할 준비가 되었습니다. 주기가 50보다 작은 사인파를 제거해야 한다고 가정합니다.

그림 6 

 그림 6. 사인파 합계의 느린(저주파) 구성 요소(50, 60 및 70bar 주기)

초기 구성 요소를 알면 모든 것이 비교적 쉽습니다. 그러나 합계만 알면 어떻게 될까요? 이 경우 차단 주파수가 1/45(1/bars)인 저역 통과 필터(LPF)가 필요합니다.

필터링 결과는 다음과 같습니다.

그림 7 

 그림 7. LPF를 이용한 사인파 합여과 결과(파란선)

이제 기간이 10, 20, 30인 정현파만 남겨둡시다. 이렇게 하려면 차단 주파수가 1/35(1/bars)인 고역 통과 필터(HPF)를 사용해야 합니다. 

그림 8 

 그림 8. 사인파 합의 고주파 성분(주기 10, 20, 30 bar)

그림 9 

그림 9. HPF를 이용한 사인파 합여과 결과(파란선)

30, 40 및 50의 주기를 남기려면 차단 주파수가 1/25 및 1/55(1/bars)인 대역폭 필터(BF)가 필요합니다. 

그림 10 

 그림 10. 주기가 30, 40 및 50 bar인 사인 라인

 

그림 11 

그림 11. 사인파의 합 대역폭 필터링 결과(30-50bar)

30, 40, 50의 주기를 제거하려면 차단 주파수가 1/25 및 1/55(1/bars)인 대역 정지(거부) 필터가 필요합니다. 

그림 12 

그림 12. 주기가 10, 20, 60 및 70bar인 사인파

 

그림 13 

그림 13. 사인파의 합에 따른 제거 필터 연산 결과(30-50개의 바)

아래 이미지에서 중간 결과를 요약해 보겠습니다. 

그림 14
 

그림 14. 이상적인 필터의 주파수 매개변수: 낮은 주파수(LPF), 높은 주파수(HPF), 대역폭(BF) 및 제거(RF)

위에서 조사한 필터는 이상화되었습니다. 현실은 훨씬 더 다릅니다.

 그림 15 

그림 15. 필터에서의 전환 대역

수용 대역과 감쇠 대역 사이에 전이 대역이 있습니다. 기울기는 dB/octave 또는 dB/decade로 측정됩니다. 옥타브는 주파수 랜덤 값과 이중 값 사이의 세그먼트입니다. 10년은 주파수 랜덤 값과 10배 값 사이의 세그먼트입니다. 공식적으로 전환 대역은 차단 주파수와 감쇠 대역 사이에 위치합니다. 스펙트럼에 의한 차단 주파수는 대부분 3dB 수준으로 정의됩니다.

아웃밴드 제거는 데시벨로 측정된 감쇠 대역의 주파수를 억제하는 것입니다.

비트는 허용 대역에서 감지됩니다. 실제 필터, 즉 수용 대역에서의 왜곡을 다룰 때 일부 주파수는 진폭이 더 크고 일부는 더 낮습니다. 값은 데시벨로 측정됩니다.

아래 표는 값을 dB로 렌더링하는 데 도움이 될 수 있습니다.

dB
진폭비
0.5    
1.06
1
1.12
3
1.41
6 2
10
3.16
20 10
30 31.6
40
100
60  1000

 

예를 들어, 60dB에 대한 결과를 수신하려면 20 및 40dB에 대한 값을 찾아 곱할 수 있습니다.

이제 필터의 기본 매개변수를 알았으므로 글의 실제 부분으로 넘어가 보겠습니다.


3. 커널 검색

디지털 필터는 Impulse 응답(커널)으로 완전히 설명된다고 말할 수 있습니다. Impulse 응답은 단일 Impulse에 대한 필터의 응답입니다. 필터는 IIR(무한 Impulse 응답, 예: 지수 이동 평균, EMA) 및 FIR 유형(유한 Impulse 응답, 예: 단순 이동 평균, SMA)일 수 있습니다. 

이제 MetaEditor에 집중할 수 있습니다. 먼저, 단일 충동을 생성해 보겠습니다. 1과 동일한 하나의 카운트만 표시하는 매우 간단한 지표입니다. MetaEditor에서 새로 만들기를 클릭하고 "사용자 지정 지표"를 선택한 후 다음을 클릭합니다.

그림 16
 

그림 16. MQL5 마법사에서 사용자 지정 지표 생성

이름으로 "Impulse"를 지정하십시오.

그림 17
 

그림 17. 지표의 일반 속성

이벤트 핸들러를 선택합니다.

그림 18
 

 그림 18. 지표의 이벤트 핸들러

이제 표시줄을 추가하고 별도의 창에 표시해야 합니다. 다 준비됐습니다.

 그림 19

 그림 19 지표의 도면 속성

지표의 코드는 다음과 같습니다.

//+------------------------------------------------------------------+
//|                                                      Impulse.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters

//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Label1Buffer,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
              const int prev_calculated,
              const int begin,
              const double &price[])
  {
//---
   ArrayInitialize(Label1Buffer,0.0);
   Label1Buffer[1023]=1.;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

OnInit() 함수에 다음을 추가합니다.

ArraySetAsSeries(Label1Buffer,true);

배열의 끝에서 인덱싱이 수행되도록 합니다.

OnCalculate()에서:

ArrayInitialize(Label1Buffer,0.0);
Label1Buffer[1023]=1.;

모든 값을 0으로 만들고 1023번째 지표의 배열 셀에 1을 추가합시다.

컴파일(F7)하고 다음 결과를 수신합니다. 

그림 20 

 그림 20. Impulse 지표

이제 지표를 적용하면 최대 1024 카운트까지 Impulse 응답을 볼 수 있습니다(예제 참조).

물론 필터의 커널을 보는 것은 좋지만 더 많은 데이터는 주파수 영역 표현에서만 얻을 수 있습니다. 이렇게 하려면 스펙트럼 분석기를 만들거나 많은 노력 없이 이미 만들어진 솔루션을 사용해야 합니다. 두 번째 옵션을 선택하고 "스펙트럼 분석기 구축" 문서에 설명된 SpecAnalyzer 지표를 사용하겠습니다.

지표는 아래와 같이 표시됩니다.

그림 21 

그림 21. SpecAnalyzer

사용하기 전에 몇 가지 준비 작업이 필요합니다. 필요한 모든 단계는 아래에 설명되어 있습니다.


4. 스펙트럼 분석기에 대한 적응

"외부 데이터" 버튼을 사용하면 SAInpData 지표의 데이터를 사용할 수 있습니다.

원본에는 필터의 커널을 나타내는 배열이 포함되어 있습니다. 스펙트럼 분석기에 차트 지표를 전달할 수 있도록 파일을 다시 만들 것입니다. 자동 및 수동 모드는 수정된 지표에 제공되어야 합니다. 자동 모드에서는 가장 먼저 찾은 차트 지표가 사용됩니다. 수동 모드에서 사용자는 목록에서 하위 창 및 지표 인덱스를 설정할 수 있습니다. 이 경우 Impulse 지표를 차트에 수동으로 추가해야 합니다. 그 후 커널을 수신하기 위해 필요한 지표가 적용됩니다.

시작합시다. Impulse와 동일한 알고리즘에 따라 새 지표를 만들어야 합니다. 입력 매개변수를 추가합니다.

input bool Automatic=true; // Autosearch
input int  Window=0;       // Subwindow index
input int  Indicator=0;    // Indicator index

Automatic=true이면 자동 모드가 사용되지만 다른 입력 매개변수는 무시됩니다. Automatic=false이면 하위 창과 지표 인덱스가 있는 수동 모드가 사용됩니다.

다음으로 핸들을 저장하기 위해 전역 수준에 정수 유형 변수를 추가해야 합니다.

int Impulse=0; // single impulse's handle
int Handle=0;  // required indicator's handle
int Kernel=0;  // filter kernel's handle

Impulse 지표 핸들은 Impulse에 저장됩니다. 스펙트럼 분석기에서 보려는 커널인 지표의 핸들은 핸들에 저장됩니다. Impulse 지표를 기반으로 구축된 타깃 지표의 핸들, 즉 타깃 지표의 커널은 Kernel에 저장된다.

OnInit() 함수:

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DataBuffer,INDICATOR_DATA);

   Impulse=iCustom(NULL,0,"SpecAnalyzer\\Impulse");//get the single impulse handle
   if(Impulse==INVALID_HANDLE)
     {
      Alert("Impulse initialization failed"); 
       return(INIT_FAILED);
     }
//---
   return(0);
  }

Impulse 지표는 프로그램이 동작하는 동안 변경되지 않으므로 지표의 핸들은 OnInit() 함수에서 전달받아야 합니다. 또한 핸들 수신 오류를 확인해야 합니다. 실패 시 "Impulse initialization failed" 메시지가 표시되고 INIT_FAILED 키와 함께 지표의 작동이 중단됩니다.

OnDeinit() 함수:

void OnDeinit(const int reason)
  {
//--- delete the indicators
   IndicatorRelease(Impulse);
   IndicatorRelease(Handle);
   IndicatorRelease(Kernel);
  }

사용된 지표는 OnDeinit() 함수에서 삭제됩니다.

OnCalculate() 함수:

static bool Flag=false;        //error flag
if(Flag) return(rates_total); //exit in case of the flag

플래그 정적 변수는 함수 시작 부분에 추가됩니다. 프로그램 실행 중에 오류가 발생하면 플래그는 true와 같고 OnCalculate() 함수의 모든 추가 반복은 처음부터 바로 중단됩니다.

다음은 수동 모드와 관련된 코드 블록입니다.

   string Name;  //short name of the required indicator
   if(!Automatic)//in case of the manual mode
     {
      if(ChartIndicatorsTotal(0,Window)>0)//if an indicator is present
        {
         Name=ChartIndicatorName(0,Window,Indicator);//search for its name
         Handle=ChartIndicatorGet(0,Window,Name);//search for the handle
        }
      else//otherwise
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      if(Handle==INVALID_HANDLE)//in case of a handle receiving error
        {
         Alert("No indicator");
         Flag=true;
         return(rates_total);
        }

      CopyBuffer(Handle,0,0,1024,DataBuffer);//display the kernel on the chart
      return(rates_total);
     }

Automatic=false이면 수동 모드가 시작됩니다. 지표가 있는지 확인합니다. 성공하면 이름과 핸들 검색을 시작하고 핸들에 오류가 있는지 확인하고 데이터를 지표의 버퍼에 복사합니다. 실패할 경우 "지표 없음" 메시지가 표시되고 플래그가 true로 전환되며 OnCalculate() 함수 실행이 중단됩니다.

자동 모드 블록이 훨씬 더 흥미롭습니다. 차트에서 지표를 검색하고 커널을 생성하는 것으로 구성됩니다.

따라서 지표를 검색하는 것을 고려해 보겠습니다. 주요 목적은 핸들을 받는 것입니다.

   if(ChartIndicatorsTotal(0,0)>0)//if the indicator is in the main window
     {
      Name=ChartIndicatorName(0,0,0);//search for its name
      if(Name!="SpecAnalyzer")//if it is not SpecAnalyzer
         Handle=ChartIndicatorGet(0,0,Name);//look for a handle
      else
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }
   else//otherwise
   if(ChartIndicatorsTotal(0,1)>0)//if the indicator is in the first subwindow
     {
      Name=ChartIndicatorName(0,1,0);//search for its name
      if(Name!="SAInpData")//if it is not SAInpData
         Handle=ChartIndicatorGet(0,1,Name);//look for a handle
      else//otherwise
        {
         Alert("Indicator not found");
         Flag=true;
         return(rates_total);
        }
     }

   if(Handle==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("No indicator");
      Flag=true;
      return(rates_total);
     }

먼저 차트의 기본 하위 창에서 지표를 검색하고 SpecAnalyzer가 아닌지 확인합니다. 메인 창에 지표가 없으면 다음 하위 창에서 검색합니다(여기에 SAInpData가 있을 수 있음을 고려). 다른 모든 작업은 수동 모드와 유사합니다.

지표를 만들어 봅시다. 획득한 지표의 매개변수를 수신하고 Impulse를 기반으로 유사한 지표를 생성해야 합니다.

   ENUM_INDICATOR indicator_type;//obtained indicator's type
   MqlParam parameters[];      //parameters
   int parameters_cnt=0;      //number of parameters

//--- receive the indicator's type, parameter values and amount
   parameters_cnt=IndicatorParameters(Handle,indicator_type,parameters);
//--- define that a single impulse is to be sent to the indicator's input
   parameters[parameters_cnt-1].integer_value=Impulse;
//--- receive the indicator's handle from the single impulse - filter's kernel
   Kernel=IndicatorCreate(NULL,0,indicator_type,parameters_cnt,parameters);

   if(Kernel==INVALID_HANDLE)//in case of a handle receiving error
     {
      Alert("Kernel initialization failed");
      Flag=true;
      return(rates_total);
     }

   CopyBuffer(Kernel,0,0,1024,DataBuffer);//display the kernel on the chart

indicator_type - 특수 열거된 변수 ENUM_INDICATOR 유형. 변수는 지표 유형을 수신하도록 설계되었습니다.

parameters[] - MqlParam 유형의 배열, 지표 매개변수를 저장하고 전송하기 위한 특수 구조입니다.

IndicatorParameters 기능을 사용하면 차트 지표에서 데이터를 수신할 수 있습니다. 그런 다음 매개변수 배열에 약간의 변경을 구현합니다. Impulse 지표 핸들은 integer_value 필드에 시계열 이름(종가, 저가, 핸들 등)이 저장되는 마지막 셀에 포함됩니다. 그런 다음 IndicatorCreate 함수 를 사용하여 커널이기도 한 새 지표를 만듭니다. 이제 핸들을 확인하고 차트에 커널을 표시해야 합니다.

SpecAnalyzer 지표도 약간 변경되었습니다. 다음 입력 매개변수가 추가되었습니다.

input bool Automatic=true; //Autosearch
input int Window=0;        //Subwindow index
input int Indicator=0;    //Indicator index

SAInpData 호출도 변경되었습니다.

ExtHandle=iCustom(NULL,0,"SpecAnalyzer\\SAInpData",Automatoc,Window,Indicator);

SAInpData는 단독으로 사용하여 Impulse 응답을 볼 수 있습니다.

 

5. 예시

작업을 수행하려면 SpecAnalyzer 폴더를 MetaTrader 5\MQL5\Indicators에 붙여넣습니다. MetaTrader 5 시작, 새로운 EURUSD 차트 열기:

그림 22

그림 22. 새 EURUSD 차트 열기

이제 MA(16)와 같은 필수 지표를 적용합니다.

그림 23

그림 23. EURUSD 차트에 이동 평균 지표 적용

시작 SpecAnalyzer:

그림 24

그림 24. SpecAnalyzer 시작

매개변수 창이 나타납니다.

그림 25

그림 25. SpecAnalyzer 지표 매개변수

자동 모드의 경우 확인을 클릭하기만 하면 됩니다. 수동 모드에서는 truefalse로 바꾸고 필요한 지표의 위치를 ​​지정해야 합니다.

확인을 클릭했습니다. 새로 나타난 스펙트럼 분석기 창에서 "외부 데이터"를 클릭하십시오.

그림 26

그림 26. SpecAnalyzer 지표에 대한 입력 데이터 선택

이제 수동 모드에서 작업하는 것을 고려해 보겠습니다. 먼저, 차트에 Impulse 지표를 추가해야 합니다.

그림 27

그림 27. Impulse 지표 추가

그런 다음 이 지표를 사용하여 대상 지표를 생성해야 합니다. 이렇게 하려면 지표를 마우스로 Impulse 창으로 드래그하고 매개변수의 "Apply to" 필드에서 이전 지표 데이터를 선택해야 합니다.

그림 28

그림 28. Impulse 지표 데이터를 이용한 이동 평균 지표 생성

다음 결과를 얻어야 합니다.

그림 29 

그림 29. 단일 Impulse에 대한 이동 평균 지표 계산 결과

이제 지표 목록을 보려면 마우스 오른쪽 버튼을 클릭하십시오.

그림 30

그림 30. 목록의 지표

지표는 하위 창 1에 있으며 일련 번호가 1입니다(인덱싱은 1이 아닌 0부터 시작한다는 점을 잊지 마십시오). 이제 SpecAnalyzer를 실행해 보겠습니다. false, 1, 1로 설정합니다. "외부 데이터"를 클릭합니다.

지표의 속성은 즉시 변경할 수 있습니다. 지표 목록을 사용하여 기간을 변경하고 스펙트럼 분석기가 어떻게 반응하는지 확인하십시오. 

예시로 넘어가기 전에 SpecAnalyzer 지표의 한 가지 기능을 언급할 필요가 있습니다. 틱의 판독값은 기간이 아니라 주파수 그리드 표시입니다. 스펙트럼 분석기는 최대 1024개의 판독값 길이를 갖는 커널과 함께 작동합니다. 이는 그리드 주파수의 피치가 1/1024=0,0009765625와 같다는 것을 의미합니다. 따라서 척도에서 128의 값은 0.125의 빈도 또는 8의 주기에 해당합니다.

규모
기간
16   64
32   32
64   16
128
8
256
4
384
2.67
512
2

SMA (16)

 그림 31

그림 31. 단순 이동 평균 지표의 Impulse 응답(FIR 필터)

그림 32 

그림 32. 단순 이동 평균 지표의 주파수 응답

저주파가 우세하기 때문에 이것이 저역 통과 필터임을 알 수 있습니다. 감쇠 대역의 억제가 좋지 않습니다.

  

EMA (16)

그림 33

그림. 33. 지수 이동 평균 지표의 Impulse 응답(IIR 필터)

그림 34 

그림 34. 지수 이동 평균 지표의 주파수 응답

지수 이동 평균 지표는 저역 통과 필터이기도 합니다. 선은 상당히 부드럽지만 이전 지표와 달리 전환 대역이 더 넓습니다. 억제는 거의 동일합니다.

이제 범용 디지털 필터의 결과를 살펴보겠습니다.

저역 통과 필터

그림 35

그림 35. 저역 통과 필터의 Impulse 응답(커널)

그림 36

그림. 36. 저역 통과 필터
의 주파수 응답

고역 통과 필터

 그림 37 

그림 37. 고역 통과 필터의 Impulse 응답(커널)

 

 그림 38 

그림. 38. 고역 통과 필터의 주파수 응답

 

대역 통과 필터

 그림 39 

그림. 39. 대역 통과 필터의 Impulse 응답(커널)

 

그림 40 

  그림. 40. 대역 통과 필터의 주파수 응답


결론

결론적으로, 필터 매개변수는 강력하게 상호 연결되어 있다는 점에 유의해야 합니다. 그들 중 일부를 개선하는 것은 다른 것들의 악화를 의미합니다. 따라서 당면한 작업에 따라 매개변수를 선택해야 합니다.

예를 들어, 감쇠 대역에서 주파수 억제를 높이려면 하향 곡선의 기울기를 희생해야 합니다. 두 매개변수가 모두 양호해야 하는 경우 커널의 길이를 늘려야 합니다. 그러면 지표와 가격 사이의 격차에 영향을 미치거나 허용 범위의 왜곡이 증가합니다.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/736

파일 첨부됨 |
specanalyzer.zip (9.68 KB)
MQL5 표준 라이브러리 확장 및 코드 재사용 MQL5 표준 라이브러리 확장 및 코드 재사용
MQL5 표준 라이브러리는 개발자로서의 삶을 더 쉽게 만들어줍니다. 그럼에도 불구하고 전 세계 모든 개발자의 요구 사항을 모두 구현하지는 않으므로 사용자 지정 항목이 더 필요하다고 느끼면 한 단계 더 나아가 확장할 수 있습니다. 이 글은 MetaQuotes의 Zig-Zag 기술 지표를 표준 라이브러리에 통합하는 방법을 안내합니다. 우리는 MetaQuotes의 디자인 철학에서 영감을 얻어 목표를 달성합니다.
선형 거래 시스템을 강화하세요 선형 거래 시스템을 강화하세요
오늘의 글에서는 중급 MQL5 프로그래머가 소위 지수 기법을 쉽게 구현하여 선형 거래 시스템(고정 랏)에서 더 많은 이익을 얻을 수 있는 방법을 보여줍니다. 이는 그 결과 주식 곡선 성장이 포물선의 형태를 취하는 기하학적 또는 지수적이기 때문입니다. 특히, Ralph Vince가 개발한 고정 분수 위치 크기 조정의 실용적인 MQL5 변형을 구현합니다.
MQL5 Coobook: 지정된 기준에 따라 Expert Advisor의 최적화 결과 저장 MQL5 Coobook: 지정된 기준에 따라 Expert Advisor의 최적화 결과 저장
MQL5 프로그래밍에 대한 글 시리즈를 계속합니다. 이번에는 Expert Advisor 매개변수 최적화 중에 각 최적화 패스의 결과를 얻는 방법을 살펴보겠습니다. 구현은 외부 매개변수에 지정된 조건이 충족되면 해당 통과 값이 파일에 기록되도록 수행됩니다. 테스트 값 외에도 그러한 결과를 가져온 매개변수도 저장합니다.
사용 가능한 기술 칵테일로 MQL5 고객을 놀래켜보세요! 사용 가능한 기술 칵테일로 MQL5 고객을 놀래켜보세요!
MQL5는 프로그래머가 MetaTrader 환경 내에서 원하는 모든 작업을 수행할 수 있는 매우 완전한 기능 세트와 객체 지향 API를 제공합니다. 그러나 웹 기술은 오늘날 매우 다재다능한 도구로, 매우 구체적인 작업을 수행해야 하거나 고객을 뭔가 다른 것으로 놀라게 하고 싶거나 특정 MT5 Standard Library를 마스터할 시간이 충분하지 않은 경우에 도움이 될 수 있습니다. 오늘의 연습에서는 놀라운 기술 칵테일을 만드는 동시에 개발 시간을 관리할 수 있는 방법에 대한 실용적인 예를 안내해드립니다.