English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
표준 라이브러리의 거래 전략 클래스에 대해 알아보기 - 전략 사용자 정의하기

표준 라이브러리의 거래 전략 클래스에 대해 알아보기 - 전략 사용자 정의하기

MetaTrader 5트레이딩 시스템 | 11 10월 2021, 16:22
89 0
Harvester Trading
Harvester Trading

소개

이 글은 처음부터 EA를 작성하지 않고 기능성이 있는 사용자 지정에 접근하고자 하는 초심자/초보자 사용자를 대상으로 작성되었습니다.

MetaTrader 5 에서는 단일 MetaEditor 기능인 MQL5 Wizard 덕분에 프로그래밍 언어 및 소스 코딩에 대한 최소한의 지식(및 기술)만으로 전문가 거래를 할 수 있습니다. 마법사(이 문서에서는 자세한 작업에 대해 설명하지 않음)는 완료된 프로그램(.mq5 및 .ex5 파일), 알고리즘 및 코드를 생성하기 위한 것입니다. MQL5 Standard Library와 MQL5의 Trading Strategy 클래스(훌륭한 리소스)를 사용하면 이점을 얻을 수 있습니다.

표준 라이브러리의 거래 전략 클래스를 살펴보기: 전략을 사용자 정의하기.

Standard Library에는 실제로 많은 거래 전략 강의가 있습니다. 그 중 일부는 이미 매우 우수하며 금융 시장과 수익성 분석에 대한 다소 유명한 연구로부터 나온 것입니다. MetaTrader 5와 함께 제공되는 표준 지표 집합에서 각 지표에 대해 적어도 하나의 전략이 있습니다.

이러한 Trading Strategy Classes의 거래 신호를 설정하기 위해 MQL5 Wizard는 "거래 패턴" 형식으로 코딩된 논리로 구성된 지시자의 동작을 호출하는 메커니즘을 사용합니다. 또한 지표(#include 구조를 통한)를 통해 생성된 모든 특정 EA 호출과 해당 패턴 및 거래 결정 집합을 거래 목적으로 EA 코어로 가져옵니다.


MQL5 Wizard

첫 번째 단계는 MQL5 마법사를 사용하여 Expert Advisor를 만드는 것입니다. Meta Editor에서 MQL5 마법사를 열려면 "파일" 메뉴에서 "새로 만들기"를 선택하거나 "새로 만들기" 버튼을 누른 다음 "Expert Advisor (generate)" 옵션을 선택합니다.

.그림 1. 새 파일을 생성하기 (마법사에서 "생성" 옵션을 선택).

MQL5 마법사에서 생성된 Expert Advisor의 이름을 "My Expert"로 지정합니다.

그림 2. MQL5 마법사에서 생성된 EA의 이름 및 매개 변수

그런 다음 두 개의 표시기/신호를 추가하여 작업할 수 있습니다(사용 가능한 표시기에서 원하는 수만큼 조건을 선택할 수 있음). 이 예에서는 상대 강도 지수(RSI)와 이동 평균(MA)이라는 두 가지 유명한 지표를 추가하겠습니다. RSI 표시기를 먼저 추가한 다음 MA 표시기를 추가합니다.

그림 3. RSI를 먼저 선택한 다음 MA를 선택합니다.

원하는 대로 일부 매개변수를 설정하거나 예제의 기본 매개변수를 그대로 둘 수 있습니다.

그림 4. 신호의 파라미터

[확인]을 클릭하고 마법사를 계속한 후 다음 창에서 (지금은) 후행 중지를 선택하지 않지만, 추가할 수 있는 경우: 이 문서의 항목에 영향을 미치지 않습니다. 다음 창에서는 5.0을 거래 비율 및 0.1 로트 또는 원하는 다른 매개 변수로 선택할 것입니다. 다시 말씀드리지만, 이는 당사 기사의 인수에 영향을 미치지 않습니다.


생성된 코드 분석

완료되면 "MyExpert.mq5" 파일을 받게 됩니다. 생성된 코드의 주요 포인트를 분석하겠습니다.

//+------------------------------------------------------------------+
//|                                                     MyExpert.mq5 |
//|                                                        Harvester |
//|                        https://www.mql5.com/en/users/Harvester |
//+------------------------------------------------------------------+
#property copyright "Harvester"
#property link      "https://www.mql5.com/en/users/Harvester"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalRSI.mqh>
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>

먼저 #include 파일은 마법사에서 생성된 코드에 추가됩니다. 우리는 다음을 볼 수 있습니다:

  • Expert.mqh
  • SignalRSI.mq
  • SignalMA.mqh

그런 다음 코드의 다음 부분을 입력합니다.

//--- Creating filter CSignalRSI
   CSignalRSI *filter0=new CSignalRSI;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);

제목에서 알 수 있듯이 차트에 첨부하거나 전략 테스터에서 테스트할 생성 EA의 시장 상황에 적용될 "필터"입니다. 그런 다음 filter0은 "index"가 0인 첫 번째 필터가 되며, 이 첫 번째 필터의 경우 예에서 RSI를 선택했습니다.

CSignalRSI 클래스 Signal RSI 를 의미합니다. 이 클래스는 RSI 표시기를 호출하고 마법사의 패턴 로직을 사용하여 매수 또는 매도 신호를 생성하기 위한 몇 가지 조건을 적용하는 데 사용됩니다. 그러면 RSI가 첫 번째 필터입니다(필터 번호 0).

코드의 다음 부분에는 일부 필터의 매개 변수와 Trailing Stop 섹션(후행하지 않기로 선택) 및 나중에 Money Management에 대한 코드 부분이 있습니다.

계속하여, 다음을 봅니다:

//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-10);
     }
//--- ok
   return(0);
  }

이 섹션은 Expert.mqh 포함 파일에 속합니다. 이것은 전문가(expert) 운영에 필요한 지표의 초기화에 관한 것입니다.

생성된 EA 코드의 마지막 부분은 초기화 취소 및 기타 일반적인 Expert Advisor 이벤트에 관한 것입니다:

//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

실제로 이 EA는 "필터" 및 "가중치" 논리를 활용하는 거래 클래스의 표준 라이브러리를 통한 거래 결정에 두 가지 지표(RSI 및 MA)를 사용합니다. 자세한 내용은 MQL5 참조의 거래 신호 모듈에서 확인할 수 있습니다. 하지만 우리의 목적은 우리의 거래 전략을 새로운 필터로 사용하는 것입니다.

