English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
Bill Williams의 "New Trading Dimensions"에 기반한 Expert Advisor

Bill Williams의 "New Trading Dimensions"에 기반한 Expert Advisor

MetaTrader 5트레이딩 시스템 | 18 8월 2021, 09:43
202 0
Alexey Klenov
Alexey Klenov


소개

이 글에서는 B. Williams의 New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities 책을 기반으로 한 거래 Expert Advisor의 개발에 대해 논의할 것입니다 (MQL5 언어의 MetaTrader 5 플랫폼 대상). 이 전략 자체는 잘 알려져 있으며 그 사용은 여전히 ​​트레이더들 사이에서 논란이 되고 있습니다. 

예를 들어 Elliott 파동 이론의 해석과 대조적으로 주관적인 측면이 "거의 완전히" 박탈된 신호에 대한 준비된 연구로 새로운 이민자를 끌어들입니다. 그러나 이것은 언뜻 보기에 일부 지역에서는 여전히 트레이더가 결정을 내려야 합니다. 그리고 이것은 글에서 더 논의 될 것입니다.

이 글의 목적:
  • OOP 패러다임(객체 지향 프로그래밍)을 사용하여 B. Williams의 전략을 기반으로 거래를 구현하는 EA 클래스를 개발합니다. C_TS_BW라고 부르겠습니다.
  • 가능하면 C_TS_BW 클래스에서 표준 라이브러리에서 미리 만들어진 코드를 사용합니다.
  • C_TS_BW 클래스를 사용하는 EA를 작성하십시오.
  • 여러 Forex 및 CFD 상품의 전략 테스터에서 개발된 EA를 테스트합니다.
  • 마지막으로, 현재 시장 상황에서 이 전략의 적성을 확인하거나 반박합니다.


1. 지표

거래 시스템의 기본에는 4가지 지표의 신호가 있습니다.

  1. 악어;
  2. 프랙탈;
  3. 굉장한 오실레이터;
  4. 가속/감속.

1.1. 악어

악어 기술 지표는 프랙탈 기하학과 비선형 역학을 사용하는 균형 선(이동 평균)의 조합입니다.

  • 파란색 선(악어의 턱) - 차트 작성에 사용된 기간에 대한 균형 선입니다(13개 기간의 평활 이동 평균, 미래로 8바 이동).
  • 빨간색 선(악어의 이빨) - 상당한 기간 동안의 균형선으로, 차수만큼 낮습니다(8주기 평활 이동 평균, 미래로 5바 이동).
  • 녹색 선(악어의 입술) - 상당한 기간 동안의 균형 선으로, 다른 차수만큼 낮습니다(5주기 평활 이동 평균, 미래로 3막 이동).

악어의 입술, 이빨, 턱선은 서로 다른 시간대의 상호 작용을 보여줍니다. 시장 추세는 15~30%의 시간 동안만 식별할 수 있으므로 추세를 따라야 하며 특정 가격 기간 내에서만 변동하는 시장에서 작업하지 않아야 합니다.

턱, 치아 및 입술이 닫히거나 얽혀 있으면 악어가 잠을 자거나 이미 자고 있습니다. 잠을 잘 때 배고픔이 늘어납니다. 그래서 잠을 더 잘수록 깨어나면 배고픔이 더 심해집니다. 잠에서 깨어나면 제일 먼저 입을 벌리고 하품을 합니다. 그런 다음 황소 또는 곰의 고기와 같은 음식 냄새를 듣기 시작하고 사냥을 시작합니다. 앨리게이터는 배고픔을 달래면 식량 가격에 대한 관심을 잃기 시작합니다(균형선이 합쳐짐). 지금이 이익을 고정할 때입니다.

1.2. 프랙탈

모든 시장은 대부분의 경우 가격 변동이 크지 않고 단기간(15~30%) 동안만 추세 변화를 볼 수 있는 것이 특징입니다. 이익추출에 가장 유리한 시기는 시장가격이 일정한 추세에 따라 변하는 시기입니다.

프랙탈(프랙탈) - Bill Williams의 거래 시스템의 4가지 지표 중 하나로 바닥 또는 상단을 감지할 수 있습니다. 상향 프랙탈의 기술적 정의는 최소 5개의 연속적인 바의 시리즈로, 최고 최대값 전후에 더 낮은 최대값을 갖는 두 개의 바가 있습니다. 반대 구성(최저 최소값 전후에 더 높은 최소값을 갖는 2개의 바가 있는 일련의 5개 바)은 하향 프랙탈입니다. 차트에서 프랙탈은 높음 및 낮음 값을 가지며 위쪽 또는 아래쪽 화살표로 표시됩니다.

기술 지표 프랙탈의 신호는 기술 지표 악어를 사용하여 필터링해야 합니다. 즉, 프랙탈이 악어의 이빨 아래에 있으면 매수하는 거래를 체결해서는 안 되며, 프랙탈이 악어의 이빨보다 위에 있으면 매도하는 거래를 체결해서는 안 됩니다. 프랙탈 신호가 형성되고 적용된 후 악어의 턱 너머의 포지션에 따라 결정되며 적중될 때까지 또는 보다 최근의 프랙탈 신호가 나타날 때까지 신호로 남아 있습니다.

