English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
포스 인덱스 지표로 트레이딩 시스템을 설계하는 방법 알아보기

포스 인덱스 지표로 트레이딩 시스템을 설계하는 방법 알아보기

MetaTrader 5트레이딩 | 14 7월 2023, 11:39
371 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

이 글은 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법과 관련한 시리즈의 새로운 글입니다. 이 글에서는 포스 인덱스 지표로 트레이딩 시스템을 만드는 방법에 대해 알아보도록 하겠습니다. 다음 주제를 다루면서 이 지표에 대해 자세히 알아볼 것입니다:

  1. 포스 인덱스 정의
  2. 포스 인덱스 전략
  3. 포스 인덱스 전략 청사진
  4. 포스 인덱스 거래 시스템
  5. 결론

위의 주제를 통해 이 기술 지표에 대해 더 자세히 알아볼 것입니다. 포스 인덱스의 정의라는 주제를 통해 포스 인덱스가 무엇이고, 무엇을 측정하며, 이 지표를 어떻게 계산할 수 있는지 알아볼 것입니다. 이 지표의 기본 개념을 이해한 후 포스 인덱스 전략이라는 주제를 통해 간단한 전략을 사용하는 방법에 대해 알아 봅니다. 어떤 전략을 실행하는 거래 시스템을 만들 때 이를 원활하게 수행하도록 하기 위해서는 아이디어를 정리할 필요가 있습니다. 포스 인덱스 전략 청사진이라는 주제를 통해 언급 된 각 전략에 대한 청사진을 설계하여 목표를 원활하고 효과적으로 달성 할 수 있도록 할 것입니다. 단계별 청사진을 통해 아이디어를 정리한 후 포스 인덱스 트레이딩 시스템이라는 주제를 통해 MetaTrader 5 트레이딩 플랫폼에서 자동으로 정확하게 신호를 생성할 트레이딩 시스템을 만들 것입니다.

MetaTrader 5 거래 터미널에 내장된 MQL5(메타쿼츠 언어)를 사용하여 거래 시스템의 코드를 작성할 것입니다. 다운로드 및 사용 방법을 알아보려면 이전 글 메타에디터에서 MQL5 코드 작성하기라는 글을 읽어보세요. 실계정에서 사용하기 전에 전략을 테스트해야 합니다.

면책: 모든 정보는 정보 제공의 목적으로만 '있는 그대로' 제공되며 거래의 목적이나 자문을 위해 준비된 것이 아닙니다. 여기의 정보는 어떤 종류의 결과도 보장하지 않습니다. 귀하의 거래 계정에서 이들 자료를 사용하기로 한 경우 귀하는 이에 대한 위험을 감수해야 하며 이에 대한 책임은 오직 귀하에게만 있습니다.

이제 이 포스 인덱스 지표에 대해 알아보기 위한 각각의 주제를 시작하겠습니다.


포스 인덱스 정의

이 주제에서는 포스 인덱스 지표의 정의, 측정 대상, 계산 방법에 대해 알아보면서 포스 인덱스 지표에 대해 더 자세히 알아볼 것입니다. 저의 접근 방식은 사물의 근원을 배우고 이해하면 이러한 것들을 효과적으로 사용할 수 있을 뿐만 아니라 이러한 것들과 관련된 더 많은 아이디어를 개발하는 방법에 대한 더 많은 통찰력을 얻을 수 있다는 것입니다. 포스 인덱스는 알렉산더 엘더가 개발한 것으로 그의 저서 'Trading for a living'에서 소개된 것입니다. 이 지표는 가격의 움직임의 동력을 측정하거나 잠재적인 전환점을 식별합니다. 이 포스 인덱스 지표는 가격과 거래량을 계산에 사용하며, 이는 시장이 움직임이는 힘을 측정하는 데 도움이 됩니다.

이 포스 인덱스 지표의 기본 개념을 이해하기 위해 이 지표를 수동으로 계산하는 방법을 알고 싶다면 다음과 같은 두 가지의 간단한 단계를 수행하면 됩니다:

1- 1- 기간의 포스 인덱스 = (1- 기간 종가 - 이전 기간 종가) * 거래량

2- 13-기간의 포스 인덱스 = 1-기간의 포스 인덱스의 13-기간의 EMA

