English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
움직이는 Mini-Max: MQL5의 기술적 분석 및 구현을 위한 새로운 지표

움직이는 Mini-Max: MQL5의 기술적 분석 및 구현을 위한 새로운 지표

MetaTrader 5 | 4 8월 2021, 16:59
114 0
investeo
investeo

소개

이론 및 수학 물리학의 방법을 사용하여 금융 파생 상품 가격 책정 모델을 연구할 수 있는 Quantitative Finance라는 과학이 있습니다.

최근에 저는 양자 물리학의 아이디어를 결합하고 이를 금융에 적용하는 기술 분석을 위한 새로운 지표를 설명하는 논문을 접했습니다. 관심이 생겨 MQL5의 과학 논문을 기반으로 지표를 구현하는 방법을 가르치기로 결정했습니다.

원래의 Moving Mini-Max 논문 [2]은 Z.K가 작성했습니다. Budker Institute of Nuclear Physics 및 Novosibirsk 주립 대학의 양자 물리학자인 Silagadze 말이죠. 논문에 대한 링크와 MQL5 소스 코드는 글 끝부분에서 확인할 수 있습니다.


지표

제가 이 문장을 쓰게 될 줄은 몰랐는데 여기서 양자 터널링에 대해 설명하겠습니다. 저는 대부분의 독자가 퀀트가 아니라고 가정하기 때문에 간단하게 설명할 것이므로 기분이 상하지 않으셨으면 합니다. 먼저 금융 시계열의 기술적 분석에 대한 아이디어를 한 문장으로 정의해 보겠습니다. 우리는 주로 다음을 찾고 있습니다.

  • 지지 및 저항 가격 수준;
  • 단기 및 장기 추세의 방향;
  • 추세의 상단과 하단.

Moving Mini-Max 지표의 원래 아이디어는 핵을 탈출하려는 양자 알파 입자의 유사체를 사용하여 차트의 상단과 하단을 찾는 것입니다. 이 문제는 George Gamov [1]의 알파 붕괴 이론에서 가져온 것입니다.

그림은 천 단어의 가치가 있으므로 아래에 작은 차트를 붙여넣습니다.

 그림 1. 시계열 차트의 가상 양자 볼

그림 1. 외환 가격 차트의 가상 양자 볼

공이 언덕 꼭대기에서 던졌다고 상상해 보십시오. 우리의 경우엔 시계열 차트의 최근 꼭대기가 되죠. 고전 역학에서는 장애물에서 튕겨 나올 것이고 도중에 어딘가에 붙어있을 수 있기 때문에 가장 앞의 장애물 앞에서 멈출 기회가 없을 수도 있습니다.

그러나 양자 역학 및 알파 붕괴 이론에 따르면 그러한 공은 매우 작지만 잠재적인 우물 바닥으로 가는 장벽을 통해 터널링하고 그곳에서 진동할 확률이 0이 아닐 수 있습니다.

이것은 가격 차트에서 지역 최소값을 찾는 것과 유사합니다. Z.K.의 논문 Silagadze [2]는 실제 양자 역학 문제를 해결하는 대신 계산 복잡성을 줄이기 위해 양자 행동을 모방하는 것으로 충분하다고 제안합니다. 저는 원래 논문에서 제시한 수학적 배경을 제시하고 나중에 MQL5에서 구현합니다.

특정 기간 동안의 가격 시리즈로 둡니다. Moving Mini-Max는 가격 시리즈의 비선형 변환입니다. 

uSi

여기서 은/는 다음과 같이 정의됩니다.

 

보시다시피 이것은 순환 관계입니다. 즉, i 번째 요소는 i-1 요소에 종속됩니다. 무빙 mini-max 계열은 모든 요소의 합이 1인 정규화 조건을 만족합니다.

 

양자 볼의 터널링 확률은 가격 계열의 좁은 장벽, 내리막에 있는 가상의 작은 장애물을 통과할 확률을 모델링하기 때문에 전환 확률이라고 합니다.