1.3. AO(어썸 오실레이터)

Bill Williams(Awesome Oscillator, AO)의 Awesome Oscillator 기술 지표 - 바(H + L)/2의 평균 포인트를 뺀 34기간 단순 이동 평균입니다. 바(H + L)/2의 중심점으로 구성된 5기간 단순 이동 평균에서. 시장의 원동력으로 현재 어떤 일이 일어나고 있는지 알려드립니다.

1.4. AO(가속기 오실레이터)

가격은 변경되는 마지막 요소입니다. 가격이 바뀌기 전에 시장의 원동력이 바뀌고, 그 원동력이 방향을 바꾸기 전에 그 원동력의 가속도가 느려져서 0에 도달해야 합니다. 그런 다음 가격이 방향을 바꾸기 시작할 때까지 가속하기 시작합니다.

가속/감속 기술 표시기(가속/감속 오실레이터, AC)는 현재 구동력의 가속 및 감속을 측정합니다. 이 지표는 원동력의 변화가 일어나기 전에 방향을 바꿀 것이고, 차례로 가격 변화가 일어나기 전에 방향을 바꿀 것입니다. AC가 초기 경고 신호라는 것을 이해하면 분명한 이점이 있습니다.


2. 신호

B. Williams의 "New Trading Dimensions" 책에 설명된 거래 시스템은 5가지 거래 차원의 신호를 사용합니다.

  • 첫 번째 차원: 악어의 턱 너머의 프랙탈 극복
  • 두 번째 차원: AO 표시기(Awesome Oscillator)의 신호;
  • 세 번째 차원: AC 표시기(가속기 오실레이터)의 신호;
  • 네 번째 차원: 지역 거래;
  • 다섯 번째 차원: 균형 라인 거래.

각 차원의 신호에 대해 자세히 알아보십시오.


2.1. 첫 번째 차원의 신호에 의한 거래에 대한 설명

"A" 프랙탈(매수 신호)은 거짓입니다. 가격 할인이 악어의 턱선 아래에서 발생하기 때문입니다. "B" 프랙탈이 실행되고 열린 숏 포지션이 있습니다. "C" 프랙탈의 출현으로 우리는 숏 포지션을 청산하고 이미 순 롱 포지션을 보유하고 있습니다.

"D" 프랙탈이 깨지면서 우리는 다시 매수에서 매도 포지션으로 전환합니다. 매수에 대한 "E" 프랙탈을 극복하고 시장은 다시 한 번 포지션을 매도에서 매수로 변경해야 한다고 말합니다. "G""J" 프랙탈의 신호를 실행하여 롱 포지션에 하나의 계약을 더 추가합니다.

그림 1. 첫 번째 차원의 신호 거래의 예

그림 1. 첫 번째 차원의 신호 거래의 예

2.2. 2차원 신호에 의한 거래 설명

2차원의 두 가지 유형의 신호가 구현되었습니다. 이것은 AO(Awesome Oscillator) 표시기 제로 라인 크로스오버 및 "소서" 신호입니다. MetaTrader 5에서와 같이 바 색인시계열로 받아들여 보겠습니다. 신호 확인은 0번째 바에서 수행됩니다.

"제로 라인 크로스오버" 패턴을 형성하려면 표시기에 두 개의 바가 있어야 합니다.

매수 신호는 지표의 두 번째 바가 0선 아래에 있고 첫 번째 바가 0선 위에 있을 때 형성됩니다. 첫 번째 바의 최고가가 시그널이 되며, 초과할 경우 현재 가격을 사용하여 구매 주문을 서버로 전송합니다. 매도 신호는 반대의 경우 크로스오버에서 형성됩니다.

"접시" 패턴의 형성을 위해서는 세 개의 연속적인 바가 있어야 하며 두 번째 바는 빨간색으로 0선 위에 있어야 하며 첫 번째 바는 녹색이고 두 번째 바보다 높아야 합니다. 시그널링 가격은 첫 번째 바의 가장 높은 가격이 될 것이며, 현재 가격으로 극복되거나 새로운 구매 시그널이 형성될 때까지 유효합니다. "접시" 패턴의 매도 신호는 유사하지만 지표의 반대쪽에 형성됩니다.

"접시" 패턴의 형성을 위해서는 세 개의 연속적인 바가 있어야 하며 두 번째 바는 빨간색으로 0선 위에 있어야 하며 첫 번째 바는 녹색이고 두 번째 바보다 높아야 합니다. 시그널링 가격은 첫 번째 바의 가장 높은 가격이 될 것이며, 현재 가격으로 극복되거나 새로운 구매 시그널이 형성될 때까지 유효합니다. "접시" 패턴의 매도 신호는 유사하지만 지표의 반대쪽에 형성됩니다.

"Twin Peaks" 및 "Twin bottoms" 신호는 이 글에서 고려되지 않으며 형성이 거의 항상 악어의 반대쪽에서 발생하기 때문에 EA에서 프로그래밍되지 않습니다. 쌍둥이 바닥은 턱 아래에 있습니다. 선이고 쌍둥이 피크가 이 선 위에 있습니다. 그러한 신호에 대한 거래는 시스템과 모순됩니다. 악어에게 먹이를 주지 않기 위해 우리는 턱 아래에서 살 수 없고 악어 턱 위에서 팔 수 없습니다.