그러나 우리는 MetaTrader 5 거래 플랫폼에 내장된 지표로 찾을 수 있으므로 수동으로 계산할 필요가 없으며, MetaTrader 5 거래 터미널에서 선택하기만 하면 됩니다. MetaTrader 5를 여는 동안 삽입 탭 --> 인디케이터 --> 오실레이터 --> 포스 인덱스를 누릅니다.

다음은 이러한 단계를 나타내는 그림입니다:

포스 인덱스 표시기 삽입

"포스 인덱스"를 선택하면 이 지표의 매개 변수는 다음과 같을 것입니다:

포스 인덱스 표시기 매개변수

1- 포스 인덱스 지표의 기간을 결정합니다. 우리는 기본 설정으로 (13)을 사용합니다.

2- 이동 평균 유형을 결정합니다. 지수형을 사용하겠습니다.

3- 볼륨 유형을 결정합니다. 틱을 사용하겠습니다.

4- 지표의 색상을 결정합니다.

5- 지표의 스타일을 결정합니다.

6- 라인의 두께를 결정합니다.

그 후 다음과 같이 차트에 첨부된 지표를 찾을 수 있습니다:

포스 인덱스 표시기 부착

차트의 아래쪽 창에서 볼 수 있듯이 포스 인덱스 지표가 차트에 첨부되어 있고 해당 선이 0 수준 위아래로 진동하는 것을 볼 수 있습니다.


포스 인덱스 전략

이 주제에서는 포스 인덱스의 기본 개념을 바탕으로 포스 인덱스를 사용하는 방법에 대해 알아봅니다. 우리는 간단한 전략을 사용해 이 지표를 사용하는 방법과 거래 시스템을 만들기 위한 기본 개념에 대해 알아볼 것입니다. 이러한 전략은 교육용으로만 사용되므로 실제 계좌에서 사용하기 전에 테스트하여 거래에 적합한지 확인해야 합니다.

  • 전략 1: 포스 인덱스 - 트렌드 식별자:

이 전략에 따르면 포스 인덱스 지표와 제로 수준 사이의 크로스오버를 기준으로 강세 또는 약세 신호를 얻게 됩니다. 포스 인덱스가 0 수준보다 크면 강세 움직임의 신호가 됩니다. 반대로 포스 인덱스가 0 수준보다 낮으면 약세 움직임의 신호가 됩니다.

간단히 하면,

포스 인덱스 > 제로 레벨 --> 강세 움직임.

포스 지수 < 0 수준 --> 약세 움직임.

  • 전략 2: 포스 인덱스 - 상승 또는 다이버전스:

이 전략에 따라 시장에서 강한 상승 또는 다이버전스가 나타날 때 신호를 포착해야 합니다. 현재 고점 값이 이전 고점 값보다 크고 동시에 현재 포스 인덱스 값이 이전 포스 인덱스 값보다 크면 강한 상승 움직임의 신호가 됩니다. 현재 고점이 이전 고점보다 크고 동시에 현재 포스 인덱스가 이전 포스 인덱스 값보다 낮으면 이는 약세 다이버전스 신호입니다.

간단히 하면,

현재 고점 > 이전 고점 및 현재 포스 인덱스 > 이전 포스 인덱스 --> 강한 상승 움직임.

현재 고점 > 이전 고점 및 현재 포스 인덱스 < 이전 포스 인덱스 --> 약세 다이버전스.

  • 전략 3: 포스 인덱스 - 하락 또는 다이버전스:

이 전략에 따르면 전략 2와 반대되는 신호를 얻어야 합니다. 우리는 특정 조건에 따라 강한 하락의 움직임이나 다이버전스 신호를 받을 수 있어야 합니다. 현재 저점이 이전 저점보다 낮고 현재 포스 인덱스 값이 이전보다 낮으면 강한 하락 움직임의 신호가 됩니다. 현재 저점이 이전 저점보다 낮고 현재 포스 인덱스 값이 이전보다 크면 강세 다이버전스의 신호가 됩니다.

간단히 하면,

현재 저점 < 이전 저점 및 현재 포스 인덱스 < 이전 포스 인덱스 --> 강한 하락 움직임.

현재 저점 < 이전 저점 및 현재 포스 인덱스 > 이전 포스 인덱스 --> 강세 다이버전스.

  • 전략 4: 포스 인덱스 신호:

우리는 이 전략을 기반으로 특정 조건에 따라 매수 및 매도 신호를 얻을 수 있어야 합니다. 종가가 지수이동평균보다 크고 이전 포스 인덱스가 0보다 낮으며 현재 포스 인덱스가 0 수준보다 크면 매수 신호가 됩니다. 종가가 지수이동평균보다 낮고 이전 포스 인덱스가 0 수준보다 크며 현재 포스 인덱스가 0 수준보다 낮으면 매도 신호가 됩니다.

간단히 하면,

종가 > EMA, 이전 포스 인덱스 < 0, 현재 포스 인덱스 > 0 --> 매수 신호.

종가 < EMA, 이전 포스 인덱스 > 0, 현재 포스 인덱스 < 0 --> 매도 신호.


포스 인덱스 전략 청사진

이번 주제에서는 트레이딩 시스템을 만드는 데 도움이 되는 단계별 청사진을 설계해 보겠습니다. 제 생각에는 이 단계는 아이디어를 정리하여 목표를 완성하고 거래 시스템을 만드는 것을 좀더 쉽게 해주는데 도움이 되기 때문에 중요한 단계라고 생각합니다.

  • 전략 1:  포스 인덱스 - 트렌드 식별자:

이 전략에 따르면 강세 또는 약세의 움직임을 차트에 코멘트로 신호를 제공하는 트레이딩 시스템을 만들어야 합니다. EA가 매 틱마다 현재의 포스 인덱스를 확인하고 제로 수준에서 포지션을 결정해야 합니다. 현재의 포스 인덱스 값이 0 수준보다 크면 EA는 차트에 강세 움직임과 현재 포스 인덱스 값을 코멘트로 반환해야 합니다. 반면에 현재 포스 인덱스 값이 0 수준보다 낮으면 EA는 약세 움직임과 현재 포스 인덱스 값을 차트에 코멘트로 반환해야합니다.

포스 인덱스 - 트렌드 식별자 청사진

  • 전략 2: 포스 인덱스 - 상승 또는 다이버전스:

이 전략을 바탕으로 강한 상승 또는 약세 다이버전스 신호를 제공하는 트레이딩 시스템을 만들어야 합니다. 거래 시스템은 네 가지의 값을 지속적으로 확인해야 하며 이 네가지 값은 현재 고점과 이전 고점, 현재 포스 인덱스 및 이전 포스 인덱스 값입니다. 우리는 어느 것이 다른것 보다 큰지 현재 포스 인덱스 값이 이전 코스 인덱스 값보다 큰지 결정해야 합니다. 현재 고점이 이전 고점보다 크고 현재 포스 인덱스가 이전 포스 인덱스보다 큰 경우 EA는 차트에 각각의 값을 별도의 줄에 코멘트로 다음과 같이 반환해야 합니다:

  • 강력한 상승 움직임,
  • 현재 고점.
  • 이전 고점.
  • 현재 포스 인덱스 값
  • 이전 포스 인덱스 값

현재 고점이 이전 고점보다 크고 현재 포스 인덱스가 이전 포스 인덱스보다 낮은 경우 EA 는 각각의 값을 별도의 줄에 코멘트로 다음과 같이 반환해야 합니다:

  • 약세 다이버전스.
  • 현재 고점.
  • 이전 고점.
  • 현재 포스 인덱스 값
  • 이전 포스 인덱스 값

다음은 이 청사진의 그림입니다.

포스 인덱스 - 상승 또는 발산 블루프린트

  • 전략 3: 포스 인덱스 - 하락 또는 다이버전스:

이 전략에 따르면 강한 하락 또는 강세 다이버전스 일때 자동으로 신호를 반환하는 트레이딩 시스템을 만들어야 합니다. EA가 현재 저점과 이전 저점의 값을 확인하고 어느 것이 다른 것보다 큰지 결정해야 합니다. 또한 현재 포스 인덱스와 이전 포스 인덱스를 확인하고 어느 것이 다른 것보다 큰지 결정해야 합니다. EA는 이렇게 네 개의 값을 확인해야 합니다. 현재 저점이 이전 저점보다 낮고 현재 포스 인덱스가 이전 포스 인덱스보다 낮은 경우 EA는 차트에 각각의 값을 별도의 줄로 표시하여 다음과 같은 값을 코멘트로 반환해야 합니다:

  • 강력한 하락 움직임,
  • 현재 저점
  • 이전 저점
  • 현재 포스 인덱스 값
  • 이전 포스 인덱스 값