첫 번째 단계(자체 거래 전략 사용)에서는 MyExpert.mq5를 약간 수정할 예정입니다. 먼저 필터를 하나 더 추가해 보겠습니다. 그것은 filter2가 될 것이고 우리는 코드의 filter1 부분 바로 뒤에 배치할 것입니다.

//--- Creating filter CSignalCCIxx
   CSignalCCIxx *filter2=new CSignalCCIxx;
   if(filter2==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter2");
      ExtExpert.Deinit();
      return(-4);
     }
   signal.AddFilter(filter2);
//--- Set filter parameters
   filter2.PeriodCCIxx(Signal_CCIxx_PeriodCCI);
   filter2.Applied(Signal_CCIxx_Applied);
   filter2.Weight(Signal_CCIxx_Weight);

#include files로 돌아가서 필터 및 시장 의사 결정의 핵심 파일을 살펴보겠습니다. 첫 번째는 #include <Expert\Expert.mqh> 파일입니다. 여기에는 다른 파일이 차례로 포함됩니다:

  • #include "ExpertBase.mqh"
  • #include "ExpertTrade.mqh"
  • #include "ExpertSignal.mqh"
  • #include "ExpertMoney.mqh"
  • #include "ExpertTrailing.mqh"

여기에는 각각 EA의 주요 구조, 거래 구조, 신호, 통화 및 후행 중지(Trailing stop) 처리가 포함됩니다. 우리는 이 파일들을 깊이 분석하거나 수정하지 않을 것입니다. 당사의 목적은 MetaTrader 5 표준 지표 세트의 기존 지표를 사용하고 포함 파일을 추가하여 자체 전략을 추가하는 데 초점을 맞추는 것입니다.

MyExpert.mq5 코드에는 거래 시장의 결정에 대한 신호/필터로 이 예에서 사용한 RSI 및 MA 표시기 파일이 포함되어 있습니다. 이제 사용자 정의 포함 파일을 추가하겠습니다. 이를 위해 CCI 표시기에 속하는 신호의 수정된("개선된") 버전을 사용합니다.

//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalRSI.mqh>
#include <Expert\Signal\SignalMA.mqh>

#include <Expert\Signal\SignalCCIxx.mqh>   // This is our own 'custom' indicator for custom Signal management of the EA

The SignalCCIxx.mqh 파일은 \MQL5\Include\Expert\Signal\ 폴더에 있어야 하며, 표준 라이브러리의 다른 #include 거래 클래스와 마찬가지로 마법사가 생성한 EA의 통합성과 일치해야 합니다(SignalRSI.mqh 및 SignalMA.mqh).

이 예에서는 원래 CCI 파일을 복사하여 약간의 코드를 수정하여 CCIxx라는 다른 파일을 만든 다음 #include 파일로 사용할 것입니다. 단순성을 위해 표준 라이브러리에서 복사된 CCI 표시기를 사용합니다.

"\MQL5\Include\Expert\Signal\SignalCCI.mqh" 파일을 "\MQL5\Include\Expert\Signal\SignalCCIxx.mqh" 로 복사하여야 합니다. 가장 쉬운 방법은 폴더에 파일 복사본을 만든 다음 이름을 변경하는 것입니다.

이제 이 파일을 살펴보겠습니다. 마법사가 생성한 MyExpert.mq5에서 이 '사용자 지정' 방식의 통합은 완료된 작업입니다. 위에서 설명한 대로 filter2 코드를 추가하였으며, 이제 다음을 나중에 완료하겠습니다. 그래서 우리는 더 이상 MyExpert.mq5 파일에 초점을 맞추지 않겠지만, 앞으로는 CCI 지표의 filter2 거래 신호로 인해 EA의 진짜 핵심인 SignalCCIxx.mqh 파일에 초점을 맞출 것입니다.


전략을 사용자 정의하기

다시 SignalCCI.mqh의 수정된 버전인 CCIxx라고 하는 '반-사용자 지정(semi-custom)' 전략 필터를 추가합니다. 사실 완전히 새로운 사용자 지정 시그널이 아니라 MetaTrader 5와 함께 제공되는 표준 지표 집합에서 재설계된 CCI 표시기 버전이기 때문에 반 사용자 지정으로 정의합니다. 이러한 방식으로, 경험이 부족한 사용자와 프로그래머도 MQL5 Wizard가 생성한 EA의 패턴과 필터를 기존 지표의 수 많은 수를 사용하여 약간 수정할 수 있으므로, 시장 신호를 생성하고 판매하기 위한 자신만의 필터와 패턴 버전을 만들 수 있습니다. 이것은 여전히 전략 작업을 위한 훌륭한 기반입니다.

이 예를 살펴보겠습니다. 이 기능이 필요한 사용자(기존 지표에 일부 사용자 정의 패턴을 추가하는 경우)와 마법사를 사용하여 사용자 지정 유형의 완전한 기능을 갖춘 유효한 EA를 신속하게 만들 수 있는 자동화된 거래 챔피온쉽에 참여하려는 사용자에게 유용합니다.

이는 1시간 작업만으로 달성할 수 있습니다 - Trailing Stop, Money Management를 통해 완벽하게 작동하는 챔피온쉽(Championship) 친화적인 EA를 만들 수 있으며, 경쟁력 있는 트레이딩에 필요한 모든 것을 제공합니다. Wizard가 EA를 생성한다는 점에 다시 초점을 맞춘다면, '챔피온쉽 친화적'이라고 명명했듯이, 실제로 생성된 코드는 오류가 없으므로 참가자들은 버그나 오류를 수정하거나 두려워할 필요가 없습니다!

EA는 적어도 참가를 원하지만 프로그래밍에 대해 잘 모르고 Jobs(챔피언십에 참가하기 위한 좋은 대안) 서비스에 EA를 주문하고 싶지 않은 사람들의 거래에 안성맞춤일 것입니다. 원하는 전략에 가까운 거래 로봇을 보유하기 위해 할당할 수 있는 입력 매개 변수가 많습니다.

그러나 실제로는 MetaQuote에서 제공하는 표준 필터/패턴 집합과 함께 마법사 및 거래전략의 표준 라이브러리 클래스를 통해서만 표준 지표 세트를 사용할 수 있습니다. 지표에는 많은 매개변수(시간 범위, 기호)와 지표 자체의 모든 매개변수(예: 기간, 적용된 가격 등)가 있기 때문에 수많은 조합과 성공적인 거래 가능성을 제공합니다. 이 문서에서는 MetaTrader 5 표준 표시기의 패턴/필터를 사용자 정의하고 추가하는 방법에 대해 쉽고 빠르게 배울 것입니다.

