English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
여러 중간 인디케이터 버퍼들을 통해 다중 화폐 인디케이터 만들기

여러 중간 인디케이터 버퍼들을 통해 다중 화폐 인디케이터 만들기

MetaTrader 5지표 | 5 7월 2021, 15:15
135 0
Alexey Klenov
Alexey Klenov

들어가며

이 모든 것은 제가 외환거래를 위한 클러스터 인디케이터 생성의 이론적 기초 문서에서 클러스터 인디케이터에 대해 들었을 때 시작됐습니다. 당시 상당히 인상깊게 들렸기에 다중 마켓 분석 차원에서 뭔가 비슷한 것을 짜기로 결정했습니다. 처음에는 통화 지수의 계산된 값을 사용하여 기존 지표(RSI, MACD, CCI)의 비율을 계산하는 코드명 MultiCurrencyIndex라는 저만의 인디케이터 버전을 구현했습니다.  

이제 이 인디케이터를 MQL5와 보완하여 새로운 플랫폼인 MetaTrader 5로 이전한 방법을 설명하겠습니다. 단, CCI를 계산하는 대신 Stochastic Oscillator(Stochastic Oscillator) 인디케이터를 계산하여 좀 더 미래지향적인(내 의견)을 제시할 것입니다.

몇가지 정의를 먼저 하고 넘어가겠습니다.

달러 인덱스(Dollar Index)  - - 공식으로 계산한 double 값, Neutron이 제공해주었습니다.

USD  인덱스 계산 공식,

USD / YYY 식은 전부 직접 시세로 USD / CHF 같은 예가 있고, XXX / USD 같은건 역시세입니다. 예시는 EUR / USD.

기타 지수는 USD를 포함한 통화 쌍 종가로 계산됩니다.

주요 선 - 인디케이터의 두 줄, 계산된 데이터를 반영, 현재 그래프에 직접적으로 관련되어있음. 예를 들어, EURUSD 그래프에서는 EUR 및 USD 통화 라인이 표시됩니다.

보조 선 - 현 그래프와 관계 없는 다른 계산된 인디케이터 선. 예를 들어 동일한 EURUSD 그래프의 경우 GBP, CHF, JPY, CAD, AUD 및 NZD 통화의 선이 됩니다.

종가 - 필요한 통화 쌍에 대한 현재 기간(유형 이중) 바의 종가 값.

시작해봅시다.

문제 제기

시작하려면 먼저 문제가 뭔지 파악할 필요가 있습니다.

  1. 이 기간 동안 영향을 받는 통화 쌍의 그래프를 동기화하십시오.
  2. EURUSD, GBUSD, USDCHF, USDJPY, USDCAD, AUDUSD, NZDUSD 등 7개 통화 쌍의 근접 데이터에 액세스하여 보조 계산을 위해 설계된 인디케이터 버퍼에 넣습니다.
  3. 2번 항목에서 얻어진 데이터에 기반하여 현재 바에서 이하의 계산이 필요합니다 달러 인덱스.
  4. 현재 바의 달러 인덱스 를 알았다면 남은 화폐 인덱스에 대해 계산합시다.
  5. 선택한 기록 길이에 대해 필요한 횟수만큼 데이터 계산(항목 3 및 4)을 수행합니다.
  6. 인디케이터의 대상에 따라 선택한 각 인덱스의 통화 값을 계산합니다:
    • 상대강도지수 (Relative Strength Index, RSI);
    • 컨버전스 / 다이버전스 이동 평균 (Moving Average Convergence / Divergence, MACD);
    • 스토캐스틱 오실레이터 (Stochastic Oscillator);
    • 미래에 목록이 추가될 수도 있습니다.

이를 위해 우리에게 필요한 것은:

31 인디케이터 버퍼:

  • 0-7 - 마지막 라인을 렌더링하는 버퍼;
  • 8-14 - USD를 포함한 주요 화폐쌍 용 버퍼;
  • 15-22 - 화폐 인덱스 버퍼;
  • 23-30 - 비평활 중간 데이터 stochastics close / close 타입 버퍼

인디케이터의 목적지를 선택하기 위해 enumerated 타입 enum 을 만들겠습니다 :

enum Indicator_Type
  {
   Use_RSI_on_indexes             = 1, // RSI of the index  
   Use_MACD_on_indexes            = 2, // MACD from the index  
   Use_Stochastic_Main_on_indexes = 3  // Stochastic on the index
  };