현재 저점이 이전 저점보다 낮고 현재 포스 인덱스가 이전 포스 인덱스보다 큰 경우 EA는 차트에 코멘트로 각 값을 별도의 줄에 표시하여 다음과 같은 값을 반환해 주어야 합니다:

  • 강세 다이버전스
  • 현재 저점
  • 이전 저점
  • 현재 포스 인덱스 값
  • 이전 포스 인덱스 값

다음은 이 청사진의 그림입니다:

포스 인덱스 - 하향 또는 발산 블루프린트

  • 전략 4: 포스 인덱스 신호:

우리는 이 전략을 기반으로 하여 특정 조건에 따라 매수 또는 매도 신호를 반환하는 거래 시스템을 만들어야 합니다. EA는 종가, 이동 평균, 현재 포스 인덱스, 이전 포스 인덱스 등 네 가지 값을 지속적으로 확인해야 합니다. 종가가 현재 이동 평균값보다 크고, 이전 포스 인덱스가 0보다 낮고, 현재 포스 인덱스가 0 수준보다 큰 경우, EA는 차트에 각각의 값을 별도의 줄에 코멘트로 반환해야 합니다:

  • 매수 신호
  • 현재 종가
  • 현재 지수 이동 평균
  • 현재 포스 인덱스 값
  • 이전 포스 인덱스 값

종가가 현재 이동 평균보다 낮고, 이전 포스 인덱스 값이 0 수준보다 크며, 현재 포스 인덱스 값이 0 수준보다 낮은 경우, EA는 차트에 각각의 값을 별도의 줄에 코멘트로 반환해야 합니다:

  • 매도 신호
  • 현재 종가
  • 현재 지수 이동 평균
  • 현재 포스 인덱스 값
  • 이전 포스 인덱스 값

다음은 이 전략의 청사진입니다:

포스 인덱스 신호 블루프린트

포스 인덱스 거래 시스템

이번 주제에서는 앞서 살펴본 각 전략의 MQL5 코드를 작성한 후 각 전략에 따라 MetaTrader 5에서 자동으로 신호를 수신하는 거래 시스템을 만드는 방법에 대해 자세히 알아 보겠습니다. 먼저 앞서 언급한 전략의 기초로 사용할 현재 포스 인덱스 값으로 차트에 코멘트를 생성하는 데 사용하는 간단한 트레이딩 전략을 만들겠습니다.

  • "double" 함수를 사용하여 fiArray의 배열을 생성합니다.
double fiArray[];
  • Boolean(true 또는 false)을 반환하는 ArraySetAsSeries 함수를 사용하여 배열을 정렬합니다. 이 함수의 매개 변수는 다음과 같습니다:
    • array[]
    • flag
ArraySetAsSeries(fiArray,true);
  • VolDef 변수를 생성한 후 iVolume을 사용하여 볼륨을 정의합니다. iForce 함수는 포스 인덱스 지표의 핸들을 반환합니다. 이 함수의 매개 변수는 다음과 같습니다:
    • symbol: 현재 심볼에 적용할 (_Symbol)을 사용합니다.
    • period: 현재 기간 또는 차트 주기에 적용하려면 (_Period)를 사용합니다.
    • ma_period: 이동 평균의 길이로 (13)을 사용합니다.
    • ma_method: 이동 평균의 유형으로 (MODE_EMA)를 사용합니다.
    • 적용된_볼륨: 볼륨의 유형으로 (VOLUME_TICK)을 사용합니다.
int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
  • 볼륨 지표에서 데이터를 가져오기 위해 CopyBuffer 함수를 사용하여 배열을 채웁니다. 이 함수의 매개 변수는 다음과 같습니다:
    • indicator_handle: 인디케이터 핸들의 경우 (fiDef)를 사용합니다.     
    • buffer_num: 인디케이터 버퍼 번호로 (0)을 사용합니다.
    • start_pos: 시작 위치는 (0)을 사용합니다.         
    • count: 복사할 양으로 (13)을 사용합니다.                
    • buffer[]: 복사할 대상 배열입니다. (fiArray)를 사용합니다.