신호에 대한 자세한 설명은 원본 소스를 참조하는 것이 좋습니다.

그림 2. 두 번째 차원의 거래 신호의 예

그림 2. 두 번째 차원의 거래 신호의 예


2.3. 3차원의 거래 신호에 대한 설명

세 번째 차원에는 AC 표시기(액셀러레이터 오실레이터).

먼저 그림 3에 지정된 패턴을 살펴봅니다. 0번째 바에 대한 검사가 수행됩니다. 첫 번째 바가 0선 위에 있는 경우("A" 경우), 히스토그램의 두 개의 녹색 바와 하나의 빨간색 바로 구성됩니다. 한편 0선에 대한 두 번째 및 세 번째 바의 포지션는 중요하지 않습니다.

첫 번째 바가 0선 아래에 있으면("B" 경우) 매수 신호를 형성하기 위해 3개의 녹색 바와 1개의 빨간색 바가 필요합니다. 또한 0선에 대한 나머지 바도 고려하지 않습니다. 3차원의 매도 신호는 반비례합니다.

자세한 설명과 예시는 원문을 참고하세요.

그림 3. 3차원 신호의 거래 예

그림 3. 3차원 신호의 거래 예


2.4. 4차원차원의 거래 신호에 대한 설명("영역 거래")

녹색 영역은 일부 바에 대해 두 개의 표시기(AO+AC)가 녹색일 때 형성됩니다.

거래 신호의 형성은 두 개의 연속적인 그린 존이 필요하며 첫 번째 바의 종가가 두 번째 바의 종가보다 높아야 합니다.

새 바가 열리면 실행이 구현됩니다. 원작에서 실행은 바를 닫을 때의 순서여야 합니다. 닫는 바의 마지막 눈금이 AO 또는 AC 바의 색상을 변경할 수 있는 상황이 있으며, 이러한 경우 녹색 영역의 신호에 따른 매수가 거짓인 것으로 판명됩니다. 이러한 이유로 저는 새로운 바의 오프닝을 사용하여 구매했습니다.

또한 4차원에는 롱 포지션에 대한 스톱 오더를 추적하라는 신호가 있습니다.

이를 위해서는 5개의 연속적인 그린 존이 필요합니다. 첫 번째 구역 가격의 최소값은 손절매를 설정하는 데 사용됩니다. 스탑 주문이 다음 바(종료 후)에서 발동되지 않으면, 우리는 손절매를 마지막으로 완료된 바의 최소 가격으로 설정합니다(스탑 주문보다 높아야 함). 이전 바의 영역 색상을 고려합니다.

또한 연속 그린 존 수에 따라 오픈 롱 포지션에 추가 제한을 사용합니다. B. Williams는 6 또는 8 존을 권장합니다. 그런 다음 회색(AO 및 AC 열의 색상이 다른 경우) 또는 빨간색 영역이 나타날 때까지 기다려야 합니다. 그러면 다시 녹색 영역에서 구매 포지션을 채울 수 있습니다.

매도 신호는 녹색 영역의 거울 이미지인 "빨간색 영역"을 형성합니다. 영역의 색상은 "밸런스 라인 트레이드"(5차원)에서 신호를 형성하는 바의 수에도 영향을 줍니다. 이 라인을 위해 B. Williams는 악어의 "이빨"을 선택했습니다.

이 신호에서 저는 0번째 바의 OHLC 가격이 신호 형성에 참여한다는 것을 강조하고 싶습니다.

그림 4. 4차원 신호 거래의 예

그림 4. 4차원 신호 거래의 예


2.5. 5차원의 거래 신호에 대한 설명

"잔액선 위에서 매수" 패턴(녹색 영역인 경우)은 두 개의 바로 구성됩니다. 제로 바의 시작 가격(현재 바의 가장 높은 가격이기도 함)이 바의 마지막 최고 가격(몇 바 뒤에서 찾을 수 있음)보다 낮으면 발견된 최고 가격이 가격이 됩니다. 그린 존에서 매수 포지션을 열기 위한 것입니다.

빨간색 또는 회색 영역에는 녹색 영역에 입력하는 가격보다 높은 또 다른 최대값이 필요합니다. 우리가 그것을 발견하는 즉시(일반적으로 악어의 이빨 위로 10바 미만 [저자의 텍스트에서 그러한 패턴을 찾기 위해 뒤로 얼마나 많은 바를 찾아야 하는지 찾지 못함]), 그것을 구매 방향에 있어 빨간색 또는 회색 영역 진입하는 가격으로 가격으로 기억하십시오.

"밸런스 라인 위에서 매수" 신호에 의해 포지션을 열기 위해, 우리는 각각의 새로운 바(녹색/적색/회색 영역)의 가격을 초과하는 현재 가격을 확인합니다.

그림 5. 5차원 신호 거래의 예

그림 5. 5차원 신호 거래의 예


3. C_TS_BW 클래스