SignalCCIxx.mqh 파일에서 해당 동작을 사용자 지정하고 수정하여 자체 CCI 신호 거래 모델(CCIxx)을 만들어 보겠습니다. 먼저 MyExpert.mq5 파일에서 다음과 같은 입력 섹션의 새 코드에 대한 새 변수를 추가합니다(강조 표시된 코드 참조).

//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title         ="MyExpert";  // Document name
ulong                    Expert_MagicNumber   =26287;       // 
bool                     Expert_EveryTick     =false;       // 
//--- inputs for main signal
input int                Signal_ThresholdOpen =40;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose=60;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel    =0.0;         // Price level to execute a deal
input double             Signal_StopLevel     =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel     =50.0;        // Take Profit level (in points)
input int                Signal_Expiration    =4;           // Expiration of pending orders (in bars)
input int                Signal_RSI_PeriodRSI =8;           // Relative Strength Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_RSI_Applied   =PRICE_CLOSE; // Relative Strength Index(8,...) Prices series
input double             Signal_RSI_Weight    =0.7;         // Relative Strength Index(8,...) Weight [0...1.0]
input int                Signal_MA_PeriodMA   =90;          // Moving Average(12,0,...) Period of averaging
input int                Signal_MA_Shift      =0;           // Moving Average(12,0,...) Time shift
input ENUM_MA_METHOD     Signal_MA_Method     =MODE_SMA;    // Moving Average(12,0,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_MA_Applied    =PRICE_CLOSE; // Moving Average(12,0,...) Prices series
input double             Signal_MA_Weight     =0.6;         // Moving Average(12,0,...) Weight [0...1.0]

input int                Signal_CCIxx_PeriodCCI =8;            // Commodity Channel Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_CCIxx_Applied   =PRICE_CLOSE;  // Commodity Channel Index(8,...) Prices series
input double             Signal_CCIxx_Weight    =0.8;          // Commodity Channel Index(8,...) Weight [0...1.0]

Signal_RSI_Weight 및 Signal_MA_Weight 변수의 값을 각각 1.0에서 0.7, 0.6까지 변경하고, 위에 강조 표시된 선을 추가했습니다. 거래 전략 클래스에서 CCI 표시기에 속하는 패턴의 CCIxx 수정 버전에 대한 입력 매개 변수를 올바르게 사용하기 위해 이 코드 3줄을 SignalCCI.mqh 파일에서 복사하고 "CCI" 뒤에 접미사 "xx"를 추가했습니다.

클래스 선언의 "보호됨" 섹션에는 다음과 같은 흥미로운 요소가 많이 있습니다:

class CSignalCCI : public CExpertSignal
  {
protected:
   CiCCI             m_cci;            // object-oscillator
   //--- adjusted parameters
   int               m_periodCCI;      // the "period of calculation" parameter of the oscillator
   ENUM_APPLIED_PRICE m_applied;       // the "prices series" parameter of the oscillator
   //--- "weights" of market models (0-100)
   int               m_pattern_0;      // model 0 "the oscillator has required direction"
   int               m_pattern_1;      // model 1 "reverse behind the level of overbuying/overselling"
   int               m_pattern_2;      // model 2 "divergence of the oscillator and price"
   int               m_pattern_3;      // model 3 "double divergence of the oscillator and price"
   //--- variables
   double            m_extr_osc[10];   // array of values of extremums of the oscillator
   double            m_extr_pr[10];    // array of values of the corresponding extremums of price
   int               m_extr_pos[10];   // array of shifts of extremums (in bars)
   uint              m_extr_map;       // resulting bit-map of ratio of extremums of the oscillator and the price

m_pattern이라는 int 유형을 살펴보세요. 이러한 변수들은 단계적으로 0에서 3까지 번호가 매겨지며, 각각의 변수들은 "패턴" 또는 다시 말해서 금융상품의 매입과 매각을 위한 시장 의사결정 조건의 모형입니다.

우리는 m_pattern_4와 m_pattern_5의 두 가지 맞춤 패턴을 추가할 것입니다. 코드 행 두 개, 정수형 변수 두 개를 추가하면 됩니다.

//--- "weights" of market models (0-100)
   int               m_pattern_0;      // model 0 "the oscillator has required direction"
   int               m_pattern_1;      // model 1 "reverse behind the level of overbuying/overselling"
   int               m_pattern_2;      // model 2 "divergence of the oscillator and price"
   int               m_pattern_3;      // model 3 "double divergence of the oscillator and price"

   int               m_pattern_4;      // model 4 "our own first new pattern: values cross the zero"
   int               m_pattern_5;      // model 5 "our own second new pattern: values bounce around the zero"

코드를 계속 보면 사고파는 논리와 모든 것을 이해할 수 있습니다. 그러나 여기서는 파일을 포함하는 패턴은 한 줄씩 설명하지 않으므로 패턴을 추가하는 방법에 대해서만 집중적으로 설명하겠습니다(이러한 목적을 위해 판독기는 파일 자체를 열고 연구할 수 있으며 이해를 돕기 위한 MQL5 참조문서도 있습니다.

또한 CSignalCCIxx.mqh 파일에서 CTRL+H를 누르고 "CCI"를 검색한 후 "CCIxx"로 대체합니다. "모두 바꾸기"를 클릭합니다. 41개의 항목을 찾아서 교체해야 합니다. 파일 맨 위에 있는 여기로 이동하겠습니다:

//+------------------------------------------------------------------+
//| Class CSignalCCIxx.                                              |
//| Purpose: Class of generator of trade signals based on            |
//|          the 'Commodity Channel Index' oscillator.               |
//| Is derived from the CExpertSignal class.                         |
//+------------------------------------------------------------------+
class CSignalCCIxx : public CExpertSignal
  {
protected:
   CiCCIxx             m_CCIxx;            // object-oscillator

다음 항목을 변경합니다:

protected:
   CiCCIxx             m_CCIxx;            // object-oscillator

원래 SignalCCI.mqh에서와 같이 변경합니다:

protected:
   CiCCI             m_CCIxx;            // object-oscillator

CiCCI는 다른 포함에서 호출되며 이름을 변경할 경우 몇 가지 오류가 있기 때문에 이 작업을 수행합니다. 이제 SignalCCIxx.mqh 파일을 컴파일할 수 있으며 오류는 0개, 경고는 0개여야 합니다. 만약 몇 가지 실수가 있다면, 당신은 아마 실수를 했을 것이고 그 절차를 반복해야 합니다.

이제 우리만의 패턴을 추가하는 핵심을 살펴보겠습니다. 단지 순수한 환상을 위해, 우리는 시장 거래 행동의 2가지 패턴을 추가합니다. 우리는 전부 4개의 새로운 신호(패턴), 구매 2종, 그리고 판매 2종을 갖게됩니다. 변경할 부분은 다음과 같습니다:

//+------------------------------------------------------------------+
//| Constructor CSignalCCIxx.                                        |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CSignalCCIxx::CSignalCCIxx()
  {
//--- initialization of protected data
   m_used_series=USE_SERIES_HIGH+USE_SERIES_LOW;
//--- setting default values for the oscillator parameters
   m_periodCCIxx  =14;
//--- setting default "weights" of the market models
   m_pattern_0  =90;         // model 0 "the oscillator has required direction"
   m_pattern_1  =60;         // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =100;        // model 2 "divergence of the oscillator and price"
   m_pattern_3  =50;         // model 3 "double divergence of the oscillator and price"
   m_pattern_4  =90;         // model 4 "our own first new pattern: "
   m_pattern_5  =90;         // model 5 "our own second new pattern: 
}

값 90을 m_pattern_4 및 m_pattern_5에 할당했습니다. 이러한 값은 새 시장 모델에 할당하려는 가중치로 Expert Advisor의 전체 거래 행동에 영향을 미칩니다.

환상을 위해 두 가지 새로운 시장 모델을 추가해 보겠습니다. 매우 간단할 것입니다. 교육용일 뿐이며 검증되지 않은 거래 신호이므로 거래하지 마십시오. crosshair는 아래 그림에서 해당 막대에 대한 CCI 표시기 값을 식별하는 데 도움이 될 것입니다.


첫 번째 패턴

0 라인을 아래에서 위로 교차합니다.

이것이 우리의 첫 번째 패턴입니다: "가격이 상승할 것이라는 것"

  • 그림 5 는 막대 1(현재 막대 앞에 한 막대)에 해당하는 CCI 값을 보여줍니다. 그것의 값 45.16( > 0)입니다.
  • 그림 6 은 막대 2(현재 막대 앞의 두 막대)에 해당하는 CCI 값을 보여줍니다. 그것의 값 -53.92( < 0) 였습니다.
  • CCI 지시자의 0라인(값 0.00)이 막대 2개 내에서 아래에서 위로 교차되었습니다.

그림 5. 첫 번째 패턴, 가격 상승 - 막대 1에서 CCI   그림 6. 첫 번째 패턴, 가격 상승 - 막대 2에서 CCI


위에서 아래로 0 라인 교차(Crossing)

이것은 "가격이 하락할 것"이라는 첫 패턴입니다.

  • 그림 7 은 막대 1(현재 막대 앞에 한 막대)에 해당하는 CCI 값을 보여줍니다. 그것의 값 -28.49( < 0)입니다.
  • 그림 8은 막대 2(현재 막대 앞의 두 막대)에 해당하는 CCI 값을 보여줍니다. 그것의 값 2.41( > 0) 이었습니다.
  • CCI 지시자의 0 라인(값 0.00)이 막대 2개 내에서 위에서 아래로 교차되었습니다.

그림 7. 첫 번째 패턴, 가격 하락 - 막대 1에서 CCI   그림 8. 첫 번째 패턴, 가격 하락 - 막대 2에서 CCI


두 번째 패턴

위에서 아래로 0 라인을 넘었다가 다시 위로 돌아갑니다.

이것은 우리의 두 번째 패턴입니다: "가격이 상승할 것이라는 것(투표)".

  • 그림 9 는 막대 1(현재 막대 앞 1개)에 해당하는 CCI 값을 보여줍니다. 그것의 값 119.06( > 0)입니다.
  • 그림 10 은 막대 2(현재 막대 앞의 두 막대)에 해당하는 CCI 값을 보여줍니다. 그것의 값 -20.38( < 0) 이었습니다.
  • 그림 11 은 막대 3(현재 막대 앞의 3개)에 해당하는 CCI 값을 보여줍니다. 그것의 값 다시 116.85( > 0) 이었습니다.
  • CCI 지시자의 0 라인(값 0.00)이 위에서 아래로 교차되었습니다. 그런 다음 CCI 표시선이 3개의 막대 내에서 0 라인을 중심으로 튕겨 위로 반환되었습니다.

그림 9. 두 번째 패턴, 가격 상승 - 막대1에서 CCI   그림 10. 두 번째 패턴, 가격 상승 - 막대2에서 CCI   그림 10. 두 번째 패턴, 가격 상승 - 막대3에서 CCI


0라인을 아래에서 위로 가로지르고 다시 아래로 돌아갑니다.

이것은 우리의 두 번째 패턴입니다: "가격이 하락할 것이라는 것(투표)"

  • 그림 12 는 막대 1(현재 막대 앞에 1개)에 해당하는 CCI 값을 보여줍니다. 그것의 값 -58.72( < 0)입니다.
  • 그림 13 은 막대 2(현재 막대 앞의 두 막대)에 해당하는 CCI 값을 보여줍니다. 그것의 값 57.65( > 0) 이었습니다.
  • 그림 14 는 막대 3(현재 막대 앞에 3개)에 해당하는 CCI 값을 보여줍니다. 그것의 값 다시 -85.54( < 0) 이었습니다.
  • CCI 지시자의 0라인(값 0.00)이 아래에서 위로 교차되었습니다. 그런 다음 CCI 표시선이 3개의 막대 내에서 0라인을 중심으로 아래쪽으로 되돌아왔습니다.

그림 12. 두 번째 패턴, 가격 하락 - 막대1에서 CCI   그림 13. 두 번째 패턴, 가격 하락 - 막대2에서 CCI   그림 14. 두 번째 패턴, 가격 하락 - 막대3에서 CCI


패턴 구현하기

이 4가지 조건(패턴당 2개)을 구현하기 위해서는 다음과 같은 코드 섹션을 수정해야 합니다. 하단에는 "구매" 조건에 대해 강조 표시된 코드 줄이 추가되었습니다(위의 설명: 가격이 상승할 "투표" 참조).

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//| INPUT:  no.                                                      |
//| OUTPUT: number of "votes" that price will grow.                  |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
int CSignalCCIxx::LongCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   if(Diff(idx)>0.0)
     {
      //--- the oscillator is directed upwards confirming the possibility of price growth
      if(IS_PATTERN_USAGE(0)) result=m_pattern_0;      // "confirming" signal number 0
      //--- if the model 1 is used, search for a reverse of the oscillator upwards behind the level of overselling
      if(IS_PATTERN_USAGE(1) && Diff(idx+1)<0.0 && CCIxx(idx+1)<-100.0)
         result=m_pattern_1;      // signal number 1
      //--- if the model 2 or 3 is used, perform the extended analysis of the oscillator state
      if(IS_PATTERN_USAGE(2) || IS_PATTERN_USAGE(3))
        {
         ExtState(idx);
         //--- if the model 2 is used, search for the "divergence" signal
         if(IS_PATTERN_USAGE(2) && CompareMaps(1,1))      // 00000001b
            result=m_pattern_2;   // signal number 2
         //--- if the model 3 is used, search for the "double divergence" signal
         if(IS_PATTERN_USAGE(3) && CompareMaps(0x11,2))   // 00010001b
            return(m_pattern_3);  // signal number 3
        }
      // if the model 4 is used, look for crossing of the zero line
      if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0)
         result=m_pattern_4;      // signal number 4 
      // if the model 5 is used, look for the bouncing around the zero line
      if(IS_PATTERN_USAGE(5) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0 && CCIxx(idx+3)>0.0)
         result=m_pattern_5;      // signal number 5
     }
//--- return the result
   return(result);
  }

"판매" 조건에 해당하는 코드 부분을 수정해 보겠습니다. 하단에는 "판매" 조건에 대해 강조 표시된 코드 라인이 추가되었습니다(위의 설명: 가격이 하락할 "투표" 참조).

//+------------------------------------------------------------------+
//| "Voting" that price will fall.                                   |
//| INPUT:  no.                                                      |
//| OUTPUT: number of "votes" that price will fall.                  |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
int CSignalCCIxx::ShortCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   if(Diff(idx)<0.0)
     {
      //--- the oscillator is directed downwards confirming the possibility of falling of price
      if(IS_PATTERN_USAGE(0)) result=m_pattern_0;      // "confirming" signal number 0
      //--- if the model 1 is used, search for a reverse of the oscillator downwards behind the level of overbuying
      if(IS_PATTERN_USAGE(1) && Diff(idx+1)>0.0 && CCIxx(idx+1)>100.0)
         result=m_pattern_1;      // signal number 1
      //--- if the model 2 or 3 is used, perform the extended analysis of the oscillator state
      if(IS_PATTERN_USAGE(2) || IS_PATTERN_USAGE(3))
        {
         ExtState(idx);
         //--- if the model 2 is used, search for the "divergence" signal
         if(IS_PATTERN_USAGE(2) && CompareMaps(1,1))      // 00000001b
            result=m_pattern_2;   // signal number 2
         //--- if the model 3 is used, search for the "double divergence" signal
         if(IS_PATTERN_USAGE(3) && CompareMaps(0x11,2))   // 00010001b
            return(m_pattern_3);  // signal number 3
        }
      if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)<0.0 && CCIxx(idx+2)>0.0)
         result=m_pattern_4;      // signal number 4 
      if(IS_PATTERN_USAGE(5) && CCIxx(idx+1)<0.0 && CCIxx(idx+2)>0.0 && CCIxx(idx+3)<0.0)
         result=m_pattern_5;      // signal number 5  
     }