다음으로 input  커맨드를 써서 인디케이터 기본 설정 창의 목록에서 사용자 선택을 유도합니다. 
input Indicator_Type ind_type=Use_RSI_on_indexes;  // type of the indicator from the index

"입력" 탭에 입력 패러미터의 이름을 표시하는 등, 보다 사용자 친화적인 방법을 만들 수 있습니다. 이를 위해 입력 패러미터의 설명 뒤에 반드시 넣어야 하는 긴급 코멘트를 동일한 행에 추가합니다. 따라서 입력 패러미터를 사용자가 쉽게 이해할 수 있는 이름과 비교할 수 있습니다.

리스팅 커맨드 enum 에도 똑같은 법칙이 적용됩니다 . 그것은 바로 예를 들어, 니모닉 이름 대신 니모닉 이름이 코멘트와 연결된 경우, 이 코멘트의 내용이 표시된다는 것입니다. . 이를 통해 입력 패러미터에 대한 명확한 설명과 함께 프로그램을 작성할 수 있습니다.

개발자는 최종 사용자가 코드로 작성된 이름 대신 이해할 수 있는 패러미터 이름을 볼 수 있도록 함으로써 MQL5 프로그램으로 작업할 수 있는 편리한 방법을 제공하려고 했습니다. 더 자세한 정보는 여기에서 확인할 수 있습니다.

1번 그림. 인디케이터 타입 고르기

1번 그림. 인디케이터 타입 고르기

유저에게 인디케이터 및 색 렌더링을 위해 필요한 화폐의 선택지를 줍니다.:

input bool USD=true;
input bool EUR=true;
input bool GBP=true;
input bool JPY=true;
input bool CHF=true;
input bool CAD=true;
input bool AUD=true;
input bool NZD=true;

input color Color_USD = Green;            // USD line color
input color Color_EUR = DarkBlue;         // EUR line color
input color Color_GBP = Red;             // GBP line color
input color Color_CHF = Chocolate;        // CHF line color
input color Color_JPY = Maroon;           // JPY line color
input color Color_AUD = DarkOrange;       // AUD line color
input color Color_CAD = Purple;          // CAD line color
input color Color_NZD = Teal;            // NZD line color

2번 그림. 인디케이터 선의 색상 고르기

2번 그림. 인디케이터 선의 색상 고르기

그 외 몇개의 설정가능한 패러미터:

input string rem000        =  ""; // depending on the type of the indicator
input string rem0000       =  ""; // requires a value :
input int rsi_period       =   9; // period RSI
input int MACD_fast        =   5; // period MACD_fast
input int MACD_slow        =  34; // period MACD_slow
input int stoch_period_k   =   8; // period Stochastic %K
input int stoch_period_sma =   5; // period of smoothing for Stochastics %K
input int shiftbars        = 500; // number of bars for calculating the indicator

3번 그림. 인디케이터 패러미터

3번 그림. 인디케이터 패러미터

인디케이터 계산을 위한 500 바의 한계는 인위적이지만 계산 개념을 충분히 입증하기에 충분합니다. 그러나 각 인디케이터 버퍼에는 메모리가 필요하며 변수 크기가 매우 큰 디스플레이(수백만 개 막대 단위)로 인해 컴퓨터의 메모리가 충분하지 않을 수 있습니다.

인디케이터 버퍼:

double  EURUSD[], // quotes
        GBPUSD[],
        USDCHF[],
        USDJPY[],
        AUDUSD[],
        USDCAD[],
        NZDUSD[];   
               
double    USDx[], // indexes
          EURx[],
          GBPx[],
          JPYx[],
          CHFx[],
          CADx[],
          AUDx[],
          NZDx[];
                         
double USDplot[], // results of currency lines
       EURplot[],
       GBPplot[],
       JPYplot[],
       CHFplot[],
       CADplot[],
       AUDplot[],
       NZDplot[]; 

double USDStoch[], // buffers of intermediate data schotastics by the close/close type without smoothing
       EURStoch[],
       GBPStoch[],
       JPYStoch[],
       CHFStoch[],
       CADStoch[],
       AUDStoch[],
       NZDStoch[];