3.1. 클래스 목적:
  • 가능하면 표준 라이브러리 클래스를 사용하십시오.
  • 많은 양의 "유사한 데이터"가 구조에 저장되어야 합니다.
  • 설정의 사용자 정의;
  • 분석을 위해 지표에서 필요한 계산 데이터 수를 얻습니다.
  • 새 바가 표시되면 5가지 거래 차원의 신호를 확인합니다.
  • 새로운 틱이 발생하면 포지션을 여는 신호를 확인합니다.
  • 고정 또는 "피라미드"로 랏을 계산합니다(이 클래스의 CalcLot 메소드에서 이 알고리즘에 대해 학습합니다).
  • 신호의 각 유형에 대해 직접 EA의 랏을 변경할 수 있습니다. 자금 관리 알고리즘의 맞춤형 요구를 구현합니다.
  • 열린 포지션의 스톱 오더를 추적합니다. 필요한 경우 EA에서 사용자가 계산한 손절매 가격을 변경합니다.
  • 거래 서버에서 주문을 보내고 오류가 있는 경우 두 번째 요청을 합니다.
  • 거래 신호의 복제를 금지합니다(하나의 신호당 한 번만 입력).
  • 공개 클래스 메소드의 수를 최소화합니다.
3.2. 클래스 C_TS_BW의 구현
  • ...가능하면 표준 라이브러리의 클래스와 메소드를 사용하십시오;

이 작업을 수행하려면 먼저 표준 라이브러리에서 적절한 파일을 포함해야 합니다.

이것은 아래 코드로 구현됩니다.

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh

클래스의 비공개 섹션 에서 거래 요청 조직을 위한 개체를 선언하고, 기호 및 열린 포지션에 대한 정보를 다음과 같이 획득합니다. 주문 내역에 액세스할 수 있습니다.

CTrade            exp_trade;    // trading methods from the Standard Library
CSymbolInfo       s_info;       // methods of accessing the information on symbol
CPositionInfo     pos_info;     // methods of obtaining the information on position
CHistoryOrderInfo h_info;       // methods of accessing the history of orders
  • ... 많은 양의 "유사한 데이터"가 구조에 저장됩니다.

이 클래스는 4개의 구조를 사용하며 그 중 2개는 private 섹션에 선언되어 있습니다. 구조는 다음과 같습니다.

struct l_signals            // structure of signals and time of the bar, on which they appeared
struct l_trade              // structure of the time of the last triggered signals

또한 public 섹션에는 두 가지 구조가 있습니다.

struct  s_input_parametrs   // structure of the tuning parameters
struct  s_actual_action     // structure of the appropriate trading order

이러한 유형의 구조 대상:

l_signals         last_signals;     // signals
l_trade           last_trade;       // processed signals
s_input_parametrs inp_param;        // internal structure of the accepted settings
s_input_parametrs inp_param_tmp;    // receiving structure of the settings (received through a link with the initialization of the class)
s_actual_action   actual_action;    // orders on the serve

구조의 코드에 대한 자세한 내용은 첨부된 헤더 파일에서 확인할 수 있습니다.

  • ... 사용자 정의 설정;

이 작업은 public 섹션의 Init 메소드를 사용하여 구현됩니다. EA의 호출 매개변수:

string Symbol_for_trade             // symbol, on which the class will trade
ENUM_TIMEFRAMES Period_for_trade     // the period of the chart symbol, on which the search for signals and its processing will occur
s_input_parametrs &inp_param_tmp   // receiving structure of the class settings

이 방법에서는 관련 표시기의 초기화와 데이터 수신에 필요한 버퍼 구성도 발생합니다.

  • ... 분석 지표에서 필요한 수의 계산 데이터를 얻습니다.

이것은 private 섹션의 CopyIndValue 메소드를 사용하여 수행할 수 있습니다.

int type       // what we request  (0- Alligator, 2 - АО, 3 - АС  )
int countValue // amount of data

매개변수 type에 따라 수신 버퍼는 클래스 초기화를 위한 시계열로 구성된 계산된 데이터를 자동으로 대체합니다.

  • ... 새로운 바를 여는 동안 ...

신호 검색은 새 바를 연 후 한 번만 수행됩니다. 이를 위해 우리는 그 순간을 결정하기 위해 모였습니다. NewBar 메소드는 이를 수행하며 입력 매개변수가 없으며 수신된 틱이 새 바를 열 때 true를 반환하고 그렇지 않으면 false를 반환합니다.

  • ... 5가지 거래 차원의 신호를 확인합니다.

각 거래 차원에 대해 별도의 방법을 시작했습니다. 첫 번째 차원의 신호는 FindSignal_1_dimension에 의해 확인됩니다.

호출 매개변수:

int type               // direction of the fractal for the search (0- to buy, 1 to sell)
double &price_out[]    // this array, after a successful search, will contain the fractal price 
datetime &time_out[]   // in this array, after a successful search, will contain the time of the bar on which the fractal is found

두 번째 차원의 분석은 FindSignal_2_dimension 메소드로 수행됩니다. 호출 매개변수:

int type               // direction of the search (0-in the direction of to buy, 1-in the direction to sell)
int sub_type           // subtype of the search (0- signal of transferring the zero line, 1- sign "saucer")
double &price_out[]    // this array, after a successful search, will contain the signal price 
datetime &time_out[]   // this array, after a successful search, will contain the time of the bar signal

세 번째 차원의 분석은 입력/출력 매개변수와 함께 FindSignal_3_dimension 메소드를 사용하여 수행됩니다.