//--- return the result
   return(result);
  }

마지막으로 추가한 라인의 (idx+1) 또는 (idx+2)...(idx+n)은 매우 간단하지만 매우 중요한 질문의 요점입니다: +1, +2, +3, 등은 현재 라인 앞에 있는 막대의 수(현재 라인은 실제 살아있는 "캔들"인 0번째 막대)입니다.

그림 15. 코드의 (idx) 변수에 대응하는 막대(캔들).

그래서, idx+N이 많을수록 더 많은 막대가 뒤로 이동합니다. 모든 막대 (idx+n)는 동일한 시간 프레임의 동일한 '수직' 위치에 있는 표시기 값에 해당합니다.

그림 16. 모든 막대(idx)는 상대적 CCI 값에 해당합니다.

그림 16에서 0번째 막대 (코드에서 idx 또는 (idx+0)에 해당하는 가장 오른쪽 첫 번째 촛불)의 해당 CCI 값은 0.00 미만입니다. 또한 두 번째 막대 (idx+1) 및 세 번째 막대 (idx+2) 의 값은 0.00 라인보다 작습니다. 세로 화살표로 다른 막대에 서명한 적은 없지만 마우스를 네 번째 막대를 가리키면(idx+3) 해당 CCI 값이 0.00 이상임을 알 수 있습니다.

대부분의 사용자에게 이러한 사실은 명백하지만 초보 사용자는 가격 차트의 그래픽 막대/캔들, CCI 지표의 그래픽 보기 및 CCIxx 지표의 (idx) 변수와 값이 서로 어떻게 대응하는지 아는 것이 좋습니다.

이것은 차트에서 선택한 표시기를 보고 선택한 표시기의 가격 막대/캔들과 동작 간의 대응성을 "시각화"하거나 "검색"하여 막대 인덱스(idx)와 표시 변수의 값을 사용하여 쉽게 코딩할 수 있는 전략을 세우는 것이 중요합니다.

SignalCCIxx.mqh 파일에서 다음 코드를 입력합니다:

CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0

단어로 작성된 의미는 다음과 같습니다:

CCI Indicator value (one bar before, named idx+1) is above the zero line of CCI indicator
AND
CCI Indicator value (two bars before, named idx+2) is below the zero line of CCI indicator

이것은 선택한 지표 값(이 경우 - CCI)만 기준으로 두 사용자 정의 패턴을 추가하는 방법에 대한 가장 작은 예입니다.

"가격이 상승할 것" 또는 "가격이 하락할 것"이라는 조건은 패턴에 이런 식으로 작성 및 추가되어야 하며, 누구도 더 복잡한 조건을 만드는 것을 금지하지 않습니다. 최종 테스트 전에 포지션이 열리고 닫히는 메커니즘을 살펴보겠습니다.

메커니즘과 논리는 이미 표준 라이브러리의 거래 전략 클래스 섹션에 있는 MQL5 Reference Manual에 잘 설명되어 있습니다.