with

 

매개변수 m은 양자구의 (역) 질량과 작은 장애물을 통과하는 능력을 모방한 평활화 창의 너비입니다. 또는 exp() 함수에 전달된 매개변수에 빼기 기호를 넣어 로컬 최대값을 강조하는 이동하는 최소값 d(si)를 구성할 수 있습니다. 

 


구현

지표 이면의 수학에 대해 읽었으므로 MQL5에서 이를 구현할 수 있습니다. 가장 좋은 방법은 마지막 방정식에서 위쪽으로 보는 것입니다. mn 변수에 주의를 기울이면 이 지표에 하나의 최소 최대값에 대해 가격 계열의 n+2m 요소 배열이 필요하다는 것을 알 수 있습니다. 창의 지연 크기는 m 바입니다.

이는 Q 변수 계산에서 S i+k 및 S i-k 인덱스 때문입니다. 변수 i는 1에서 n까지 증가하고 k는 1에서 m까지 증가하므로 시작할 n+2m 버퍼입니다. 이것은 다음을 호출하여 달성할 수 있습니다.

double S[];
ArrayResize(S,n+2*m);
CopyClose(Symbol(),0,0,n+2*m,S);

이것은 더블 배열을 선언하고, 크기를 n+2m로 조정하고, 최신 바부터 시작하여 현재 기호 차트에서 마지막 n+2m 바의 닫기 값을 복사합니다.

다음 단계는 Q 값을 계산하는 것입니다. 정의를 주의 깊게 읽으면 분석된 가격 시리즈의 i 번째 요소에 대해 가격 값 변수와 함께 exp() 함수의 m 결과를 ​​합산해야 함을 알 수 있습니다. 따라서 모든 Q 값을 계산하는 루프를 1에서 n까지 만들어야 합니다.

void calcQii()
  {
   int i,k;

   for(i=0; i<n; i++)
     {
      double sqiip1=0;
      double sqiim1=0;
      double dqiip1=0;
      double dqiim1=0;

      for(k=0; k<m; k++)
        {
         sqiip1 += MathExp(2*(S[m-1+i+k]-S[i])/(S[m-1+i+k]+S[i]));
         sqiim1 += MathExp(2*(S[m-1+i-k]-S[i])/(S[m-1+i-k]+S[i]));

         dqiip1 += MathExp(-2*(S[m-1+i+k]-S[i])/(S[m-1+i+k]+S[i]));
         dqiim1 += MathExp(-2*(S[m-1+i-k]-S[i])/(S[m-1+i-k]+S[i]));       
        }
      sQiip1[i] = sqiip1;
      sQiim1[i] = sqiim1;
      dQiip1[i] = dqiip1;
      dQiim1[i] = dqiim1;

     }
  }

보시다시피 calcQii 함수는 n 크기의 관찰된 가격 창에 대해 i번째 QQ` 값을 계산합니다. S 배열에는 가격 값이 저장되며 sQiip1, sQiim1, dQiip1, dQiim1QQ'의 중간 계산 변수로 사용됩니다.

확률은 QQ` 변수를 기반으로 계산되므로 sQii 및 dQii 배열을 통해 1에서 n까지 루프하는 또 다른 함수를 만들 수 있습니다.

void calcPii()
  {
   int i;

   for(i=0; i<n; i++)
     {
      sPiip1[i] = sQiip1[i] / (sQiip1[i] + sQiim1[i]);
      sPiim1[i] = sQiim1[i] / (sQiip1[i] + sQiim1[i]);
      dPiip1[i] = dQiip1[i] / (dQiip1[i] + dQiim1[i]);
      dPiim1[i] = dQiim1[i] / (dQiip1[i] + dQiim1[i]);
     }
  }

남은 것은 uSi 및 이후의 dSi 요소를 계산하고 그 결과를 uSi 및 dSi 배열에 넣는 것입니다 