int type               // direction of the search (0-in the direction of to buy, 1-in the direction of to sell)
int sub_type           // subtype of the search (0-  signal on two identical bars, 1- signal for "three identical bars)
double &price_out[]    // this array, after a successful search, will contain the signal price
datetime &time_out[]   // this array, after a successful search, will contain the time of the bar signal

네 번째 차원의 처리는 입력/출력 매개변수가 있는 FindSignal_4_dimension 메소드로 수행됩니다.

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type           // what we are looking for (0- signal from the zones, 1- tailing stop for five consecutive zones of one color)
double &price_out[]    // this array, after a successful search, will contain the signal price
datetime &time_out[]   // this array, after a successful search, will contain the time of the signal bar

다섯 번째 차원은 FindSignal_5_dimension에 의해 모니터링됩니다. 이 방법의 매개변수:

int type               // direction of the search (0-in the direction to buy, 1-in the direction to sell)
int sub_type           // subtype of the search (0-  signal for two bars, 1- signal for three bars)
double &price_out[]    // this array, after a successful search, will contain the signal price
datetime &time_out[]   // this array, after a successful search, will contain the time of the bar signal

전체 검사는 CheckSignal 메소드로 통합되며 입력 매개변수가 없으며 다음을 포함합니다.

  • 지표에서 데이터 복사;
  • 앨리게이터의 일부 라인에 대한 포지션(사용되는 경우)의 마감을 확인합니다.
  • 이전 바의 신호 재설정;
  • 양방향에서 활성 프랙탈을 검색합니다.
  • 포지션의 가용성에 따라 열린 포지션 방향으로 2차원에서 5차원까지의 신호를 검색합니다.

이 메소드는 public 섹션에 선언되어 있으며 EA에서 호출해야 합니다.

  • ...새 틱이 도착하면 포지션 개방을 위한 신호 트리거 가능성을 확인하십시오.

이 클래스에서는 CheckForTradeSignal 메소드가 구현되어 현재 가격으로 포지션을 입력할 가능성을 검색합니다.

호출 매개변수:

int dimension        // number of the dimension (from the first to the fifth)
int type             // direction of the trade (0- buy, 1- sell)
int sub_type         // signal subtype from the trading dimension (described in the signal search)
double &price_out[]  // signal price
datetime &time_out[] // time of the signal bar

신호 활성화에 대한 모든 규정을 준수하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

모든 신호 처리는 public 섹션에 발표된 CheckActionOnTick 메소드로 결합되며 EA에서 호출해야 합니다. 호출에 대한 매개변수가 없습니다. 각 성공적인 신호는 actual_action 개체에 저장되며 나중에 TradeActualSignals 메소드에서 처리됩니다.

  • … 제비를 계산하십시오; 고정 또는 "피라미드"

CalcLot 메소드 public 섹션에 선언되어 있으며 EA에서 호출할 수 있습니다. 이는 클래스의 private 섹션에 선언된 Lot 변수의 추가 수정 및 랏 계산을 위한 것입니다. 호출 매개변수:

bool external // for the installation of the external calculated lot, you need to direct to this variable true, 
              // then the lot will be set by the value ext_lot. 
              // Inside this class (calculate the lot), the method is called with the parameter false.
double ext_lot // external size of the lot
int type // type of lot calculation 
         //(0- starting lot (use the value that was transferred during the initialization of the class, 
         //-1 turn over lot (the sum of the lot of the current position and the starting lot), 
         // the values from 5 to 2 are used if the aggressive trading mode is turned on (meaning "pyramiding").
         // In this mode: 5 – starting,  multiply by 5, 
         // 4 – starting,  multiply by 4,
         // 3 – starting,  multiply by 3, 
         // 2 – starting,  multiply by 2,
         // 1 - the filling lot is equal to the starting lot

고정 랏에 대해 살펴보았으므로 이제 "피라미드" 랏에 대해 더 이야기해 보겠습니다.

시작 랏을 0.1로 둡니다. 예를 들어, 프랙탈의 신호에 대한 시작 랏에서 열리면 악어의 턱 외부에서 총 포지션는 0.1 랏이 됩니다. 그런 다음 2차원에서 5차원으로 들어오는 신호를 분석하기 시작합니다. 신호가 발생하는 즉시 오픈 포지션에 0.5랏(시작, 5를 곱함)으로 채우고 포지션의 총 볼륨을 0.6랏으로 얻습니다. 오픈 포지션 방향의 다음 시그널 동안 0.4랏을 채우면 총 포지션은 1.0랏이 됩니다.

포지션 방향의 다음 신호는 우리에게 추가로 0.3랏을 줄 것이고 그 볼륨은 1.3랏이 될 것입니다. 5차 필인은 0.2랏에 이루어지며, 포지션의 총 물량은 1.5랏이 됩니다. 포지션 방향의 다음 필인은 0.1랏만 발생합니다.

이 자금 관리 알고리즘(ММ)은 B. Williams가 Trading Chaos에서 설명했습니다. 사용자 랏의 설치 가능성을 통해 실질적으로 모든 자본 관리를 구현할 수 있습니다.

거래에서 주문 순서를 정확하게 결정하기 위해 다양한 Magiс 번호를 사용합니다.

숫자

주문 설명

999

주문 뒤집기

1000