간단히 MyExpert.mq5 파일에는 두 개의 입력 매개 변수(두 개의 정수 변수)가 있습니다:

//--- inputs for main signal
input int                Signal_ThresholdOpen =40;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose=60;          // Signal threshold value to close [0...100]

이러한 오픈 및 폐쇄 임계값은 (당사의 거래 모델에 따라) 거래를 장기 또는 단기로 연 다음 닫는 경우 컴퓨팅에 사용되는 두 가지 값입니다. 임계값은 0에서 100 사이의 정수 유형 숫자를 가정합니다. 이 매개변수는 무엇을 의미합니까?

Signal_ThresholdOpen은 장기 또는 단기 포지션을 열기 위한 값입니다, Signal_ThresholdClose는 이전의 오픈 포지션을 닫는 값입니다. 이러한 값은 Wizard가 생성한 EA의 전체 논리에 접착된 간단하지만 뛰어난 메커니즘의 맥락에서 계산됩니다.

Signal__.mqh files (__ 의 모든 신호는 사용된 표시기 이름을 나타냅니다. 우리의 경우, MA, RSI 및 CCIxx)는 앞에서 자세히 살펴본 것처럼 패턴으로 구성됩니다.) 이 예에서 다시 살펴보겠습니다. SignalMA.mqh 파일에는 모든 패턴에 대해 상대적인 "가중치"가 포함된 4가지 패턴이 있습니다:

//--- setting default "weights" of the market models
   m_pattern_0 =80;          // model 0 "price is on the necessary side from the indicator"
   m_pattern_1 =10;          // model 1 "price crossed the indicator with opposite direction"
   m_pattern_2 =60;          // model 2 "price crossed the indicator with the same direction"
   m_pattern_3 =60;          // model 3 "piercing"

또한 SignalRSI.mqh 파일의 RSI도 동일한 방식으로 사용할 수 있습니다:

//--- setting default "weights" of the market models
   m_pattern_0  =70;         // model 0 "the oscillator has required direction"
   m_pattern_1  =100;        // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =90;         // model 2 "failed swing"
   m_pattern_3  =80;         // model 3 "divergence of the oscillator and price"
   m_pattern_4  =100;        // model 4 "double divergence of the oscillator and price"
   m_pattern_5  =20;         // model 5 "head/shoulders"

"우리만의" SignalCCIxx.mqh(SignalCCI.mqh의 거의 복사본과 같다)에는 다음과 같은 값이 있습니다:

//--- setting default "weights" of the market models
   m_pattern_0  =90;         // model 0 "the oscillator has required direction"
   m_pattern_1  =60;         // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =100;        // model 3 "divergence of the oscillator and price"
   m_pattern_3  =50;         // model 4 "double divergence of the oscillator and price"
   m_pattern_4  =80;         // model 4 "our own first new pattern: "
   m_pattern_5  =90;         // model 5 "our own second new pattern: "

이것은 표준 0, 1, 2, 3에 마지막 두 값이 80과 90인 우리의 4와 5 패턴입니다. MyExpert.exe5를 차트에 첨부하거나 Strategy Tester에서 테스트하면 선택한 모든 신호(RSI, MA 및 CCIxx)의 패턴이 연속적으로 계산됩니다.

하나 이상의 패턴 조건이 성공하면 해당 패턴의 신호가 다음 컴퓨팅에 대해 활성화됩니다. 예를 들어, SignalCCIxx.mqh 파일에서 m_pattern_4가 발생하는 경우, 그 조건으로부터:

// if the model 4 is used, look for crossing of the zero line
       if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0)
          result=m_pattern_4;      // signal number 4 

잠재적인 거래 신호가 됩니다. 다시 말해, 막대 1의 CCI 값이 그림 5와 그림 6에서와 같이 0보다 크다면(CCI 값 > 0.0), 그리고 동시에 막대 2의 CCI 값이 0보다 작다면(CCI값 < 0.0), 조건이 발생하고 m_pattern_4 (신호 번호 4)가 활성화됩니다.

CCIxx 전략의 이 신호에 대해 설정한 가중치는 절대값 80과 동일하지만 "가격이 하락할 경우 투표"의 경우 -80, "가격이 상승할 경우 투표"의 경우 -80을 가정합니다. "가격이 하락할 것이라는 투표"는 패턴의 무게에 대한 원래 가치에 부정적인 신호를 줄 뿐입니다.

m_pattern_4의 조건이 성공적이라고 가정할 경우, 다음과 같은 경우에만 거래가 시작됩니다:

  • Signal number 4 (m_pattern_4)는 조건이 참(신호 활성화)인 유일한 신호입니다. 그리고 Signal_ThresholdOpen의 목표에 도달했습니다 (그 값에 계수를 곱하여 Signal_ThresholdOpen value에 도달하고 초과함).

  • 신호 번호 4가 Signal_ThresholdOpen의 목표에 도달했고, CCIxx 전략(CCIxx 전략의 "가격이 떨어질 것이라는 투표")의 그 자체 카운터파트경쟁하며, 그리고 모든 다른 지표기(RSI 신호 및 MA 신호)의 반대방향 신호와 경쟁합니다 (이 경우 반대방향은 단기 방향입니다, 왜냐하면 우리는 "가격이 상승할 것이라는 투표"에 대해 m_pattern_4를 분석하고 있기 때문입니다).

그래서 우리는 모든 패턴을 두 파벌의 경쟁자로 볼 수 있습니다: 황소(bull) 신호와 곰(bear) 신호. 동일한 방향의 이러한 패턴/신호("가격이 상승할 것이라는 투표")가 성공(활성화)하면, 서로 합산되고 합계는 Signal_ThresholdOpen 값과 비교됩니다. 오픈 포지션이 없거나 합계를 Signal_ThresholdClose 값과 비교하면, 이전에 반대 위치인 경우(이 예에서는 단기 포지션)에서, SignalCCIxx.mqh의 m_pattern_4 값은 다음과 같습니다:

  • "가격 상승" 조건의 경우 80입니다.
  • "가격 하락" 조건의 경우 -80입니다.

모든 신호의 다른 모든 패턴(SignalRSI.mqh, SignalMA.mqh 및 SignalCCIxx.mqh의 0,1,2,3,5 패턴)이 0의 값을 얻는다고 가정합니다. 이는 마치 "신호 경쟁자"가 "게임"에서 벗어나고, 유일한 경쟁자는 m_pattern_4 - 구매용 하나와 판매용 하나 따라서 m_pattern_4만 작동합니다. 0과 값이 다르기 때문입니다(예: 80).