void calcui()
  {
   int i;

   sui[0] = 1;
   dui[0] = 1;

   for(i=1; i<n; i++) 
     {
      sui[i] = (sPiim1[i]/sPiip1[i])*sui[i-1];
      dui[i] = (dPiim1[i]/dPiip1[i])*dui[i-1];
     }

   double uSum = 0;
   double dSum = 0;

   ArrayInitialize(uSi, 0.0);
   ArrayInitialize(dSi, 0.0);
   
   for(i=0; i<n; i++) { uSum+=sui[i]; dSum+=dui[i]; }
   for(i=0; i<n; i++) { uSi[n-1-i] = sui[i] / uSum; dSi[n-1-i] = dui[i] / dSum; }
 
  }

정규화 조건이 유효한지 확인하기 위해 다음 라인을 추가할 수 있습니다.

   double result=0;
   for(i=0; i<n; i++) { /* Print("i = "+i+" uSi = "+uSi[i]); */ result+=uSi[i]; }

   Print("Result = "+ DoubleToString(result));

모든 계산이 완료되면 지표 창에 표시해야 합니다. 이를 위해서는 uSi용과 dSi 어레이용으로 각각 두 개 이상의 지표 버퍼를 선언하고 지표 유형을 DRAW_LINE으로 정의해야 합니다. 

    #property indicator_separate_window

    #property indicator_buffers 2
    #property indicator_plots 2
    #property indicator_type1 DRAW_LINE
    #property indicator_type2 DRAW_LINE
    #property indicator_color1 SeaGreen
    #property indicator_color2 BlueViolet

그런 다음 SetIndexBuffer() 함수를 호출하여 INDICATOR_DATA로 표시할 uSi 및 dSi 배열을 할당합니다.

   SetIndexBuffer(0,uSi,INDICATOR_DATA);
   SetIndexBuffer(1,dSi,INDICATOR_DATA);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);

   PlotIndexSetInteger(0,PLOT_SHIFT,-(m-1));
   PlotIndexSetInteger(1,PLOT_SHIFT,-(m-1));

Fig.2 움직이는 mini-max 표시기

 그림 2. 무빙 mini-max 지표 구현 

글에 설명된 지표의 가능한 적용은 지지선과 저항선을 식별하고 지표의 고유한 평활화를 통해 차트 패턴을 식별하는 것입니다. 지지선과 저항선은 가격 시리즈의 이동 최소값과 이동 평균의 이동 최소값을 교차하여 형성됩니다.

가격이 로컬 최대값을 지나 이동 평균을 넘으면 저항이 생깁니다. 구현한 후 메소드에 몇 가지 잘못된 신호가 있는 것을 보았지만 ChartObjectsLines.mqh 라이브러리를 사용하여 MQL5에 라인을 넣는 방법에 대한 참조를 위해 소스 코드를 붙여넣고 있습니다. 

void SR()
{
   // if price goes through local maximum and crosses a moving average draw resistance
   int i, cnt=0;
   int rCnt=CopyClose(Symbol(),0,0,n+2*m,S);
      
   for (i=n-2; i>=0; i--)
      if (uSi[i]<uSi_MA[i] && uSi[i+1]>=uSi_MA[i+1]) 
      {
      Print("Resistance at " + i);
      CChartObjectHLine *line=new CChartObjectHLine();
      line.Create(0, "MiniMaxResistanceLine:"+IntegerToString(cnt), 0, S[i]);
      line.Color(LightSkyBlue);
      line.Width(1);
      line.Background(true);
      line.Selectable(false);
      cnt++;
      }
   // if price goes through local minimum and crosses a moving average draw support

   for (i=n-2; i>=0; i--)
      if (dSi[i]<dSi_MA[i] && dSi[i+1]>=dSi_MA[i+1]) 
      {
      Print("Support at " + i);
      CChartObjectHLine *line=new CChartObjectHLine();
      line.Create(0, "MiniMaxSupportLine:"+IntegerToString(cnt), 0, S[i]);
      line.Color(Tomato);
      line.Width(1);
      line.Background(true);
      line.Selectable(false);
      cnt++;
      }
}