시작 순서

1001

채우기 순서(Х 1부터 시작)

1002

채우기 순서(Х 2부터 시작)

1003

채우기 순서(Х 3부터 시작)

1004

채우기 순서(Х 4부터 시작)

1005

채우기 순서(Х 5부터 시작)


클래스는 필요한 수를 계산했으며(CalcMagic 메소드 사용), 나중에 새 주문을 보내기 전에 서버에서 거래 작업을 식별하게 됩니다.

  • …각 신호 유형에 대해 직접 EA에서 랏을 변경할 수 있습니다.

원하는 경우 EA에서 거래 신호가 bool 변수 형식으로 저장되는 actual_action 구조의 쿼리를 구현할 수 있습니다. 각 유형과 방향은 변수에 해당합니다. 값이 true인 경우 이 틱에 대해 클래스는 지정된 거래 신호에 의해 거래 작업을 생성하려고 시도한 후 이 신호의 랏을 변경할 수 있습니다. 가격 변경의 각 틱에 대해 클래스는 열린 포지션 또는 채우기에 대해 하나의 주문만 보냅니다.

EA에서는 CheckActionOnTick 메소드 를 호출한 후와 TradeActualSignals를 호출하기 전에 랏을 설정할 수 있습니다. 현재 틱에는 실행을 기다리는 많은 신호가 있을 수 있으므로 하나만 선택됩니다.

신호 실행 순서:

  • 포지션 청산;
  • 프랙탈의 신호 중 하나 실행(열기, 다시 채우기, 포지션 뒤집기);
  • "접시" 신호;
  • "제로 라인 크로스오버" 신호;
  • AC "동일한 색상의 바 2개";
  • AC "동일한 색상의 바 3개";
  • 지역 거래;
  • 균형 라인(2개의 바 신호);
  • 균형 라인(3개의 바 신호);

따라서 "사용자" 랏 크기를 설치하는 동안 이 순서를 고려해야 합니다.

  • ... 열린 포지션의 추적 손절매. 필요한 경우 사용자가 EA에서 계산한 손절매 가격을 변경합니다.

설명된 클래스에는 이 가격에서 트리거를 위한 포지션에서 이익을 증가시키는 방향으로만 손절매를 끌어올리는 추적 손절매 방법에 의해 해당 포지션에서 Stop 가격이 유지됩니다. 다섯 가지 유지 관리 모델이 있습니다.

  • 악어의 입술 라인으로;
  • 악어의 이빨 라인으로;
  • 악어의 턱 라인으로;
  • 동일한 색상의 연속 5개 구역(녹색 구역은 매수, 적색 구역은 매도);
  • 정지 가격의 외부 설정.

손절매 설치의 다섯 번째 옵션은 SetStopLoss 메소드에 의해 구현되며 단일 매개변수 double & stoploss이 있습니다. 호출은 포지션 수정 가격을 확인하고 요청을 서버로 보내는 TrailingStop 메소드를 실행하기 전에 EA에서 이루어져야 합니다. 이 절차를 성공적으로 실행하면 내부 변수 StopLoss 의 값이 -1로 재설정됩니다.

  • ...오프닝 딜의 주문을 서버로 보내는 것을 제어하고, 실패하면 두 번째 요청을 합니다.

포지션의 개시, 청산 또는 전환을 위한 거래 주문을 보내기 위해 boolSendOrder 메소드가 사용됩니다. 호출 매개변수:

ENUM_ORDER_TYPE type   // direction of the trading operation
double &price_out[]    // pointer to the signal price, after a successful execution of the operation, set in -1;
datetime &time_out[]   // the pointer to the signal time, after a successful execution of the operation, set in -1;
string comment         // the commentary for the order

모든 거래 신호의 테스트는 TradeActualSignals 메소드로 결합됩니다. real_action 구조는 거래 주문을 저장합니다. 서버에 성공적으로 주문을 보낸 후(SendOrder가 true를 반환), actual_action 구조에서 거래 신호를 재설정합니다. 거래 신호는 전송에 대해 긍정적인 응답을 받을 때까지 활성화됩니다.

또한 실제_액션 초기화 구조에는 매개변수 없이 모든 현재 신호를 재설정하는 함수가 있습니다. 이 절차는 새 포지션을 열거나 기존 포지션의 뒤집기가 발생할 때 사용됩니다.

  • ...거래 신호의 복제를 금지합니다(각 신호에 대해 한 번만 입력).

last_trade 구조는 각 유형 및 방향에 대한 마지막 거래 신호의 시간을 저장합니다. 거래 주문을 actual_action 구조로 설정하기 전에 이 신호가 이미 last_trade 구조에서 거래되고 있는지 확인하고, 그렇다면 무시하십시오. 따라서 이것은 거래 상황의 "일회용" 실행에 대한 제어의 구현을 제공합니다.

  • 공개 클래스 메소드의 수를 최소화합니다.

다음은 EA에서 호출하여 사용할 수 있는 클래스 메소드 목록입니다.

void C_TS_BW();                                      // Constructor
bool Init(string Symbol_for_trade,
           ENUM_TIMEFRAMES Period_for_trade,
          s_input_parametrs  &inp_param_tmp);        // Initialization of the class