CopyBuffer(fiDef,0,0,3,fiArray);
  • fiVal에 대한 변수를 생성한 후 NormalizeDouble 함수를 사용하여 현재 포스 인덱스 값을 정의합니다. NormalizeDouble 함수는 double 유형의 값을 반환하며 매개 변수는 다음과 같습니다:
    • value: 노멀라이즈드 된 숫자로 (fiArray[0]을 사용합니다.
    • digits: 소수점 이하 자릿수로 (6)을 사용합니다.
double fiVal = NormalizeDouble(fiArray[0],6);
  • 코멘트 함수를 사용하여 현재 포스 인덱스의 값을 코멘트로 차트에 반환합니다.
Comment("Force Index Value is ",fiVal);

다음은 이 간단한 거래 시스템을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                           Simple Force Index.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];

   ArraySetAsSeries(fiArray,true);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiVal = NormalizeDouble(fiArray[0],6);

   Comment("Force Index Value is ",fiVal);

  }
//+------------------------------------------------------------------+

이 코드를 컴파일하면 내비게이터 창에서 다음과 같이 이 전략을 수행하는 EA를 찾을 수 있습니다:

FI Nav 1

차트에 끌어다 놓으면 다음과 같은 창이 나타납니다:

단순 포스 인덱스 승리

확인을 누르면 파일이 차트에 첨부됩니다:

단순 포스 인덱스 첨부

이전 그림의 오른쪽 상단에서 볼 수 있듯이 EA 'Simple Force Index'가 차트에 첨부되어 있습니다.

이 트레이딩 시스템에서 신호를 생성하는 것은 다음과 같이 테스팅에서 보여주는 예시와 동일하다는 것을 알 수 있습니다:

단순 포스 인덱스 신호

왼쪽 상단의 이전 그림에서 볼 수 있듯이 차트에 현재 포스 인덱스 값의 신호가 코멘트로 표시됩니다.

생성된 신호가 MetaTrader 5에 내장된 포스 인덱스 지표와 동일한지 확인하려면. EA 첨부하고 지표를 삽입한 후 프로그래밍 한 지표와 동일한 설정으로 맞추어 비교해 볼 수 있습니다. 두 신호는 다음과 같이 동일합니다:

단순 포스 인덱스 - 동일한 신호

이전 차트에서 볼 수 있듯이 왼쪽 상단에는 EA가 첨부되어 있고 오른쪽 상단에는 이 EA가 생성한 포스 인덱스 값에 대한 코멘트가 있으며 아래 창에는 해당 값과 함께 삽입된 내장 포스 인덱스가 있으며 두 값이 모두 동일하다는 것을 명확하게 확인할 수 있습니다.

  • 전략 1: 포스 인덱스 - 트렌드 식별자:

다음은 이 전략을 기반으로 트레이딩 시스템을 만드는 코드를 작성하는 방법입니다.

//+------------------------------------------------------------------+
//|                               Force Index - Trend Identifier.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];

   ArraySetAsSeries(fiArray,true);

   int fiDef = iForce(_Symbol,_Period,100,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiVal = NormalizeDouble(fiArray[0],6);

   if(fiVal>0)
     {
      Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
     }

   if(fiVal<0)
     {
      Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
     }

  }
//+------------------------------------------------------------------+

이 코드에서의 차이점은 전략의 조건입니다:

강세 움직임의 경우

   if(fiVal>0)
     {
      Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
     }

약세 움직임의 경우

   if(fiVal<0)
     {
      Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
     }

이 코드를 컴파일하면 탐색기 창에서 다음과 같은 EA를 찾을 수 있습니다:

FI 탐색

이 EA를 실행하려면 차트에 끌어다 놓습니다. 그러면 다음과 같은 창이 나타납니다:

포스 인덱스 - 트렌드 식별자 승리

"확인"을 누르면 다음 그림과 같이 차트에 첨부된 Expert Advisor를 찾을 수 있습니다:

포스 인덱스 - 트렌드 식별자 첨부

차트 오른쪽 상단에서 볼 수 있듯이 EA가 차트에 첨부되어 있습니다.

이 전략에 따라 생성된 신호는 다음과 같은 테스팅의 예시와 같습니다.

강세 움직임의 경우:

포스 인덱스 - 추세 식별자 - 강세 신호

왼쪽 상단의 이전 차트에서 볼 수 있듯이 강세 움직임과 포스 인덱스 지표의 현재 값에 대한 코멘트가 있습니다.

약세 움직임의 경우:

포스 인덱스 - 추세 식별자 - 약세 신호

왼쪽 상단의 이전 차트에서 볼 수 있듯이 약세 움직임과 포스 인덱스 지표의 현재 값에 대한 코멘트가 있습니다.

  • 전략 2: 포스 인덱스 - 상승 또는 다이버전스:

다음은 이 전략을 수행하는 트레이딩 시스템을 코딩하는 방법입니다.

//+------------------------------------------------------------------+
//|                               Force Index - Up or Divergence.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];
   MqlRates pArray[];

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double currentHighVal=NormalizeDouble(pArray[2].high,6);
   double prevHighVal=NormalizeDouble(pArray[1].high,6);

   if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Strong up move","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

   if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Bearish Divergence","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

이 코드의 차이점은 다음과 같습니다:

두 개의 배열을 생성합니다. 하나는 앞서 한 것처럼 "double" 함수를 사용하여 fiArray용 배열을 만들고, 다른 하나는 가격, 볼륨, 스프레드에 대한 정보를 저장하는 "MqlRates" 함수를 사용하여 pArray용 배열을 생성합니다.

   double fiArray[];
   MqlRates pArray[];

이렇게 생성된 배열을 정렬하기 위해 fiArray의 경우 앞에서 배운 것과 동일한 "ArraySetAsSeries" 함수를 사용하겠습니다. pArray의 경우 "CopyRates" 함수를 사용하여 "MqlRates"의 과거 데이터를 가져오고 그 매개 변수는 다음과 같습니다:

  • symbol name: (_Symbol)을 사용합니다.
  • timeframe: (_Period)을 사용합니다.
  • start time: (0)을 사용합니다.
  • stop time: (3)을 사용합니다.
  • rates array: (pArray)를 사용합니다.
   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

포스 인덱스의 현재 및 이전 값 정의

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

현재 고점값 및 이전 고점값 정의

   double currentHighVal=NormalizeDouble(pArray[2].high,6);
   double prevHighVal=NormalizeDouble(pArray[1].high,6);

전략의 조건

강한 상승 움직임의 경우:

   if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Strong up move","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

약세 다이버전스의 경우:

 
   if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Bearish Divergence","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

이 코드를 컴파일하면 내비게이터 창에서 다음과 같이 EA를 찾을 수 있습니다:

FI Nav

이 EA를 차트에 끌어다 놓으면 다음과 같이 이 EA의 창이 나타납니다:

포스 인덱스 - 상승 또는 다이버전스 승리

"확인"을 누르면 다음과 같이 EA가 차트에 첨부되어 있는 것을 확인할 수 있습니다:

힘 인덱스 - 상승 또는 발산 첨부

이전 차트에서 오른쪽 상단 모서리에 EA가 첨부되어 있는 것을 볼 수 있습니다.

그 후 시장 상황이 이 전략 조건과 일치하면 시장 상황에 따라 우리는 신호를 받을 수 있습니다. 다음은 테스트의 예입니다.

현재 데이터 창에서 강한 상승 움직임이 있는 경우:

포스 인덱스 - 상승 또는 다이버전스 - 강한 상승 신호 - 현재 데이터

이전 데이터 창:

 포스 인덱스 - 상승 또는 다이버전스 - 강한 상승 신호 - 이전 데이터

현재 데이터 창과 약세 다이버전스의 경우:

포스 인덱스 - 상승 또는 발산 - 발산 신호 - 현재 데이터

이전 데이터 창:

포스 인덱스 - 상승 또는 다이버전스 - 다이버전스 신호 - 이전 데이터

  • 전략 3: 포스 인덱스 - 하락 또는 다이버전스:

다음은 이 전략을 수행하는 거래 시스템을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                             Force Index - Down or Divergence.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];
   MqlRates pArray[];

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double currentLowVal=NormalizeDouble(pArray[2].low,6);
   double prevLowVal=NormalizeDouble(pArray[1].low,6);

   if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Strong down move","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

   if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Bullish Divergence","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

이 코드의 차이점은 다음과 같습니다:

현재 저점값과 이전 저점값을 정의합니다:

   double currentLowVal=NormalizeDouble(pArray[2].low,6);
   double prevLowVal=NormalizeDouble(pArray[1].low,6);

이 전략의 조건:

강한 하향 이동의 경우:

   if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Strong down move","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

강세 다이버전스의 경우:

   if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Bullish Divergence","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

이 코드를 컴파일하면 내비게이터 창에서 다음과 같이 이 전략을 수행하는 EA를 찾을 수 있습니다:

FI Nav