하지만 이 지표의 흥미로운 사실은 지정된 기간 동안 로컬 단기 추세 최소값과 최대값을 상당히 잘 인식한다는 점입니다. 움직이는 미니 최대값의 최고값과 최저값 사이의 스프레드를 필터링하고 단기 강세 또는 약세 추세의 시작으로 표시하는 것으로 충분합니다.

우리는 수익성 있는 Expert Advisor을 만들기 위해 다른 지표 및 자금 관리에 따라 이 행동을 이용할 수 있습니다.

현재 시간 창에서 가장 높은 판독값을 표시하기 위해 추가 지표 버퍼를 사용하여 스프레드가 가장 클 때마다 위쪽 및 아래쪽 화살표를 표시할 수 있습니다. 또한 지표를 더 매력적으로 만들기 위해 MQL5의 새로운 기능인 색상 히스토그램을 사용하기로 결정했습니다. 하락 추세와 상승 추세는 서로 다른 색상으로 표시되며 추세 변화는 노란색 바로 표시됩니다. 

두 버퍼 사이에서 색상 히스토그램을 사용하려면 2개의 데이터 버퍼와 색상 인덱스용 한 개의 버퍼를 사용해야 합니다. 플롯을 정의하는 방법을 준수하십시오. 표시기 버퍼는 총 5개이며, 컬러 히스토그램에는 3가지 색상이 정의되어 있습니다.

//+------------------------------------------------------------------+
//|                                                MovingMiniMax.mq5 |
//|                                      Copyright 2011, Investeo.pl |
//|                                               http://Investeo.pl |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2011, Investeo.pl"
#property link        "http://Investeo.pl"

#property description "Moving Mini-Max indicator"
#property description "proposed by Z.K. Silagadze"
#property description "from Budker Institute of Nuclear Physics"
#property description "and Novosibirsk State University"
#property description "Original paper can be downloaded from:"
#property description "http://arxiv.org/abs/0802.0984"

#property version     "0.6"
#property indicator_separate_window

#property indicator_buffers 5
#property indicator_plots 3

#property indicator_type1 DRAW_COLOR_HISTOGRAM2
#property indicator_type2 DRAW_ARROW
#property indicator_type3 DRAW_ARROW

#property indicator_color1 Chartreuse, OrangeRed, Yellow
#property indicator_color2 RoyalBlue
#property indicator_color3 RoyalBlue

#property indicator_width1 5
#property indicator_width2 4
#property indicator_width3 4

히스토그램은 INDICATOR_DATA 유형의 버퍼 두 개와 INDICATOR_COLOR_INDEX 버퍼 하나를 사용합니다. 버퍼는 다음 순서로 정확하게 설정해야 합니다. 데이터 버퍼가 먼저 오고 그 다음에 색상 인덱스 버퍼가 정의됩니다.

   SetIndexBuffer(0,uSi,INDICATOR_DATA);
   SetIndexBuffer(1,dSi,INDICATOR_DATA);
   SetIndexBuffer(2,trend,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,upArrows,INDICATOR_DATA);
   SetIndexBuffer(4,dnArrows,INDICATOR_DATA);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);
   
   PlotIndexSetInteger(1,PLOT_ARROW,234);
   PlotIndexSetInteger(2,PLOT_ARROW,233); 

버퍼 0,1,2는 색상 히스토그램용이고 버퍼 3 및 4는 화살표 표시용입니다.