//--- setting default "weights" of the market models
   m_pattern_0 =0;          // model 0 "price is on the necessary side from the indicator"
   m_pattern_1 =0;          // model 1 "price crossed the indicator with opposite direction"
   m_pattern_2 =0;          // model 2 "price crossed the indicator with the same direction"
   m_pattern_3 =0;          // model 3 "piercing"

또한 SignalRSI.mqh 파일의 RSI에 대해서도 같은 방식으로 사용합니다:

//--- setting default "weights" of the market models
   m_pattern_0  =0;         // model 0 "the oscillator has required direction"
   m_pattern_1  =0;        // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =0;        // model 2 "failed swing"
   m_pattern_3  =0;        // model 3 "divergence of the oscillator and price"
   m_pattern_4  =0;        // model 4 "double divergence of the oscillator and price"
   m_pattern_5  =0;        // model 5 "head/shoulders"

"우리만의" SignalCCIxx.mqh(SignalCCI.mqh의 거의 복사본과 같다)에는 다음과 같은 값이 있습니다:

//--- setting default "weights" of the market models
   m_pattern_0  =0;        // model 0 "the oscillator has required direction"
   m_pattern_1  =0;        // model 1 "reverse behind the level of overbuying/overselling"
   m_pattern_2  =0;        // model 3 "divergence of the oscillator and price"
   m_pattern_3  =0;        // model 4 "double divergence of the oscillator and price"
   m_pattern_4  =80;       // model 4 "our own first new pattern: "
   m_pattern_5  =0;        // model 5 "our own second new pattern: "

기사의 시작 부분에 다음과 같은 라인을 추가했습니다:

input int                Signal_CCIxx_PeriodCCI =8;            // Commodity Channel Index(8,...) Period of calculation
input ENUM_APPLIED_PRICE Signal_CCIxx_Applied   =PRICE_CLOSE;  // Commodity Channel Index(8,...) Prices series
input double             Signal_CCIxx_Weight    =0.8;          // Commodity Channel Index(8,...) Weight [0...1.0]

값이 0.8인 Signal_CCIxx_Weight 변수에 초점을 맞춥니다. 임계값에 도달하면, Signal_ThresholdOpen이 달성(트리거됨)됩니다. 값은 다음과 같이 계산됩니다:

0.8 (Signal_CCIxx_Weight input parameter)
*
80 (m_pattern_4's weight value)
= 64 is the signal strength for the "voting that price will grow"

알고리즘이 "가격 상승" 신호(SignalCCIxx의 m_pattern_4)를 포착하고 값이 80이므로 "가격이 상승할 것이라는 투표"입니다.

"가격 하락 투표"(SignalCCIxx의 m_pattern_4)를 가정한 경우 값은 -80입니다. "가격 하락"의 경우 알고리즘은 패턴 값에 마이너스 기호를 넣습니다. "가격 하락 투표"의 경우를 가정하면 다음과 같습니다:

0.8 (Signal_CCIxx_Weight input parameter)
*
-80 (m_pattern_4's weight value)
= -64 = the negative value is considered for short positions

-64 --> 64 (절대값)는 "가격이 하락할 투표"에 대한 신호 강도입니다. 신호 강도는 항상 절대값으로 표시되는 반면, 단기 포지션 값은 마이너스 기호와 장기 포지션 값 앞에 더하기 기호가 표시됩니다.

달성된 값이 64이고 신호 신호 강도 64인 장기 포지션, 위의 예로 돌아가겠습니다. 경쟁하는, 음의 부호가 있는 다른 반대 신호(Signal__의 m_pattern_N)가 없으면, 장기 신호의 강도는 64이고 Signal_ThresholdOpen의 레벨은 40이기 때문에 Signal_ThresholdOpen(임계값) 40이 달성되고 24(40+24=64)가 초과됩니다. Signal_ThresholdOpen에 도달하고 난 이후에, 장기 포지션이 열립니다.

예를 들어 Signal_CCIxx_Weight에 값 0.4를 설정하면 다음과 같은 이유로 장기 포지션이 열리지 않습니다:

0.4 (the Signal_CCIxx_Weight)
*
80(m_pattern_4)
= 32 (strength of "long signal")

레벨 40(Signal_ThresholdOpen)에 도달할 수 없습니다. 왜냐하면, 32 < 40이므로 장기 포지션이 열리지 않습니다.

위의 값 집합 예시(SignalCCIxx.mqh의 m_pattern_4에서 80을 제외한 모든 0 값)는 마법사에 숨겨진 우수한 논리와 가중치 및 임계값 시스템을 이해하는 데 사용됩니다. 일반 프로그래밍에서는 모든 Signal__의 각 m_pattern_N에 선호 가중치를 할당합니다. 패턴에 값 0을 할당하면 이 패턴이 사용되지 않음을 의미합니다.

위의 예에서 다른 값을 변경하면 (SignalCCIxx.mqh의 m_pattern_4를 제외한 모든 매개변수가 0으로 설정됨), SignalRSI.mqh의 m_pattern_1에서 100으로 계산이 변경되어 이제 경쟁자가 4입니다.

  • SignalCCIxx.mqh 파일로부터 m_pattern_4 (Bull)m_pattern_4 (Bear), 80-80의 각 값.
  • SignalRSI.mqh file 파일로부터 m_pattern_1 (Bull)m_pattern_1 (Bear), 100-100의 각 값.
m_pattern_4 Bullish --> 0.8 * 80 = 64
m_pattern_2 Bullish --> 0.7 * 100 = 70
m_pattern_4 Bearish --> 0.8 * (-80) = -64
m_pattern_2 Bearish --> 0.7 * (-100) = -70

따라서 다음과 같은 4가지 조합이 가능합니다:

A) m_pattern_4 Bullish + m_pattern_2 Bullish = {[0.8 * (80)] + [0.7 * (100)]}/2 = [64 + (70)]/2 = 134/2 = 67
B) m_pattern_4 Bullish + m_pattern_2 Bearish = {[0.8 * (80)] + [0.7 * (-100)]}/2 = [64 + (-70)]/2 = -6/2 = -3
C) m_pattern_4 Bearish + m_pattern_2 Bullish = {[0.8 * (-80)] + [0.7 * (100)]}/2 = [(-64) + 70]/2 = 6/2 = 3
D) m_pattern_4 Bearish + m_pattern_2 Bearish = {[0.8 * (-80)] + [0.7 * (-100)]}/2 = [(-64) + (-70)]/2 = -134/2 = -67