이 EA를 차트에 끌어다 놓으면 다음과 같이 EA의 창이 나타납니다:

포스 인덱스 - 하락 또는 다이버전스 승리

"확인"을 누르면 다음과 같이 EA가 차트에 첨부되어 있는 것을 확인할 수 있습니다:

포스 인덱스 - 하향 또는 다이버전스 첨부

이전 차트에서 오른쪽 상단의 EA가 첨부되어 있는 것을 볼 수 있습니다.

이제 이 전략에 따라 생성된 신호가 테스팅의 예시와 같은 것을 확인할 수 있습니다.

현재 데이터상 강한 약세인 경우:

포스 인덱스 - 하락 또는 다이버전스 - 강한 하락 신호 - 현재 데이터

이전 데이터:

포스 인덱스 - 하락 또는 다이버전스 - 강한 하락 신호 - 이전 데이터

현재 데이터상 강세 다이버전스인 경우,

포스 인덱스 - 하락 또는 발산 - 발산 신호 - 현재 데이터

이전 데이터:

포스 인덱스 - 하락 또는 다이버전스 - 다이버전스 신호 - 이전 데이터

  • 전략 4: 포스 인덱스 신호:

다음은 이 전략을 기반으로 트레이딩 시스템을 만드는 전체 코드입니다.