채색 알고리즘은 다음과 같습니다.

   if (upind<dnind) 
    { 
      for (i=0; i<upind; i++) trend[i]=0;
      for (i=upind; i<dnind; i++) trend[i]=1;
      for (i=dnind; i<n; i++) trend[i]=0 ;
    } else
    {
      for (i=0; i<dnind; i++) trend[i]=1;
      for (i=dnind; i<upind; i++) trend[i]=0;
      for (i=upind; i<n; i++) trend[i]=1;
   }
   
   trend[upind] = 2;
   trend[dnind] = 2;

 최종 결과의 스크린샷을 붙여넣습니다.

그림 2. 움직이는 Mini-Max 지표의 최종 버전

그림 3. 움직이는 Mini-Max 지표의 최종 버전

하락추세와 상승추세의 값은 새로운 바가 도착할 때마다 주어진 시간 창에 대해 계산된다는 것을 기억해야 합니다. 이것이 지표를 움직이는 mini-max라고 부르는 이유입니다.

m 바만큼 뒤쳐지지만 현재 시간대의 추세에 대한 놀라운 개요와 시장이 'breathers' 방식에 대한 해석을 제공합니다.

나는 이 지표가 수익성이 있을 수 있다고 확신합니다.

 

결론

나는 MQL5에서 기술적 분석과 구현을 위한 새로운 지표 이면에 수학을 제시했습니다.

Z.K.의 원본 논문 Silagadze는 http://arxiv.org/abs/0802.0984에서 이용할 수 있습니다. 첨부된 소스 코드를 다운로드할 수 있습니다.

앞으로 더 흥미로운 기술 지표와 MQL5 구현을 선보일 수 있기를 바랍니다.

 

참조:

1. G.Gamov, 알파 붕괴 이론.
2. Z.K. Silagadze, Moving Mini-Max - 기술 분석을 위한 새로운 지표.

MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/238

파일 첨부됨 |
movingminimax.mq5 (7.34 KB)
거래 내역을 기반으로 한 거래 플레이어 거래 내역을 기반으로 한 거래 플레이어
트레이딩 플레이어. 설명이 필요없는 딱 네 단어. 버튼이 있는 작은 상자에 대한 생각이 떠오릅니다. 버튼 하나 누르기 - 재생, 레버 이동 - 재생 속도가 변경됩니다. 실제로는 꽤 비슷합니다. 이 글에서는 거의 실시간으로 트레이딩 히스토리를 재생하는 제 발전을 보여주고 싶습니다. 이 글에서는 지표 작업 및 차트 관리, OOP의 일부 뉘앙스를 다룹니다.
NeuroSolutions Neuronet 연결 NeuroSolutions Neuronet 연결
Neuronet 생성 외에도 NeuroSolutions 소프트웨어 제품군을 사용하면 이를 DLL로 내보낼 수 있습니다. 이 글은 뉴로넷 (Neuronet) 생성, DLL 생성 및 MetaTrader 5 거래를 위해 Expert Advisor에 연결하는 과정을 설명합니다.
HTML의 차트 및 다이어그램 HTML의 차트 및 다이어그램
오늘날에는 웹 브라우저가 설치되어 있지 않은 컴퓨터를 찾기가 어렵습니다. 오랫동안 브라우저는 진화하고 개선되어 왔습니다. 이 문서에서는 브라우저에 표시하기 위해 MetaTrader 5 클라이언트 터미널에서 얻은 정보를 기반으로 차트와 다이어그램을 만드는 간단하고 안전한 방법에 대해 설명합니다.
MetaTrader 5의 다중 통화 모드 구현 MetaTrader 5의 다중 통화 모드 구현
오랫동안 다중 통화 분석 및 다중 통화 거래는 많은 사람들의 관심을 불러일으켜왔습니다. 완전한 다중 통화 체제를 구현할 수 있는 기회는 MetaTrader 5 및 MQL5 프로그래밍 언어의 공개 릴리스에서만 가능했습니다. 이 글에서는 여러 기호에 대해 들어오는 모든 틱을 분석하고 처리하는 방법을 제안합니다. 예를 들어 USDx 달러 인덱스의 다중 통화 RSI 지표를 살펴보겠습니다.