사례 A
양수 67. 양수 포지션이 열린 이유는 Signal_ThresholdOpen(임계값) 40으로 값이 도달 및 초과됩니다. Signal_ThresholdClose(임계값) 60이 달성되고, 사례 D = -67 = |67| (절대값)의 절대값을 초과할 때, 장기 포지션은 나중에 닫힙니다. 왜냐하면 사례 D 의 강도는 절대값으로 67 > 60이기 때문입니다. (즉, Signal_ThresholdClose의 임계값).

사례 B
음수 -3. 단기 포지션은 열리지 않습니다, 왜냐하면 Signal_ThresholdOpen(임계값) 40이 달성되지 않고, 사례 B의 절대값을 초과하지 않았기 때문입니다: "신호 강도"를 계산하기 위해 절대값을 고려할 때 -33이 됩니다, 그리고 3 < 40입니다(오픈 포지션에 대한 신호 값). 열린 단기 포지션이 없으며 단기 포지션을 닫기 위한 계산도 없습니다.

사례 C
양수 3. 장기 포지션은 열리지 않습니다, 왜냐하면 Signal_ThresholdOpen(임계값) 40이 달성되지 않았고 사례 C의 값을 초과하지 않았기 때문입니다, 3 < 40입니다(오픈 포지션에 대한 신호 값). 오픈 장기 포지션은 없고 장기 포지션을 닫기 위한 계산도 없습니다.

사례 D
음수 -67. 단기 포지션이 열립니다, 왜냐하면 Signal_ThresholdOpen(임계값) 40이 달성되고 단순히 절대값이 67 > 40으로 계산되는 신호 강도에 의해 초과되기 때문입니다. Signal_ThresholdClose(임계값) 60이 달성되고, 케이스 A의 값이 67로서, 67(사례 A의 강도)> 60(즉, Signal_ThresholdClose의 임계값) 이므로, 그 값이 초과 될때 단기포지션은 나중에 닫힙니다.

즉, 오픈 단기 포지션에 대해서, 먼저 우리는 신호 음수 값 때문에 방향을 식별하고, 그 다음에, 신호 강도를 계산하기 위하여 음수 값이 절대값으로 바뀝니다. 그리고 그 절대값과 Signal_ThresholdOpen(임계값)을 비교하여 확인합니다 (전자 >= 후자).

장기 포지션 닫기도 유사한 방식으로 수행됩니다: 먼저 장기 포지션 닫기의 음수 값을 고려합니다 (반대로, 단기 포지션 닫기는 양수임), 그 다음에, 이 음수 값은 Signal_ThresholdClose(임계값)와 비교할 절대값으로 바뀌고 두 값을 비교합니다. 전자(음수값) >= latter(임계값).

장기 포지션 열기단기 포지션 닫기 계산은 양수에 대해 계산이 수행되므로(마이너스 기호가 있는 신호는 없으므로) 계산에 절대값을 고려할 필요가 없습니다. 장기 포지션 열기는 신호 강도의 양수 값에 의해 트리거되고 단기 포지션 닫기도 신호 강도의 양수 값에 의해 트리거됩니다.

먼저 플러스 부호마이너스 부호를 확인하여, 장기 포지션 열기단기 포지션 열기, 그리고 단기 포지션 닫기장기 포지션 닫기가 각각 진행됩니다. 그런 다음, Signal_ThresholdOpen 및 Signal_ThresholdClose의 절대값을 계산하고, 그것은 항상 양의 부호로 계산 됩니다(Signal_ThresholdOpen 및 Signal_ThresholdClose에 대해서 음의 부호는 없습니다).


포지션 세부사항

계속해서 포지션에 대해 자세히 알아보겠습니다.

  • 정상 거래. 포지션은 열렸다 닫힙니다. 그 후에, 포지션은 즉시 다시 열리지 않습니다.
  • 포지션 반전. 포지션은 열렸다가 닫혔다가 반대 방향으로 다시 열립니다.

장기 포지션은 다음과 같은 경우에 열립니다:

Open_long >= Signal_ThresholdOpen
Signal_ThresholdClose <= Signal_ThresholdOpen
판매 신호를 수신하므로, 다음과 같은 경우 장기 포지션이 뒤바뀝니다.:

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

통계 캐리 거래 전략 통계 캐리 거래 전략
원치 않는 가격 이동으로부터 오픈 퍼지티브 스왑 포지션을 통계적으로 보호하는 알고리즘. 이 자료에는 오픈 포지션이 아닌 다른 방향으로 가격 이동의 잠재적 위험을 보상할 수 있는 운송 거래 보호 전략의 변형이 수록되어 있습니다.
MetaTrader 모바일 터미널의 MetaQuotes ID MetaTrader 모바일 터미널의 MetaQuotes ID
Android와 iOS로 구동되는 장치는 우리가 알지도 못하는 많은 기능을 제공합니다. 이러한 기능 중 하나는 전화번호나 모바일 네트워크 운영자에 관계없이 개인 메시지를 수신할 수 있는 푸시 알림입니다. MetaTrader 모바일 단말기(터미널)는 이미 거래 로봇으로부터 이러한 메시지를 바로 받을 수 있습니다. 장치의 MetaQuotes ID를 알고 있어야 합니다. 이미 9000,000개 이상의 모바일 단말기가 이를 수신했습니다.
신경망 네트워크: 이론에서 실전까지 신경망 네트워크: 이론에서 실전까지
요즘, 모든 거래자들은 신경망에 대해 들어봤을 것이고, 신경망을 사용하는 것이 얼마나 멋진지 알고 있을 것입니다. 대다수는 신경망을 다룰 수 있는 사람들이 일종의 초인적인 존재라고 믿습니다. 이 기사에서는 신경 네트워크 아키텍처를 설명하고, 그 적용 사례를 설명하며, 실제 사용 사례를 보여 드리겠습니다.
경험적 모드 분해법의 기초 경험적 모드 분해법의 기초
이 글은 경험적 모드 분해법(EMD)에 대한 설명입니다. 경험적 모드 분해는 힐베르트-황 변환의 기초가 되며 비정상 비선형 데이터 분석에 사용됩니다. EMD의 소프트웨어 구현 방법과 그 특징을 설명한 후 사용 예시를 함께 보겠습니다.