그리고 몇몇 글로벌 (인디케이터 레벨) 변수도 필요합니다:
int              i,ii;
int           y_pos=0; // Y coordinate variable for the informatory objects  
datetime   arrTime[7]; // Array with the last known time of a zero valued bar (needed for synchronization)  
int        bars_tf[7]; // To check the number of available bars in different currency pairs  
int        countVal=0; // Number of executable Rates  
int           index=0;
datetime  tmp_time[1]; // Intermediate array for the time of the bar 

이제 상당히 긴 OnInit 기능을 사용하여 인디케이터 버퍼를 용도에 맞게 배포합니다.

초기 계산은 달러 인덱스를 통과하므로, USD의 경우 통화 인디케이터 버퍼 렌더링을 비활성화할 수 있는 가능성을 설정하기만 하면 됩니다.

이처럼 보입니다:

if(USD)
  {
   countVal++;
   SetIndexBuffer(0,USDplot,INDICATOR_DATA);               // array for rendering
   PlotIndexSetString(0,PLOT_LABEL,"USDplot");              // name of the indicator line (when selected with a mouse)
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,shiftbars);       // from which we begin rendering
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (line)
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Color_USD);       // color of line rendering
   if(StringFind(Symbol(),"USD",0)!=-1)
     {PlotIndexSetInteger(0,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains USD 
                                                       // then draw a line of appropriate width 
   else
     {PlotIndexSetInteger(0,PLOT_LINE_STYLE,style_slave);}
   ArraySetAsSeries(USDplot,true);                       // indexation of array as a timeseries   
   ArrayInitialize(USDplot,EMPTY_VALUE);                  // zero values 
   f_draw("USD",Color_USD);                            // rendering in the indicator information window 
  }
SetIndexBuffer(15,USDx,INDICATOR_CALCULATIONS);            // array of dollar index for calculations
                                                      // (is not displayed in the indicator as a line) 
ArraySetAsSeries(USDx,true);                            // indexation of an array as a time series
ArrayInitialize(USDx,EMPTY_VALUE);                       // zero values

if(ind_type==Use_Stochastic_Main_on_indexes)
  {
   SetIndexBuffer(23,USDstoch,INDICATOR_CALCULATIONS);     // if the destination of the indicator as a Use_Stochastic_Main_on_indexes,
                                                           // then this intermediate array is needed
   ArraySetAsSeries(USDstoch,true);                        // indexation of array as a time series
   ArrayInitialize(USDstoch,EMPTY_VALUE);                  // zero values
  }
EUR 화폐 용 함수 코드 OnInit 는 이것처럼 보입니다:
if(USD)
  {
   countVal++;
   SetIndexBuffer(0,USDplot,INDICATOR_DATA);              // array for rendering
   PlotIndexSetString(0,PLOT_LABEL,"USDplot");             // name of the indicator line (when selected with a mouse)
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,shiftbars);       // from which we begin rendering
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (line)
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Color_USD);       // color of line rendering
   if(StringFind(Symbol(),"USD",0)!=-1)
     {PlotIndexSetInteger(0,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains USD 
                                                       // then draw a line of appropriate width 
   else
     {PlotIndexSetInteger(0,PLOT_LINE_STYLE,style_slave);}
   ArraySetAsSeries(USDplot,true);                       // indexation of array as a timeseries
   ArrayInitialize(USDplot,EMPTY_VALUE);                  // zero values 
   f_draw("USD",Color_USD);                             // rendering in the indicator information window 
  }
SetIndexBuffer(15,USDx,INDICATOR_CALCULATIONS);             // array of dollar index for calculations
                                                       // (is not displayed in the indicator as a line) 
ArraySetAsSeries(USDx,true);                             // indexation of an array as a time series
ArrayInitialize(USDx,EMPTY_VALUE);                        // zero values

if(ind_type==Use_Stochastic_Main_on_indexes)
  {
   SetIndexBuffer(23,USDstoch,INDICATOR_CALCULATIONS);      // if the destination of the indicator as a Use_Stochastic_Main_on_indexes,
                                                       // then this intermediate array is needed
   ArraySetAsSeries(USDstoch,true);                      // indexation of array as a time series
   ArrayInitialize(USDstoch,EMPTY_VALUE);                 // zero values
  }

if(EUR)
  {
   countVal++;
   SetIndexBuffer(1,EURplot,INDICATOR_DATA);              // array for rendering
   PlotIndexSetString(1,PLOT_LABEL,"EURplot");             // name of the indicator line (when pointed to with a mouse)
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,shiftbars);       // which we begin rendering from
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (lines)
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Color_EUR);       // the color of rendering lines
   if(StringFind(Symbol(),"EUR",0)!=-1)
     {PlotIndexSetInteger(1,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains EUR
                                                       // then we draw a line of the appropriate width 
   else
     {PlotIndexSetInteger(1,PLOT_LINE_STYLE,style_slave);}  // if the symbol name does NOT contain EUR,
                                                       // then we draw a line of an appropriate style (on the crosses)
   ArraySetAsSeries(EURplot,true);                       // indexation of the array as a time series
   ArrayInitialize(EURplot,EMPTY_VALUE);                  // zero values
   SetIndexBuffer(8,EURUSD,INDICATOR_CALCULATIONS);        // data of Close currency pair EURUSD
   ArraySetAsSeries(EURUSD,true);                        // indexation of the array as a time series
   ArrayInitialize(EURUSD,EMPTY_VALUE);                   // zero values
   SetIndexBuffer(16,EURx,INDICATOR_CALCULATIONS);         // array of the EURO index for calculations
                                                      // (not displayed on the indicator as a line) 
   ArraySetAsSeries(EURx,true);
   ArrayInitialize(EURx,EMPTY_VALUE);
   if(ind_type==Use_Stochastic_Main_on_indexes)
     {
      SetIndexBuffer(24,EURstoch,INDICATOR_CALCULATIONS);   // if the indicator destination as a Use_Stochastic_Main_on_indexes,
                                                       // then this intermediate array is needed
      ArraySetAsSeries(EURstoch,true);                   // indexation of the array as a time series
      ArrayInitialize(EURstoch,EMPTY_VALUE);              // zero values
     }
   f_draw("EUR",Color_EUR);                            // rendering in the indicator information window
  }
EUR과 비슷하게 코드는 GBP, JPY, CHF, CAD, AUD, NZD와 같은 통화에도 유사하게 표시기 버퍼의 색인을 이동시킵니다. 이들 화폐용의 코드는 인디케이터의 첨부 파일에 있습니다.

이로써 인디케이터 초기화의 설명이 끝났습니다.

다음으로 우리는 커스텀 유저 기능이 몇개 필요합니다.

  • 유저 버퍼 위에서 RSI 계산.
  • MACD 계산하기
  • 유저 버퍼 위에서 SMA 계산
  • 비평활상태로 Stochastic close / close 계산하기
  • 객체 (정보) 렌더링
  • 인디케이터(상태 인디케이터) 우하단 구석의 코멘트
  • 영향받은 TF 화폐 쌍의 초기화

이들에 대한 간력한 설명:

  • 유저 버퍼 위에서 RSI 계산.

입력 패러미터:

double f_RSI(double &buf_in[], int period,int shift),

buf_in[] - double 타입 어레이 (timeseries 같은), period - 인디케이터 기간 RSI, shift - 인디케이터 계산을 하는 바. double 타입 값을 하나 반환합니다.

  • MACD 계산하기

입력 패러미터:

double f_MACD(double &buf_in[], int period_fast,int period_slow,int shift),

buf_in[]  - double 타입 어레이(timeseries 같은), period_fast - 빠른 기간 МА, period_slow - 느린 기간 МА, shift - 인디케이터 계산을 하는 바. double 타입 값을 하나 반환합니다.

  • SMA 계산

입력 패러미터:

double SimpleMA(const int position,const int period,const double &price[]),

position - 인디케이터 계산을 하는 인덱스의 바 period - SMA 인디케이터의 기간, price[] - time double 어레이 (time series 같은). double 타입 값을 하나 반환합니다.

  • 비평활상태로 Stochastic close / close 계산하기

입력 패러미터:

double f_Stoch(double &price[], int period_k, int shift),

price[] - double 타입 어레이 (time series 같은), period_fast - 기간 %K 인디케이터 라인, shift - 인디케이터 계산을 하는 인덱스의 바 double 타입 값을 하나 반환합니다.

  • 객체 렌더링

입력 패러미터:

int f_draw(string name, color _color)

name - 객체명, _color - 객체색. 이 함수는 정보 목적입니다. 이 기능은 창 디스플레이 오른쪽 위부터 아래로, 영향을 받는 통화의 이름을 표시합니다 통화 텍스트는 이 통화와 관련된 표시 줄과 동일한 색상입니다.

  • 코멘트는 인디케이터 우하단 구석에 있습니다.

입력 패러미터:

int f_comment(string text)

text - 인디케이터 우하단에 놓여야하는 텍스트.. 인디케이터 작업의 상태표시줄 비슷한 겁니다.

마지막으로 가장 중요한 함수 중 하나의 정리와 결론:

  • 영향받은 TF 화폐 쌍의 초기화

입력 패러미터 없음

MetaTrader 5 이력은 TF의 minute data 형태로 툴마다 저장됩니다. TF 분 데이터를 기반으로 터미널이 열리면 프로그램 시작 전 필요한 (영향받은) 그래프가 모두 구성되어 있습니다. 현재 트래픽 TF가 전환되고 있거나 MQL5 프로그램 코드를 통해 TF의 그래프에 액세스하는 동안에도 구성이 이루어집니다.

그러므로:

  • 터미널을 처음 시작하는 동안 사용된 통화 쌍의 필수 TF를 구축하는 데 약간의 시간이 필요합니다(예: 배경도 볼 수 없음).
  • 인디케이터를 정확하게 표시하기 위해 영향을 받는 모든 통화에 대해 0 막대를 동기화합니다. 다시 말해, 그래프에 새 수신 체크 표시가 있는 경우(예: 시간 바) 다른 통화 쌍에 대한 체크 표시의 수입을 기다려야 합니다. 그러면 새 표시줄이 열립니다(새 시간 그러고 나서야 새 바의 인디케이터 계산으로 넘어갈 수 있습니다.

이 작업의 첫 파트는 내장 Bars 함수를 이용해 처리되는데 이 함수는 심볼에 대한 대응 기간 동안 안에 이력에 있는 바의 숫자를 반환합니다. 아래에 나와 있는 이 기능의 버전을 사용하기에 충분합니다.

int  Bars(
   string          symbol_name,   // symbol name
   ENUM_TIMEFRAMES   timeframe    // period
   );

이 어레이에 대해 특별히 발표된 에서는 영향을 받는 모든 통화 쌍에 대해 사용 가능한 바 수를 수집합니다. 각 값에 필요한 최소한의 이력(지표 파라미터의 "지표 계산을 위한 막대 수" 변수)을 확인합니다. 기구 이력에서 사용 가능한 바 수가 이 변수의 값보다 작다면, 우리는 프로그램이 성공하지 못한 것으로 간주하고 사용 가능한 데이터의 수를 다시 검토합니다. 사용자가 요청한 것보다 모든 통화 페어에 대해 사용 가능한 기록이 더 많으면 이 부분의 초기화가 성공적으로 완료된 것으로 간주할 수 있습니다.

동기화 작업의 두 번째 부분은 CopyTime 함수를 사용하여 구현됩니다.

 영향받은 기구에서 0 바의 오프닝을 복사하여 이 목적으로 특별히 만든 어레이에 넣습니다. 이 어레이의 모든 요소가 동일하고 0과 같지 않으면 0 바가 동기화된 것으로 간주하고 계산을 시작하겠습니다. 자세한 내용은 첨부된 인디케이터의 코드를 참조하십시오.

이것으로 추가 기능에 대한 설명을 마치며 OnCalculate 함수 구현으로 넘어가겠습니다. 다중 화폐 표시기이므로 이 기능의 요청에 대한 두 번째 버전이 필요합니다.

int OnCalculate(const int     rates_total, // size of incoming time series
                const int prev_calculated, // processing of bars on the previous request
                const datetime&    time[], // Time
                const double&      open[], // Open
                const double&      high[], // High
                const double&       low[], // Low
                const double&     close[], // Close
                const long& tick_volume[], // Tick Volume
                const long&      volume[], // Real Volume
                const int&       spread[]  // Spread
   );

다음 계산에 필요한 바의 수를 판단합니다:

   int limit=shiftbars;

   if(prev_calculated>0)
     {limit=1;}
   else
     {limit=shiftbars;}

화폐쌍의 동기화된 그래프:

   init_tf();

이제 CopyClose 함수를 통하여 모든 필수 통화 쌍의 종가 값을 복사하여 이를 위해 특별히 준비된 인디케이터 버퍼에 넣습니다. ( 도움에서 현재 툴이나 다른 툴의 다른 TF 데이터를 알 수 있습니다 )

어떤 이유로든 기능이 데이터를 복사하지 않고 -1를 반환한 경우, 코멘트에 통화 쌍 오류 메시지를 표시하고 현재 기구에 대한 새 틱이 수신되기를 기다립니다.

   if (EUR){copied=CopyClose("EURUSD",PERIOD_CURRENT,0,shiftbars,EURUSD); if (copied==-1){f_comment("Wait...EURUSD");return(0);}}
   if (GBP){copied=CopyClose("GBPUSD",PERIOD_CURRENT,0,shiftbars,GBPUSD); if (copied==-1){f_comment("Wait...GBPUSD");return(0);}}
   if (CHF){copied=CopyClose("USDCHF",PERIOD_CURRENT,0,shiftbars,USDCHF); if (copied==-1){f_comment("Wait...USDCHF");return(0);}}
   if (JPY){copied=CopyClose("USDJPY",PERIOD_CURRENT,0,shiftbars,USDJPY); if (copied==-1){f_comment("Wait...USDJPY");return(0);}}
   if (AUD){copied=CopyClose("AUDUSD",PERIOD_CURRENT,0,shiftbars,AUDUSD); if (copied==-1){f_comment("Wait...AUDUSD");return(0);}}
   if (CAD){copied=CopyClose("USDCAD",PERIOD_CURRENT,0,shiftbars,USDCAD); if (copied==-1){f_comment("Wait...USDCAD");return(0);}}
   if (NZD){copied=CopyClose("NZDUSD",PERIOD_CURRENT,0,shiftbars,NZDUSD); if (copied==-1){f_comment("Wait...NZDUSD");return(0);}}  

그 다음, 사이클 (0에서 제한) 안에서 이를 생성합니다:

  • 달러 인덱스 계산;
  • 현재 막대에 대한 종가 및 달러 지수에 기초한 기타 통화 지수 계산
for (i=limit-1;i>=0;i--)
   {
      //calculation of USD index
      USDx[i]=1.0;
      if (EUR){USDx[i]+=EURUSD[i];}         
      if (GBP){USDx[i]+=GBPUSD[i];}
      if (CHF){USDx[i]+=1/USDCHF[i];}
      if (JPY){USDx[i]+=1/USDJPY[i];}
      if (CAD){USDx[i]+=1/USDCAD[i];}
      if (AUD){USDx[i]+=AUDUSD[i];}
      if (NZD){USDx[i]+=NZDUSD[i];}
      USDx[i]=1/USDx[i];
      //calculation of other currency values
      if (EUR){EURx[i]=EURUSD[i]*USDx[i];}
      if (GBP){GBPx[i]=GBPUSD[i]*USDx[i];}
      if (CHF){CHFx[i]=USDx[i]/USDCHF[i];}
      if (JPY){JPYx[i]=USDx[i]/USDJPY[i];}
      if (CAD){CADx[i]=USDx[i]/USDCAD[i];}
      if (AUD){AUDx[i]=AUDUSD[i]*USDx[i];}
      if (NZD){NZDx[i]=NZDUSD[i]*USDx[i];}
   }

이 데이터는 적절한 인디케이터 버퍼에 배치됩니다. 초기화 중에 사용자가 선택한 표시기 유형을 확인하고 이를 기반으로 관련 계산을 수행합니다.

인덱스의 RSI를 보고 싶은 경우 아래 코드를 실행합니다.

if (ind_type==Use_RSI_on_indexes)
   {
      if (limit>1){ii=limit - rsi_period - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
            if (USD){USDplot[i]=f_RSI(USDx,rsi_period,i);}
            if (EUR){EURplot[i]=f_RSI(EURx,rsi_period,i);}
            if (GBP){GBPplot[i]=f_RSI(GBPx,rsi_period,i);}
            if (CHF){CHFplot[i]=f_RSI(CHFx,rsi_period,i);}
            if (JPY){JPYplot[i]=f_RSI(JPYx,rsi_period,i);}
            if (CAD){CADplot[i]=f_RSI(CADx,rsi_period,i);}
            if (AUD){AUDplot[i]=f_RSI(AUDx,rsi_period,i);}
            if (NZD){NZDplot[i]=f_RSI(NZDx,rsi_period,i);}                  
         }
   }  

인덱스별로 MACD를 보려면 여기로 이동합니다(그러나 지금까지는 SimpleMA를 기반으로만 구현되며 나중에 EMA를 기반으로 구현됩니다).

if (ind_type==Use_MACD_on_indexes)
   {
      if (limit>1){ii=limit - MACD_slow - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
           if (USD){USDplot[i]=f_MACD(USDx,MACD_fast,MACD_slow,i);}
           if (EUR){EURplot[i]=f_MACD(EURx,MACD_fast,MACD_slow,i);}
           if (GBP){GBPplot[i]=f_MACD(GBPx,MACD_fast,MACD_slow,i);}
           if (CHF){CHFplot[i]=f_MACD(CHFx,MACD_fast,MACD_slow,i);}
           if (JPY){JPYplot[i]=f_MACD(JPYx,MACD_fast,MACD_slow,i);}
           if (CAD){CADplot[i]=f_MACD(CADx,MACD_fast,MACD_slow,i);}
           if (AUD){AUDplot[i]=f_MACD(AUDx,MACD_fast,MACD_slow,i);}
           if (NZD){NZDplot[i]=f_MACD(NZDx,MACD_fast,MACD_slow,i);}                  
         }
   } 

Stochastis의 경우, 먼저 라인 % K를 계산한 다음 SimpleMA 메소드로 평활화해야 합니다. 마지막 평활선이 그래프에 표기됩니다.

if (ind_type==Use_Stochastic_Main_on_indexes)
   {
      if (limit>1){ii=limit - stoch_period_k - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
           if (USD){USDstoch[i]=f_Stoch(USDx,rsi_period,i);}
           if (EUR){EURstoch[i]=f_stoch(EURx,stoch_period_k,i);}
           if (GBP){GBPstoch[i]=f_stoch(GBPx,stoch_period_k,i);}
           if (CHF){CHFstoch[i]=f_stoch(CHFx,stoch_period_k,i);}
           if (JPY){JPYstoch[i]=f_stoch(JPYx,stoch_period_k,i);}
           if (CAD){CADstoch[i]=f_stoch(CADx,stoch_period_k,i);}
           if (AUD){AUDstoch[i]=f_stoch(AUDx,stoch_period_k,i);}
           if (NZD){NZDstoch[i]=f_stoch(NZDx,stoch_period_k,i);}                  
         }
      if (limit>1){ii=limit - stoch_period_sma - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
            if (USD){USDplot[i]=SimpleMA(i,stoch_period_sma,USDstoch);}
            if (EUR){EURplot[i]=SimpleMA(i,stoch_period_sma,EURstoch);}
            if (GBP){GBPplot[i]=SimpleMA(i,stoch_period_sma,GBPstoch);}
            if (CHF){CHFplot[i]=SimpleMA(i,stoch_period_sma,CHFstoch);}
            if (JPY){JPYplot[i]=SimpleMA(i,stoch_period_sma,JPYstoch);}
            if (CAD){CADplot[i]=SimpleMA(i,stoch_period_sma,CADstoch);}
            if (AUD){AUDplot[i]=SimpleMA(i,stoch_period_sma,AUDstoch);}
            if (NZD){NZDplot[i]=SimpleMA(i,stoch_period_sma,NZDstoch);}                  
          }                     
   }       

이걸로 인디케이터 계산이 마무리됩니다. 4-6번 그림에서 각기 다른 타입의 인디케이터의 사진 몇개를 볼 수 있습니다.

4번 그림. 인덱스에 따른 RSI

4번 그림. 인덱스에 따른 RSI

5번 그림. 화폐 인덱스에 따른 MACD

5번 그림. 화폐 인덱스에 따른 MACD

6번 그림. 화폐 인덱스에 따른 Stochastis

6번 그림. 화폐 인덱스에 따른 Stochastis

마치며

MultiCurrencyIndex 인디케이터를 구현할 때에 저는 MQL5에서 무제한 인디케이터 버퍼를 활용했는데 덕분에 코드를 몹시 간략화할 수 있었습니다. 이 문서는 그러한 접근방법의 예시입니다. 인디케이터의 신뢰할 수 있는 데이터를 위해 0 바에 상대적인 다양한 기구의 동기화 알고리즘을 시연했습니다. 또한 인디케이터가 부착된 심볼을 기준으로 다른 기구에서 데이터에 액세스할 수 있는 알고리즘 중 하나를 시연했습니다.

이 글의 목적은 엄청난 양의 인디케이터 버퍼로 작업할 가능성을 입증하는 것이었기 때문에, 위의 기능은 사용자의 데이터 어레이에 의한 인디케이터 계산 기능이 독자에게 과도한 부담을 주지 않도록 하는 최적의 방법이 아니었습니다. 그러나 필요한 계산을 하는데에는 충분하고도 남았죠.

외환 시장에서 클러스터 분석을 하는 것에는 장단점이 있습니다. 이 방식의 접근법을 기반으로한 매매 시스템은 공짜로 제공되며, 이에 대한 논의는MQL4.커뮤니티를 포함한 여러 포럼에서 이루어지고 있습니다. 따라서 이 인디케이터에 의한 매매 원칙은 이 문서에서 고려되지 않습니다.

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

포지션 중심적 MetaTrader5 환경에서 주문 추적을 위해 가상 주문 매니저 활용하기 포지션 중심적 MetaTrader5 환경에서 주문 추적을 위해 가상 주문 매니저 활용하기
이 클래스 라이브러리를 MetaTrader 5 Expert Advisor에 추가하면 MetaTrader 5의 포지션 기반 접근 방식이 아닌, MetaTrader 4와 거의 유사한 주문 중심의 접근 방식으로 작성할 수 있습니다. 이를 위해 MetaTrader 5 클라이언트 터미널의 가상 주문을 추적하는 동시에 재앙 보호를 위한 각 위치에 대한 보호 브로커 스톱을 유지합니다.
MQL4에서 MQL5로 이전하기 MQL4에서 MQL5로 이전하기
이 문서는 MQL4 언어 함수에 대한 간략한 가이드로, 프로그램을 MQL4에서 MQL5로 이전하는데에 도움을 드릴 것입니다. MQL4 함수마다 (거래 함수 제외) 설명과 대응하는 MQL5쪽의 구현이 적혀있어 이전하는데에 드는 시간을 눈에 띄게 줄여줄 것입니다.. 편의를 위해 MQL4 함수들은 MQL4 레퍼런스처럼 그룹별로 나뉘어있습니다.
Haiken-Ashi(평균족) 인디케이터에 기반한 매매 시스템 예시 Haiken-Ashi(평균족) 인디케이터에 기반한 매매 시스템 예시
이 문서에서 우리는 매매에서 Haiken-Ashi 인디케이터를 쓰는 법에 대해 알아보겠습니다 . 이 인디케이터를 기반으로 간단한 매매 시스템을 고안해보고 MQL5 Expert Advisor를 하나 짜보겠습니다. 매매 작업은 표준 클래스 라이브러리의 클래스들을 기반으로 구현되었습니다. 검토된 매매 전략의 과거 기력을 기반으로한 시험 결과는 내장 MetaTrader 5 전략 테스터를 이용하여 이루어졌으며, 이 문서 내에서 확인하실 수 있습니다.
MetaTrader 5: 이메일을 통해 거래 전망과 실시간 거래 명세서를 블로그, SNS, 지정된 웹사이트에 게시하기 MetaTrader 5: 이메일을 통해 거래 전망과 실시간 거래 명세서를 블로그, SNS, 지정된 웹사이트에 게시하기
이 문서는 MetaTrader 5를 통해 시장 예상을 게시할 수 있게 해주는 레디메이드 솔루션을 다룰 것입니다. MetaTrader 명세서를 게시하기 위해 전용 웹 사이트를 사용하는 것에서부터 웹 프로그래밍 경험이 거의 필요 없는 자체 웹 사이트를 구축하는 것, 그리고 마지막으로 많은 독자들이 예측에 참여하고 따를 수 있는 소셜 네트워크 마이크로블로깅 서비스와의 통합에 이르기까지 다양한 아이디어를 다루고 있습니다. 이 문서에서 다룰 솔루션들은 100% 무료이며, 이메일이나 ftp 서비스에 대한 기초적인 지식이 있는 독자라면 누구건 따라할 수 있습니다. 전문 호스팅 및 상업 거래 예측 서비스에 동일한 기술을 사용하는 데도 어렵지 않습니다.