//+------------------------------------------------------------------+
//|                                          Force Index signals.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];
   double maArray[];
   MqlRates pArray[];



   ArraySetAsSeries(fiArray,true);
   ArraySetAsSeries(maArray,true);


   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   CopyBuffer(fiDef,0,0,3,fiArray);
   CopyBuffer(maDef,0,0,3,maArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double maCurrentVal = NormalizeDouble(maArray[0],6);
   double closePrice = NormalizeDouble(pArray[2].close,6);


   if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
     {
      Comment("Buy Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

   if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
     {
      Comment("Sell Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

이 코드에서의 차이점:

fiArray, maArray 및 MqlRates에 대한 세 가지 배열 만들기

   double fiArray[];
   double maArray[];
   MqlRates pArray[];

fiArray와 maArray의 배열 정렬하기

   ArraySetAsSeries(fiArray,true);
   ArraySetAsSeries(maArray,true);

포스 인덱스를 위한 fiDef, 이동 평균을 위한 maDef 정의

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

앞에서 배웠듯이 "CopyRates" 함수로 pArray를 정렬합니다.

int Data=CopyRates(_Symbol,_Period,0,3,pArray);

배열 채우기

   CopyBuffer(fiDef,0,0,3,fiArray);
   CopyBuffer(maDef,0,0,3,maArray);

현재 포스 인덱스, 이전 포스 인덱스, 현재 이동 평균 및 종가 이렇게 네 가지 값을 정의합니다.

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double maCurrentVal = NormalizeDouble(maArray[0],6);
   double closePrice = NormalizeDouble(pArray[2].close,6);

전략의 조건:

매수 신호인 경우:

   if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
     {
      Comment("Buy Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

매도 신호인 경우:

   if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
     {
      Comment("Sell Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

이 코드를 컴파일하면 내비게이터 창에서 다음과 같이 EA를 찾을 수 있습니다:

FI Nav

이 EA를 차트에 끌어다 놓으면 다음과 같이 EA의 창이 나타납니다:

포스 인덱스가 승리를 알리는 신호

"확인"을 누르면 다음과 같이 EA가 차트에 첨부되어 있는 것을 확인할 수 있습니다:

 포스 인덱스 신호 첨부

이 전략에 따라 생성된 신호는 아래 테스팅의 예시와 같습니다.

현재 데이터상 매수 신호의 경우:

강제 지수 신호 - 매수 신호 - 현재 데이터

이전 데이터:

강제 지수 신호 - 매수 신호 - 이전 데이터

현재 데이터상 매도 신호의 경우:

강제 지수 신호 - 매도 신호 - 현재 데이터

이전 데이터:

 강제 지수 신호 - 매도 신호 - 이전 데이터


결론

포스 인덱스 지표는 적절한 결정을 내리도록 좋은 인사이트를 제공하는 훌륭한 기술적 도구입니다. 우리는 이 글을 통해 이 지표의 정의, 측정 대상, 수동으로 계산하는 방법 등을 자세히 살펴보고 이 지표의 개념이 무엇인지 알아 보았습니다. 또한 간단한 전략을 통해 이 지표를 어떻게 사용할 수 있는지도 배웠습니다:

  • 포스 인덱스 - 추세 식별자: 강세 및 약세 움직임의 신호를 얻습니다.
  • 포스 인덱스 - 상승 또는 다이버전스: 강한 상승 또는 약세 다이버전스 신호를 받습니다.
  • 포스 인덱스 - 하락 또는 다이버전스: 강한 하락의 움직임 또는 강세 다이버전스 신호를 받습니다.
  • 포스 인덱스 신호: 종가, 포스 인덱스 값, 지수 이동 평균을 평가하여 매수 또는 매도 신호를 받습니다.

이후 언급된 각 전략에 대한 트레이딩 시스템을 만들기 위한 단계별 청사진을 설계했으며 이 단계의 중요성은 아이디어를 정리하고 효과적으로 트레이딩 시스템을 만드는 데 도움이 됩니다. 이후 각 전략에 대한 거래 시스템을 만들고 MetaTrader 5에서 실행하여 자동 신호를 받도록 했습니다.

모든 사람에게 맞는 전략은 세상에 없습니다. 그러므로 실제 계정에서 사용하기 전에 반드시 테스트해야 한다는 점을 다시 한 번 말씀 드립니다. 모든 학습 여정에서 연습은 매우 중요한 요소이므로 배운 내용을 직접 적용해 보셨기를 바랍니다. 또한 이 지표를 다른 기술적 도구와 함께 사용하여 의사 결정 및 거래의 결과를 향상시키는 방법에 대해 생각해 보시기 바랍니다. 이러한 것이 기술적 분석 접근법의 가장 놀라운 기능 중 하나입니다.

제 생각에 프로그래밍은 다양한 분야에서 그 중요성이 날로 커지고 있습니다. 프로그래밍을 배우거나 적어도 관심을 기울이는 것이 중요할 것입니다. 트레이딩에 있어 프로그래밍은 우리를 대신해 거래를 해주는 프로그램을 사용함으로써 시간을 절약하거나 적어도 효과적으로 거래하는 데 도움이 됩니다. 또한 프로그래밍은 코딩한 내용을 기반으로 정확한 신호를 얻는 데 도움이 됩니다. 가장 유익한 것은 감정을 줄이고 피하는 것입니다.

이 글이 트레이딩의 결과를 개선하고 이 주제 또는 관련된 다른 주제에 대해 새로운 아이디어를 얻는 데 도움을 드렸기를 바랍니다. 이 글이 유용했고 비슷한 글을 더 읽고 싶으시다면 이 시리즈의 다른 글을 읽어보세요.

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

베어스 파워 보조 지표로 트레이딩 시스템을 설계하는 방법 알아보기 베어스 파워 보조 지표로 트레이딩 시스템을 설계하는 방법 알아보기
이번 글은 가장 인기 있는 보조지표로 트레이딩 시스템을 설계하는 방법을 알아보는 시리즈의 새로운 글입니다. 이번에는 베어스 파워 보조지표로 트레이딩 시스템을 설계하는 방법을 알아봅니다.
Expert Advisor 개발 기초부터(19부): 새로운 주문 시스템(II) Expert Advisor 개발 기초부터(19부): 새로운 주문 시스템(II)
이 글에서는 "무슨 일이 일어나는지를 보여주는" 그래픽 주문 시스템을 개발할 것입니다. 이번에는 처음부터 다시 시작하는 것이 아니라 거래하는 자산의 차트에 더 많은 객체와 이벤트를 추가하여 기존 시스템을 수정할 예정입니다.
모집단 최적화 알고리즘: 개미 군집 최적화(ACO) 모집단 최적화 알고리즘: 개미 군집 최적화(ACO)
이번에는 개미 군집 최적화 알고리즘을 분석해 보겠습니다. 이 알고리즘은 매우 흥미롭고 복잡합니다. 이 글에서는 새로운 유형의 ACO를 만들기 위한 시도를 할 것입니다.
Expert Advisor 개발 기초부터(18부): 새로운 주문 시스템(I) Expert Advisor 개발 기초부터(18부): 새로운 주문 시스템(I)
이것이 새로운 주문 시스템의 첫 번째 부분입니다. 기사를 통해 EA를 문서화하기 시작한 이후 우리는 차트 주문 시스템 모델을 그대로 유지하면서 다양한 변경 및 개선을 추가했습니다.