bool NewBar();                                       // Check for a new bar on the current symbol\time-frame
void CheckSignal();                                  // Search for signals
void CheckActionOnTick();                            // Collecting the desired actions on the current tick
void TrailingStop();                                 // Trailing Stop
void TradeActualSignals();                           // Trading by the current signals
void SetStopLoss(double  &stoploss);                 // Set Stop Loss
void CalcLot(bool external,double ext_lot,int type); // Calculation of the lot

다음과 같은 구조도 사용할 수 있습니다.

actual_action    // Current trading orders for execution
inp_param_tmp;   // Reception of the structure of settings
                 // (receives the data by the link during the initialization of the class)


4. C_TS_BW 클래스를 사용한 EA 구현

가장 먼저 해야 할 일은 Expert Advisor에 h_TS_BW.mqh 파일을 포함시키는 것입니다.

#include <h_TS_BW.mqh>

이후 C_TS_BW 클래스의 객체를 선언합니다. 이것을 EA_TS_BW라고 합시다.

또한 s_input_parameters(예: input_parametrs)와 같은 조정 가능한 매개변수의 구조가 필요합니다.

다음은 이 구조에 통합된 매개변수에 대한 설명입니다.

input_parametrs.alligator_jaw_period        // The Alligator: period of the Jaws line
input_parametrs.alligator_jaw_shift         // The Alligatpr: shift of the Jaws line
input_parametrs.alligator_teeth_period      // Alligator: period of the Teeth line
input_parametrs.alligator_teeth_shift       // Alligator: shift of the Teeth line
input_parametrs.alligator_lips_period       // Alligator: period of the Lips line
input_parametrs.alligator_lips_shift        // Alligator: shift of the Lips line
input_parametrs.add_1_dimension             // Allow the addition by Fractals
input_parametrs.add_2_dimension_bludce      // Allow the addition by the "Saucer" (АО) signal
input_parametrs.add_2_dimension_cross_zero  // Allow the addition by the "Crossing the zero line" (АО) signal 
input_parametrs.add_3_dimension_use_2_bars  // Allow the addition by the "АС 2 bars" signal 
input_parametrs.add_3_dimension_use_3_bars  // Allow the addition by the "АС 3 bars" signal
input_parametrs.add_4_dimension_zone        // Allow the addition by the red or the green zone
input_parametrs.add_5_dimension             // Allow the addition by the Balance Line
input_parametrs.max_4_dimension_zone        // The maximum amount of consecutive bars of zones of the same color 
input_parametrs.trall_4_dimension           // Allow a trail position using 5 consecutive bars of zones of the same color
input_parametrs.agress_trade_mm             // Aggressive style of filling in an open position
input_parametrs.support_position            // Type of trailing stop of the position
input_parametrs.lot                         // Trading lot

EA의 OnInit() 섹션 에서 다음을 수행해야 합니다.

  • input_parameters 구조의 모든 필수 값을 클래스에 전달할 데이터로 채우십시오.
  • 클래스의 Init 메소드를 사용하여 초기화합니다. 예:
expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)

이 경우 EA는 설치된 현재 기호/기간에서 작동합니다.

Expert Advisor의 OnTick() 섹션의 예:

//   double Sl[1];  
   if(expert_TS_BW.NewBar()) // new bar on the chart
     {
      expert_TS_BW.CheckSignal();       // signal search
     }
   expert_TS_BW.CheckActionOnTick();    // check for the required actions on the current tick
//---******************* the place of the beginning of external control of the lot, the stop 
//--- example of setting the lot for trade by the signal from the zones

//   if(expert_TS_BW.actual_action.zone_buy || expert_TS_BW.actual_action.zone_sell)
//     {expert_TS_BW.CalcLot(true,0.11,0);}
//--- setting the stop by the parabolic

//   CopyBuffer(h_parabolic,0,0,1,Sl);
//   if (Sl[0]>0){expert_TS_BW.SetStopLoss(Sl[0]);}
//---*******************the place of the end of external control of the lot, the stop 

   expert_TS_BW.TrailingStop();           // pulling-up the stop (if necessary)  
   expert_TS_BW.TradeActualSignals();     // trading of current signals

이 경우, 클래스 실행을 위한 정지 가격 및 거래 랏의 외부 통제의 예를 설명합니다.


5. 내역에 대한 몇 가지 테스트

EA가 작성된 책의 저자는 이 시스템이 주식과 상품 시장에 초점을 맞추고 있다고 주장합니다.

먼저 CFD에서 Expert Advisor를 확인해봅시다. 테스트 다각형이 IBM 내역의 일부가 될 것이라고 가정합니다. 시스템은 시세의 추세 세그먼트를 목표로 합니다. 나는 맨눈으로 추세를 볼 수있는 첫 번째 사용 가능한 세그먼트를 가져 왔습니다.

그림 6. IBM 차트

그림 6. IBM 차트

이 세그먼트에 대해 서면 Expert Advisor를 실행하고 다음은 주문으로 얻은 것입니다.

그림 7. Bill Williams(IBM)의 거래 신호

그림 7. Bill Williams(IBM)의 거래 신호

언뜻 보기에 추세에 따라 많은 거래가 있어 좋습니다. 다음은 Strategy Tester가 만든 차트입니다.

거래는 0.1 랏에서 악어 라인에 의해 닫히지 않고, 한 가지 색상의 연속 5개 구역을 사용하여 추적 손절매 없이, 공격적인 거래(피라미드) 없이 이루어졌습니다.

그림 8. 시험 결과

그림 8. 시험 결과

일반적으로 우리는 이익을 얻었습니다.

이제 더 적은 경향으로 장기 추세를 취합시다.

그림 9. IBM 차트(단편 2)

그림 9. IBM 차트(조각 2)

동일한 기호와 기간으로 하여 13개월(2008.12~2010.01)

다음은 전략 테스터의 차트입니다.

그림 10. 히스토리에 대한 시스템 테스트 결과(fragment 2)

그림 10. 기록에 대한 시스템 테스트 결과(조각 2)

"불만족" 또는 "기대에 미치지 못했습니다."라고 가정해 보겠습니다

다음으로 통화 쌍에 대한 작업을 확인하고 싶습니다.

잘 알려진 EURUSD 쌍과 차트의 H1 기간을 살펴보겠습니다. 내역의 깊이는 2010년이다.

그림 11. 이력에 대한 시스템 테스트 결과, EURUSD, H1, 2010

그림 11. 이력에 대한 시스템 테스트 결과, EURUSD, H1, 2010

같은 해(2010년) EURUSD의 일봉에서 그것을 시도해봅시다.

테스터의 보고서는 다음과 같습니다.

그림 12. 이력에 대한 시스템 테스트 결과, EURUSD, D1, 2010

그림 12. 이력에 대한 시스템 테스트 결과, EURUSD, D1, 2010


결론

이 글의 목적은 Bill Williams의 잘 알려진 거래 전략 중 하나가 주식 시장과 상품 거래소뿐만 아니라 Forex 시장에서 실행되고 있는지 확인하는 것이었습니다. 이 시스템은 지난 해 EURUSD 일일 차트에서 "다소" 작동하지만 최적화 시도 없이는 더 작은 기간에 이익을 내지 못합니다.

시스템의 시장 진입 신호는 조용하지만(일 차트를 보면) 수익의 절반 이상이 고정되어 있지 않기 때문에 출구가 분명히 지연됩니다. 이 필드는 더 작은 시간 프레임에 대한 최적화 측면에서 주어진 시스템을 개선하기 위한 것입니다.

클래스의 전체 코드는 첨부 파일에서 확인할 수 있습니다.


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

파일 첨부됨 |
h_ts_bw.mqh (57.84 KB)
적응형 거래 시스템과 MetaTrader 5 클라이언트 터미널에서의 사용 적응형 거래 시스템과 MetaTrader 5 클라이언트 터미널에서의 사용
이 글에서는 각각 고유한 "가상" 거래 작업을 수행하는 여러 전략으로 구성된 적응형 시스템의 변형을 제안합니다. 실제 거래는 현재 가장 수익성이 높은 전략의 신호에 따라 수행됩니다. 객체 지향 접근 방식, 데이터 작업을 위한 클래스 및 표준 라이브러리의 거래 클래스 덕분에 시스템 아키텍처는 단순하고 확장 가능한 것처럼 보였습니다. 이제 수백 가지 거래 전략을 포함하는 적응형 시스템을 쉽게 만들고 분석할 수 있습니다.
거래 시스템의 평가 - 일반적 진입, 퇴출 및 거래의 효율성 거래 시스템의 평가 - 일반적 진입, 퇴출 및 거래의 효율성
거래 시스템의 효율성과 수익성을 결정할 수 있는 많은 조치가 있습니다. 그러나 트레이더는 항상 모든 시스템을 새로운 충돌 테스트에 적용할 준비가 되어 있습니다. 이 글은 효율성 측정에 기반한 통계가 MetaTrader 5 플랫폼에 어떻게 사용될 수 있는지 알려줍니다. 여기에는 S.V.의 "Statistika dlya traderov"("Statistics for traders") 책에 나와 있는 설명과 모순되지 않는 거래로 통계 해석을 변환하는 클래스가 포함됩니다. 불라쇼프 (Bulashev). 또한 최적화를 위한 사용자 정의 함수의 예도 포함되어 있습니다.
MQL5의 Expert Advisor 테스트 및 최적화 가이드 MQL5의 Expert Advisor 테스트 및 최적화 가이드
이 문서에서는 코드 오류를 식별하고 해결하는 단계별 프로세스와 Expert Advisor 입력 매개변수를 테스트하고 최적화하는 단계를 설명합니다. MetaTrader 5 클라이언트 터미널의 Strategy Tester를 사용하여 Expert Advisor에 가장 적합한 기호와 입력 매개변수 세트를 찾는 방법을 배우게 됩니다.
MQL5에서 추세를 찾는 여러 방법 MQL5에서 추세를 찾는 여러 방법
모든 트레이더는 주어진 시간에 추세를 정확하게 감지하는 기회를 많이 얻게 됩니다. 아마 이거야 말로 모두가 찾고 있는 성배 (Holy Grail)일 것입니다. 이 글에서는 추세를 감지하는 몇 가지 방법을 고려해보겠습니다. 더 정확하게 말하면 MQL5를 통해 추세를 감지하는 몇 가지 고전적인 방법을 프로그래밍하는 방법입니다.