Monday 12 March 2018

Forex 전문가 고문 쓰기


첫 번째 전문 고문을 코딩하고 & # 8211; 코드 작성.


일단 종이에 거래 전략을 세우고 첫 번째 전문 고문을 코딩하는 데 필요한 원칙을 알고 있으면 코드 작성을 시작할 차례입니다. MetaTrader4가 설치되고 열리면 MetaEditor (F4)를 불러와 처음부터 새로운 EA를 만듭니다.


MetaTrader에서 전문가 조언자를 만드는 데 사용되는 언어 인 MQL4는 다음과 같이 고유 한 구조를 가지고 있습니다.


헤더 섹션은 글로벌 설정이 이루어지는 곳이며 EA를 구축 할 때 분명히 시작해야합니다. 여기서는 작업 할 지표와 매개 변수 및 EA가 사용할 신호를 식별 할 수 있습니다. 또한 EA의 이름을 정하고 멈춤과 같은 다른 전역 변수를 설정할 수있는 돈 관리 규칙을 설정하는 곳이기도합니다.


이동 평균을위한 헤더의 예 EA :


extern double StopLoss = 200; // pips에서 열린 주문에 대한 SL.


extern double TakeProfit = 39; // pips에서 열린 주문의 경우 ТР.


extern int Period_MA_1 = 50; // 첫 번째 MA의 기간.


extern int Period_MA_2 = 200; // 두 번째 MA의 기간.


extern double Rastvor = 25.0; // MA 사이의 거리.


extern double Lots = 0.1; // 로트 위치 크기를 설정합니다.


extern double Prots = 0.08; // 여유 여백 비율.


bool Work = true; // EA가 작동합니다.


문자열 기호; // 보안 이름.


특별 기능 초기화 & amp; 스타트.


코드의 다음 섹션에서 선택한 지표의 값을 검색하고 헤더에 지정된 거래 논리 및 시스템 기준을 초기화하고 현재 주문 및 신호를 반복 한 다음 신호를 확인합니다.


특수 함수의 프로세스는 표시기 값을 가져 와서 다른 프로세스를 순환합니다. 다음 코드는 OrdersAccounting에서 미결 주문을 확인합니다. 그런 다음 GetIndicatorValue에서 표시기 값을 찾습니다.


디스플레이 EAinfo (); // 이미 열려있는 위치의 총 개수를 반환합니다.


MACDnow = iMACD (Symbol (), 0, fast_EMA, slow_EMA, signal_period, MACDprice, 0,1);


이것은 MACD의 지표 값을 반환하며, MACD의 지표 값은 매수 및 매도 결정에 사용될 수 있습니다.


우리가 공개 포지션을 가지고 있지 않고 MACD가 0 선을 넘었을 때 우리는 시장에 매수 주문을 할 수 있습니다 :


우리가 공개 포지션을 가지고 있지 않고 MACD가 0 선 아래로 넘어 간다면 우리는 시장에 매도 주문을 입력 할 수 있습니다 :


거래 종료.


무역 거래를 종료하는 것은 무역 거래를 시작하는 것과 매우 유사하지만 역순으로 진행됩니다. 여기에 우리가 긴 포지션을 가지고 있고 MACD가 2를 넘으면 우리는 거래를 마감합니다 :


여기에서 우리가 짧은 포지션을 가지고 있고 MACD가 1을 넘으면 우리는 거래를 마감합니다 :


이제 간단한 EA의 기초를 알게되었으므로 MQL 커뮤니티로 이동하여 수천 명의 다른 거래자로부터 학습을 시작하는 것이 가장 좋습니다.


저자 정보.


최고 중개인.


ForexCrunch에 관하여.


렉스 크런치는 뉴스, 의견, 일일 및 주간 외환 분석, 기술 분석, 자습서, 외환 시장의 기초, 외환 소프트웨어 게시물, 외환 산업에 대한 통찰력 및 관련 내용으로 구성된 외환 시장에 관한 사이트입니다 Forex.


유용한 링크.


최근 업데이트.


부인 성명.


외환 (Forex) 거래는 높은 수준의 위험을 수반하며 모든 투자자에게 적합하지 않을 수 있습니다. 위험은 레버리지가 높을수록 커집니다. Forex 시장에 진입하기 전에 투자 목표, 리스크 선호도 및 트레이더의 경험 수준을 면밀히 검토해야합니다. 초기 투자 / 예금의 일부 또는 전부를 상실 할 가능성은 항상 있으므로, 잃을 여유가없는 돈을 투자해서는 안됩니다. 통화 거래와 관련된 높은 위험은 귀하에게 알려 져야합니다. 이 시장에 진출하기 전에 독립적 인 재정 고문에게 조언을 구하십시오. Forex Crunch 또는 Forex Crunch에서 비롯된 콘텐츠를 다시 게시 할 수있는 권한을 부여받은 다른 사이트에 대한 의견은 개별 저자의 의견을 반영하며 Forex Crunch의 승인 된 저자의 의견을 반드시 반영하지는 않습니다. Forex Crunch는 독립 저자가 작성한 모든 주장이나 진술의 정확성이나 기초를 검증하지 않았습니다. 누락과 오류가 발생할 수 있습니다. Forex Crunch에 포함 된 모든 뉴스, 분석, 의견, 가격 견적 또는 기타 정보는 일반 시장 논평으로 간주되어야합니다. 이것은 결코 투자 조언이 아닙니다. Forex Crunch는 그러한 정보의 사용으로 인해 직접 또는 간접적으로 발생할 수있는 손익, 손실 (이익 또는 손실을 포함하되 이에 국한되지 않음)에 대한 책임을지지 않습니다.


초보자를위한 MQL5의 전문가 고문 작성을위한 단계별 가이드.


소개.


이 기사는 새로운 MQL5 언어로 간단한 Expert Advisor를 작성하는 방법을 배우려는 초보자를 대상으로합니다. 먼저 EA (Expert Advisor)가 원하는 것을 정의한 다음 EA가 EA가 수행하기를 바라는 방향으로 나아갑니다.


1. 무역 전략.


EA가 수행 할 작업 :


특정 지표를 모니터링하고 특정 조건이 충족 될 때 (또는 특정 조건이 충족되는 경우), 충족 된 현재 조건에 따라 거래 (Short / Sell 또는 Long / Buy)를 수행합니다.


위를 거래 전략이라고합니다. EA를 작성하기 전에 EA로 자동화하려는 전략을 먼저 개발해야합니다. 따라서이 경우 EA로 개발하려는 전략을 반영하도록 위의 선언문을 수정하십시오.


이동 평균이라는 지표를 8 기간으로 사용합니다 (기간은 선택할 수 있지만 전략의 목적 상 8 가지를 사용합니다)


우리는 이제 우리의 전략을 개발했습니다. 이제 코드 작성을 시작할 시간입니다.


2. 전문가 고문 작성.


MetaQuotes 언어 편집기를 실행하여 시작하십시오. 5. 그런 다음 Ctrl + N을 누르거나 메뉴 표시 줄에서 새로 작성 단추를 누르십시오.


그림 1. 새로운 MQL5 문서 시작.


MQL5 Wizard 창에서 Expert Advisor를 선택하고 그림 2와 같이 "Next"를 클릭한다.


그림 2. 프로그램 유형 선택.


다음 창에서 이름 상자에 EA에 부여 할 이름을 입력하십시오. 이 경우 My_First_EA를 입력했습니다. 작성자 상자에 이름을 입력하고 링크 상자에 웹 사이트 주소 또는 주소 (있는 경우)를 입력 할 수 있습니다.


그림 3. Expert Advisor의 일반 속성


우리가 가장 좋은 결과를 줄 수있는 값을 보려면 EA의 매개 변수 중 일부를 변경할 수 있기를 원하기 때문에 "추가"버튼을 클릭하여 EA를 추가합니다.


그림 4. EA 입력 매개 변수 설정


EA에서는 Stop Loss, Profit, ADX Period 및 Moving Average Period 설정을 실험 할 수 있기를 원하므로이 시점에서이를 정의 할 것입니다.


이름 섹션 아래를 두 번 클릭하고 매개 변수의 이름을 입력 한 다음 유형 아래를 두 번 클릭하여 매개 변수의 데이터 유형을 선택하고 초기 값 섹션을 두 번 클릭하고 매개 변수의 초기 값을 입력하십시오.


일단 끝나면 다음과 같이 보일 것입니다.


그림 5. EA 입력 매개 변수의 데이터 유형


위에서 볼 수 있듯이 모든 매개 변수에 대해 integer (int) 데이터 형식을 선택했습니다. 데이터 유형에 대해 조금 이야기 해 보겠습니다.


char : char 타입은 1 바이트의 메모리 (8 비트)를 취하고 이진법 2 ^ 8 = 256 값으로 표현할 수 있습니다. char 유형에는 양수 값과 음수 값을 모두 포함 할 수 있습니다. 값의 범위는 -128에서 127 사이입니다. uchar : uchar 정수 유형은 char 유형뿐만 아니라 1 바이트의 메모리를 차지하지만 uchar과 달리 양수 값을위한 것입니다. 최소값은 0이고, 최대 값은 255입니다. uchar 유형 이름의 첫 번째 문자 u는 unsigned의 약어입니다. short : short 타입의 크기는 2 바이트 (16 비트)이므로 2와 동일한 값의 범위를 16 : 2 ^ 16 = 65 536으로 표현할 수 있습니다. short 타입은 부호 하나이므로, 양수 값과 음수 값을 모두 포함하는 경우 값 범위는 -32 768 ~ 32 767입니다. ushort : 부호없는 short 유형은 ushort 유형이며 2 바이트 크기입니다. 최소값은 0, 최대 값은 65 535입니다. int : int 유형의 크기는 4 바이트 (32 비트)입니다. 최소값은 -2 147 483 648이고 최대 값은 2 147 483 647입니다. uint : 부호없는 정수 유형은 uint입니다. 4 바이트의 메모리를 사용하며 0에서 4 294 967 295까지의 정수를 표현할 수 있습니다. long : long 유형의 크기는 8 바이트 (64 비트)입니다. 최소값은 -9 223 372 036 854 775 808이고 최대 값은 9 223 372 036 854 775 807입니다. ulong : 또한 ulong 유형은 8 바이트를 차지하며 0에서 18 446 744 073 709 551 615의 값을 저장할 수 있습니다.


다양한 데이터 유형에 대한 위의 설명에서 부호없는 정수 유형은 음수 값을 저장하도록 설계되지 않았으므로 음수 값을 설정하려고 시도하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 음수 값을 저장하려는 경우 부호없는 유형 (예 : uchar, uint, ushort, ulong)에 저장할 수 없습니다.


EA로 돌아 가기. 데이터 유형을 살펴보면, 이 매개 변수에 저장하려는 데이터가 각각 127 또는 255보다 작으므로 char 또는 uchar 데이터 유형을 사용한다고 가정하겠습니다. 좋은 메모리 관리를 위해서는 이것이 최선의 방법입니다. 그러나 우리의 논의를 위해서 우리는 여전히 int 타입을 고수 할 것입니다.


필요한 모든 매개 변수를 설정했으면 완료 버튼을 클릭하면 MetaQuotes Editor가 다음 그림과 같이 코드의 골격을 작성합니다.


더 나은 이해를 위해 코드를 여러 섹션으로 나누십시오.


코드의 상단 부분 (헤더)은 EA의 속성이 정의 된 곳입니다. 그림 3의 MQL5 마법사에서 채운 값을 볼 수 있습니다.


코드의이 섹션에서는 설명 (EA에 대한 간단한 텍스트 설명), 상수 선언, 추가 파일 포함 또는 가져 오기 기능과 같은 추가 매개 변수를 정의 할 수 있습니다.


# 기호로 시작하는 문장은 전 처리기 지시문이라고하며 세미콜론 ';'으로 끝나지 않습니다. 전처리 지시문의 다른 예에는 다음이 포함됩니다.


#define 지시문은 상수 선언에 사용됩니다. 그것은 형식으로 기록됩니다.


이것이하는 일은 코드의 모든 식별자 발생을 token_string 값으로 대체하는 것입니다.


#define COMPANY_NAME "MetaQuotes Software Corp."


COMPANY_NAME이 (가) 발생했을 때마다 "MetaQuotes Software Corp."문자열로 바뀝니다. 또는 ABC의 모든 발생을 코드의 char (또는 정수) 100으로 바꿉니다.


사전 처리기 지시문에 대한 자세한 내용은 MQL5 매뉴얼을 참조하십시오. 이제 우리의 토론을 계속하자.


우리 코드의 두 번째 부분은 입력 매개 변수 섹션입니다.


우리는이 섹션에서 EA에서 사용되는 모든 매개 변수를 지정합니다. 여기에는 EA에서 작성하게 될 모든 기능에 사용될 모든 변수가 포함됩니다.


이 레벨에서 선언 된 변수는 EA에서 필요로하는 모든 함수에서 액세스 할 수 있기 때문에 전역 변수라고합니다. 입력 매개 변수는 EA 외부에서만 변경할 수있는 매개 변수입니다. 우리는 EA 과정에서 조작 할 다른 변수를 선언 할 수도 있지만이 섹션에서는 EA 외부에서 사용할 수 없습니다.


다음은 EA 초기화 기능입니다. 이것은 EA가 시작되거나 차트에 첨부 될 때 호출되는 첫 번째 함수이며 한 번만 호출됩니다.


이 섹션은 EA가 잘 작동하는지 확인하기 위해 몇 가지 중요한 사항을 확인하는 가장 좋은 장소입니다.


차트에 EA가 작동하는 데 충분한 바가 있는지 등을 결정할 수 있습니다.


또한 지표 (ADX 및 이동 평균 지표)에 사용할 핸들을 얻는 가장 좋은 장소이기도합니다.


OnDeinit 함수는 EA가 차트에서 제거 될 때 호출됩니다.


우리 EA에서는이 섹션의 초기화 과정에서 지표에 대해 생성 된 핸들을 릴리즈 할 것입니다.


이 함수는 심볼에 대한 새로운 인용문이 수신 될 때 생성되는 NewTick 이벤트를 처리합니다.


Client Advisor가 클라이언트 단말기에서 Expert Advisors를 사용할 수없는 경우 Expert Advisor는 거래를 수행 할 수 없습니다 (버튼 "Auto Trading").


그림 6. 자동 정렬이 활성화되었습니다.


앞에서 개발 한 우리의 거래 전략을 구현할 대부분의 코드는이 섹션에 쓰여질 것입니다.


이제 우리 EA의 코드 섹션을 살펴 보았습니다. 이제 육체를 해골에 추가하기 시작하겠습니다.


2.2 입력 매개 변수 섹션.


보시다시피 더 많은 매개 변수가 추가되었습니다. 새로운 매개 변수에 대해 계속 논의하기 전에 지금 볼 수있는 것에 대해 논의 해 보겠습니다. 두 개의 슬래시 '//'를 사용하면 코드에 주석을 달 수 있습니다. 의견을 통해 우리는 변수가 무엇을 의미하는지 또는 코드에서 그 시점에 무엇을하고 있는지 알 수 있습니다. 또한 우리 코드에 대해 더 잘 이해할 수 있습니다. 주석을 쓰는 기본적인 두 가지 방법이 있습니다.


이것은 한 줄 주석입니다.


이것은 여러 줄 주석입니다.


이것은 여러 줄 주석입니다. 여러 줄 주석은 / * 기호 쌍으로 시작하고 * / 하나 기호로 끝납니다.


컴파일러는 코드를 컴파일 할 때 모든 주석을 무시합니다.


입력 매개 변수에 단일 행 주석을 사용하면 EA 사용자가 매개 변수의 의미를 이해할 수있는 좋은 방법입니다. EA 입력 속성에서 사용자는 매개 변수 자체를 볼 수 없지만 대신 아래에 표시된 것처럼 주석을 볼 수 있습니다.


그림 7. Expert Advisor 입력 매개 변수


자, 우리 코드로 되돌아 가세요 ...


EA에 추가 매개 변수를 추가하기로 결정했습니다. EA_Magic은 EA의 모든 주문에 대한 매직 번호입니다. 최소 ADX 값 (Adx_Min)은 이중 데이터 유형으로 선언됩니다. double은 정수 부분, 소수점 및 분수 부분을 포함하는 부동 소수점 상수를 저장하는 데 사용됩니다.


이중 mysum = 123.5678;


double b7 = 0.09876;


거래 할 Lot (Lot)은 우리가 거래하고자하는 금융 상품의 양을 나타냅니다. 그런 다음 우리가 사용할 다른 매개 변수를 선언했습니다.


mxHandle은 ADX 표시기 핸들을 저장하는 데 사용되며, maHandle은 이동 평균 표시기의 핸들을 저장합니다. plsDI [], minDI [], adxVal []는 차트의 각 막대에 대해 + DI, - DI 및 ADX 표시기의 기본 ADX 값을 보유 할 동적 배열입니다. maVal []은 차트의 각 막대에 대한 이동 평균 표시기의 값을 보유 할 동적 배열입니다.


그런데 동적 배열이란 무엇입니까? 동적 배열은 차원이없는 것으로 선언 된 배열입니다. 즉, 대괄호 쌍에는 값이 지정되지 않습니다. 한편, 정적 배열은 선언 지점에 정의 된 차원을가집니다.


두 배의 allbars [20]; // 이것은 20 개의 요소를 취합니다.


p_close는 우리가 Buy / Sell 거래를 체크하기 위해 모니터링 할 bar의 Close 가격을 저장하기 위해 사용할 변수입니다.


STP와 TKP는 EA에서 Stop Loss와 Take Profit 값을 저장하는 데 사용됩니다.


2.3. EA 초기화 섹션.


여기서 우리는 각 표시기 기능을 사용하여 표시기의 핸들을 얻습니다.


ADX 표시기 핸들은 iADX 기능을 사용하여 얻습니다. 차트 기호 (NULL은 현재 차트의 현재 기호를 의미 함), 차트 기간 / 시간 프레임 (0은 현재 차트의 현재 시간 프레임을 의미 함), 인덱스 계산을위한 ADX 평균 기간 (앞서 정의한 입력 매개 변수 섹션)을 매개 변수 또는 인수로 사용하십시오.


문자열 기호, // 기호 이름.


ENUM_TIMEFRAMES 기간, // 기간.


int adx_period // 평균 기간.


이동 평균 표시기 핸들은 iMA 기능을 사용하여 얻습니다. 여기에는 다음과 같은 인수가 있습니다.


차트 기호 (현재 차트의 현재 기호에 _symbol, symbol () 또는 NULL을 사용하여 얻을 수 있음)


문자열 기호, // 기호 이름.


ENUM_TIMEFRAMES 기간, // 기간.


int ma_period, // 평균 기간.


int ma_shift, // 수평 이동.


ENUM_MA_METHOD ma_method, // 스무딩 유형.


ENUM_APPLIED_PRICE applied_price // 가격 또는 핸들 유형.


이 표시기 기능에 대한 자세한 내용은 MQL5 설명서를 참조하십시오. 각 표시기를 사용하는 방법을 더 잘 이해할 수 있습니다.


함수가 핸들을 성공적으로 반환하지 않은 경우 오류를 확인하기 위해 다시 시도합니다. INVALID_HANDLE 오류가 발생합니다. 우리는 경고 함수를 사용하여 GetlastError 함수를 사용하여 오류를 표시합니다.


이전에 선언 한 변수 STP 및 TKP에 Stop Loss 및 Take Profit 값을 저장하기로 결정합니다. 우리가 왜 이러는거야?


이것은 INPUT 매개 변수에 저장된 값이 읽기 전용이기 때문에 수정할 수 없기 때문입니다. 여기서 우리는 EA가 모든 브로커와 잘 작동하는지 확인하고자합니다. 숫자 또는 숫자 ()는 현재 차트 기호의 가격 정확도를 결정하는 소수 자릿수를 나타냅니다. 5 자리 또는 3 자리 가격 차트의 경우 Stop Loss와 Take Profit에 10을 곱합니다.


2.4. EA 무결점 섹션.


EA가 비활성화되거나 차트에서 제거 될 때마다이 함수가 호출되기 때문에 여기서 초기화 프로세스 중에 생성 된 모든 표시기 핸들을 해제합니다. ADX 표시기와 이동 평균 표시기에 대한 핸들 두 개를 만들었습니다.


IndicatorRelease () 함수를 사용하여이를 수행합니다. 하나의 인수 (표시기 핸들) 만 필요합니다.


int indicator_handle, // 지시자 핸들.


함수는 표시기 핸들을 제거하고 표시기의 계산 블록을 사용하지 않은 경우 해제합니다.


2.5 EA ONTICK SECTION.


여기서해야 할 일은 현재 차트에 충분한 막대가 있는지 확인하는 것입니다. Bars 함수를 사용하여 차트의 전체 막대를 얻을 수 있습니다. 이 기호는 _Symbol 또는 Symbol ()을 사용하여 얻을 수있는 두 개의 매개 변수를가집니다. 이 두 매개 변수는 EA가 연결되어있는 현재 차트의 현재 기호와 현재 차트의 기간 또는 기간을 반환합니다 (Period 또는 Period ()를 선택하면 EA가 연결된 현재 차트의 기간이 반환됩니다.


사용 가능한 총 막대 수가 60보다 작 으면 차트에 충분한 막대가있을 때까지 EA에서 긴장을 풀기를 원합니다. 경고 기능은 별도의 창에 메시지를 표시합니다. 매개 변수 / 인수로 쉼표로 구분 된 값을 취합니다. 이 경우 문자열 값은 하나뿐입니다. 반환은 EA의 초기화를 종료합니다.


Expert Advisor는 새 바 시작과 동시에 거래 작업을 수행하므로 새로운 바 ID로 문제를 해결해야합니다. 즉 EA가 모든 틱에 대해 롱 / 숏 설정을 확인하지 않기를 원한다면 EA는 새로운 바가있을 때만 롱 / 숏 위치를 확인하기를 원합니다.


우리는 바 시간을 저장하는 정적 datetime 변수 Old_Time을 선언함으로써 시작합니다. 우리는 OnTick 함수의 다음 호출 때까지 값을 메모리에 보유하기를 원하기 때문에이를 정적으로 선언했습니다. 그런 다음 새 값 (현재 시간)을 유지하는 요소 하나의 배열 인 New_Time 변수 (날짜 / 시간 데이터 형식)와 해당 값을 비교할 수 있습니다. 또한 bool 데이터 유형 변수 IsNewBar를 선언하고 그 값을 false로 설정합니다. 우리가 새 막대가있을 때만 값이 TRUE가되기 때문입니다.


CopyTime 함수를 사용하여 현재 막대의 시간을 가져옵니다. 그것은 하나의 원소를 가지고 바 시간을 New_Time 배열에 복사합니다; 성공하면 이전 막대 시간과 새 막대의 시간을 비교합니다. 시간이 같지 않으면 새 막대가 있음을 의미하며 IsNewBar 변수를 TRUE로 설정하고 현재 막대 시간의 값을 Old_Time 변수에 저장합니다.


IsNewBar 변수는 새 막대가 있음을 나타냅니다. FALSE이면 OnTick 함수의 실행을 마칩니다.


코드를 살펴보십시오.


그것은 디버그 모드 실행을 검사하고, 디버그 모드 일 때 바 시간에 관한 메시지를 출력 할 것이고, 우리는 그것을 더 고려할 것이다.


우리가 여기서하고 싶은 일은 작업 할 막대가 충분한 지 확인하는 것입니다. 왜 그것을 반복 하는가? EA가 올바르게 작동하는지 확인하기 만하면됩니다. OnInit 함수는 EA가 차트에 첨부 될 때 한 번만 호출되지만 OnTick 함수는 새로운 눈금 (가격 시세)이있을 때마다 호출된다는 점에 유의해야합니다.


당신은 우리가 여기에서 다르게 그것을했다는 것을 관찰합니다. 우리는 표현에서 얻은 전체 막대를 역사에 저장하기로 결정합니다.


OnTick 함수 내에서 선언 된 새로운 변수 인 Mybars에서 이 유형의 변수는 코드의 INPUT PARAMETERS 섹션에서 선언 한 변수와 달리 로컬 변수입니다. 코드의 입력 매개 변수 섹션에 선언 된 변수는 필요한 모든 코드에서 사용할 수 있지만 단일 함수 내에서 선언 된 변수는 해당 함수에서만 사용할 수 있습니다. 이 함수는 그 함수 밖에서는 사용할 수 없습니다.


다음으로 EA의이 섹션에서 사용될 MQL5 구조 타입의 몇 가지 변수를 선언했다. MQL5는 많은 수의 구조체를 가지고있어서 EA 개발자가 쉽게 사용할 수 있습니다. 구조를 하나씩 가져가 봅시다.


이것은 심볼의 최신 가격을 저장하는 데 사용되는 구조입니다.


날짜 시간; // 마지막 가격 갱신의 시간.


두 번 입찰; // 현재 입찰 가격.


두 번 물어보십시오. // 현재 가격을 묻습니다.


마지막으로 두 번; // 마지막 거래 가격 (Last)


ulong volume; // 현재 Last 가격의 볼륨.


SymbolInfoTick () 함수를 호출하면 MqlTick 유형으로 선언 된 변수를 사용하여 Ask, Bid, Last 및 Volume의 현재 값을 쉽게 얻을 수 있습니다.


따라서 latest_price를 MqlTick 유형으로 선언하여 Ask 및 Bid 가격을 얻는 데 사용할 수 있습니다.


이 구조는 거래 작업에 대한 모든 거래 요청을 수행하는 데 사용됩니다. 무역 거래를 수행하는 데 필요한 모든 필드를 구조로 포함합니다.


ENUM_TRADE_REQUEST_ACTIONS 동작; // 거래 ​​유형.


ulong 마술; // 전문가 고문 ID (매직 넘버)


ulong 순서; // 티켓 주문.


문자열 기호; // 무역 기호.


이중 체적; // 거래 ​​내역 요청 수량.


두 배의 가격; // 가격.


double stoplimit; // 주문의 StopLimit 레벨.


더블 슬립; // 주문의 손실 수준을 중지합니다.


더블 tp; // 주문의 Profit 레벨을 취하십시오.


ulong 편차; // 요청 된 가격에서 가능한 최대 편차.


ENUM_ORDER_TYPE 유형; // 주문 유형.


ENUM_ORDER_TYPE_FILLING type_filling; // 주문 실행 유형.


ENUM_ORDER_TYPE_TIME type_time; // 실행 시간을 주문합니다.


datetime 만료; // 주문 만료 시간 (ORDER_TIME_SPECIFIED 유형의 주문)


문자열 주석; // 코멘트를 주문하십시오.


MqlTradeRequest 유형으로 선언 된 변수는 거래 업무를 위해 주문을 보내는 데 사용할 수 있습니다. 여기서 mrequest를 MqlTradeRequest 유형으로 선언했습니다.


모든 거래 작업의 결과는 MqlTradeResult 형식의 미리 정의 된 특수 구조로 반환됩니다. MqlTradeResult 유형으로 선언 된 변수는 거래 요청 결과에 액세스 할 수 있습니다.


uint retcode; // 연산 반환 코드.


ulong 거래; // 거래 ​​티켓 (수행 된 경우).


ulong 순서; // 티켓이 배치되면 주문하십시오.


이중 체적; // 브로커가 확인한 거래량.


두 배의 가격; // 브로커가 확인한 거래 가격.


두 번 입찰; // 현재 입찰 가격.


두 번 물어보십시오. // 현재 가격을 묻습니다.


문자열 주석; // 작업에 대한 브로커 주석 (기본적으로 작업 설명으로 채워짐)


이 구조에는 가격 (열기, 닫기, 높음, 낮음), 시간, 각 막대의 볼륨 및 기호에 대한 스프레드가 저장됩니다. MqlRates 유형으로 선언 된 배열은 심볼의 가격, 볼륨 및 스프레드 기록을 저장하는 데 사용할 수 있습니다.


날짜 시간; // 기간 시작 시간.


더블 오픈; // 공개 가격.


이중 높이; // 기간의 가장 높은 가격.


더블 저; // 기간의 가장 낮은 가격.


두 번 닫기; // 가격을 닫습니다.


긴 tick_volume; // 볼륨을 눈금.


int spread; // 스프레드.


long real_volume; // 거래량.


여기서 우리는이 정보를 저장하는 데 사용될 어레이 배열 []을 선언했습니다.


다음으로 우리는 바 세부 정보를 시리즈로 저장하기 위해 사용할 모든 배열을 설정하기로 결정합니다. 이것은 배열에 복사 될 값들이 바 인덱스와 일치하도록 timeseries, 즉 0, 1, 2, 3으로 인덱싱되도록하기 위해서입니다. 그래서 우리는 ArraySetAsSeries () 함수를 사용합니다.


void array [], // 참조로 배열.


bool set // true는 색인 생성의 역순을 나타냅니다.


이 작업은 코드의 초기화 섹션에서 한 번 수행 할 수 있습니다. 그러나, 나는이 설명에서 우리의 설명을 위해 그것을 보여 주기로 결정했다.


SymbolInfoTick 함수를 사용하여 최신 가격 견적을 얻습니다. 이 함수는 두 개의 인수, 즉 chart 심볼과 MqlTick 구조체 변수 (latest_price)를 취합니다. 다시 오류가 발생하면이를보고했습니다.


다음으로 CopyRates 함수를 사용하여 최신 3 개의 막대에 대한 정보를 Mqlrates 유형 배열에 복사했습니다. CopyRates 함수는 지정된 Symbol-Period의 MqlRates 구조체의 히스토리 데이터를 MqlRates 형식 배열로 가져 오는 데 사용됩니다.


string symbol_name, // 심볼 이름.


ENUM_TIMEFRAMES 시간대, // 기간.


int start_pos, // 시작 위치.


int count, // 복사 할 데이터 수.


MqlRates rates_array [] // 복사 할 배열을 지정합니다.


심볼 이름은 '_symbol'을 사용하여 얻고, 현재 기간 / 시간 프레임은 '_period'를 사용하여 얻습니다. 시작 위치에 대해 현재 막대, 막대 0부터 시작하여 막대 3, 막대 0, 1 및 2 만 계산합니다. 결과는 우리 배열에 저장 될 것입니다. [].


mrate [] 배열에는 막대 0, 1 및 2에 대한 모든 가격, 시간, 볼륨 및 스프레드 정보가 포함되어 있습니다. 따라서 막대의 세부 정보를 얻으려면 다음을 사용합니다.


예를 들어 각 막대에 대해 다음과 같은 정보를 가질 수 있습니다.


mrate [1].time // Bar 1 시작 시간.


mrate [1].open // Bar 1 오픈 가격.


mrate [0].high // Bar 0 (현재 바) 고가 등.


다음으로 CopyBuffer 함수를 사용하여 선언 한 동적 배열에 모든 표시기 값을 복사했습니다.


int indicator_handle, // 지시자 핸들.


int buffer_num, // 지시자 버퍼 번호.


int start_pos, // 시작 위치.


int count, // 복사 할 양.


double buffer [] // 복사 할 대상 배열.


인디케이터 핸들은 OnInit 섹션에서 생성 한 핸들입니다. 버퍼 번호와 관련하여 ADX 표시기에는 3 개의 버퍼가 있습니다.


이동 평균 표시기에는 하나의 버퍼 만 있습니다.


현재 막대 (0)에서 지난 두 막대까지 복사합니다. 복사 할 레코드의 양은 3입니다 (막대 0, 1 및 2). buffer []는 앞서 선언 한 대상 동적 배열 인 adxVal, plsDI, minDI 및 maVal입니다.


여기서 다시 볼 수 있듯이 복사 과정에서 발생할 수있는 오류를 포착하려고합니다. 오류가 있으면 더 이상 갈 필요가 없습니다.


CopyBuffer () 및 CopyRates () 함수는 오류가 발생할 때 -1을 반환하는 동안 성공시 복사 된 총 레코드 수를 반환한다는 점에 유의해야합니다. 그래서 여기서 오류 검사 기능에서 0보다 작은 값을 확인합니다.


이 시점에서 우리는 이미 매수 또는 매도 포지션을 가지고 있는지 확인하기를 원합니다. 즉, 한 번에 하나의 매도 또는 매수 매매를해야합니다. 우리는 이미 새로운 Buy를 오픈하고 싶지 않습니다. 이미 새로운 Buy를 오픈하고 싶다면 우리는 새로운 Sell을 오픈하고 싶지 않습니다.


달성하기 위해 우리는 먼저 Buy 또는 Sell에 대해 열리는 위치가있는 경우 TRUE 값을 보유 할 두 개의 bool 데이터 유형 변수 (Buy_opened 및 Sell_opened)를 선언합니다.


우리는 개방 기능이 있는지를 알기 위해 무역 기능 PositionSelect를 사용합니다. 이 함수는 이미 위치가 열려 있으면 TRUE를, 찾지 못하면 FALSE를 반환합니다.


주요 인수 / 매개 변수로 확인하고자하는 기호 (통화 쌍)를 취합니다. 여기서 우리는 현재 기호 (통화 쌍)를 검사하기 때문에 _symbol을 사용합니다.


이식이 TRUE를 반환하면 열린 위치가 Buy 또는 Sell인지 확인하려고합니다. 이를 위해 PositionGetInteger 함수를 사용합니다. POSITION_TYPE 수정 자와 함께 사용할 때 열린 위치 유형을 제공합니다. POSITION_TYPE_BUY 또는 POSITION_TYPE_SELL 중 하나 일 수있는 Position 유형 식별자를 리턴합니다.


우리의 경우, 우리는 이미 우리가 어떤 직책을 맡았는지 결정하기 위해 그것을 사용했습니다. 판매 인 경우 Sell_opened에 TRUE 값을 저장하고 Buy 인 경우 TRUE 값을 Buy_opened에 저장합니다. 나중에 우리의 코드에서 판매 조건이나 구매 조건을 확인할 때이 두 변수를 사용할 수 있습니다.


이제 구매 / 판매 설정에 사용할 술집의 마감 가격을 저장해야합니다. 이전에 변수를 선언했음을 기억하십시오.


이렇게하면 다음 단계로 넘어갑니다.


지금은 구매 기회를 확인할 때가되었습니다.


위의 식을 분석하여 이전에 설계 한 전략을 나타냅니다. 주문을하기 전에 충족되어야하는 각 조건에 대해 bool 유형 변수를 선언합니다. 부울 유형 변수에는 TRUE 또는 FALSE 만 포함될 수 있습니다. 따라서 우리의 구매 전략은 네 가지 조건으로 나뉩니다. 조건 중 하나라도 충족되거나 충족되면 TRUE 값이 BOOL 유형 변수에 저장되고, 그렇지 않으면 FALSE 값이 저장됩니다. 하나씩 살펴 보겠습니다.


여기서는 바 0, 1 및 2의 MA-8 값을 살펴 봅니다. 현재 막대의 MA-8 값이 이전 막대 1의 값보다 크고 막대 1의 MA-8 값이 막대 2의 값보다 큰 경우 MA-8이 위쪽으로 증가하고 있음을 의미합니다. 이는 구매 설정에 대한 Google의 조건 중 하나를 충족시킵니다.


이 표현은 Bar 1 Close 가격이 같은 기간 (Bar 1 기간)에 MA-8 값보다 높은지 확인하는 것입니다. 가격이 더 높으면 두 번째 조건도 충족되고 다른 조건을 확인할 수 있습니다. 그러나 방금 고려한 두 조건이 충족되지 않으면 다른 조건을 확인할 필요가 없습니다. 그래서 우리는이 두 가지 초기 조건 (표현식) 내에 다음 표현식을 포함 시키기로 결정한 것입니다.


이제 우리는 ADX의 현재 값 (Bar 0의 ADX 값)이 입력 매개 변수에 선언 된 Minimum ADX 값보다 큰지 확인하려고합니다. 이 표현식이 참이면 ADX의 현재 값이 최소 요구 값보다 커야합니다. 우리는 또한 plusDI 값이 minusDI 값보다 큰지 확인하고자합니다. 이것이 우리가 다음 표현에서 달성 한 것입니다.


이 모든 조건이 충족되면, 즉 진실이 반환된다면, 우리는 이미 새로운 구매 위치를 열지 않았 음을 확신합니다. 이제 코드에서 앞서 선언 한 Buy_opened 변수의 값을 확인해야합니다.


Buy_opened가 true이면 다른 구매 위치를 열지 않으므로 알림을 표시하고 알려 주시면 EA가 다음 Tick을 기다리게됩니다. 그러나 Buy_opened가 FALSE 인 경우 이전에 선언 한 MqlTradeRequest 유형 변수 (mrequest)를 사용하여 레코드를 준비합니다.


여기서 거래는 즉각적인 집행을 위해 거래 주문을하기 때문에 TRADE_ACTION_DEAL입니다. 주문을 수정할 경우 TRADE_ACTION_MODIFY를 사용합니다. 주문을 삭제하려면 TRADE_ACTION_REMOVE을 (를) 사용하십시오. 우리는 최신 Ask 가격을 얻기 위해 MqlTick 유형 latest_price를 사용했습니다. 주문 중단 손실 가격은 AskLevel에서 StopLoss 포인트를 뺀 값이며, TakeProfit을 Ask 가격에 추가하여 주문 이익 가격을 얻은 값입니다. Ask 가격, StopLoss 및 TakeProfit 값에 대해 NormalizeDouble 함수를 사용했음을 알 수 있습니다. 이 값을 거래 서버로 보내기 전에 통화 쌍의 자릿수로 항상 정규화하는 것이 좋습니다. 기호는 현재 기호 (_Symbol 또는 Symbol ())입니다. 주문 유형은 우리가 주문하는 주문의 유형입니다. 여기서는 구매 주문 ORDER_TYPE_BUY을 (를) 배치합니다. 판매 주문의 경우 ORDER_TYPE_SELL이됩니다.


OrderSend () 함수는 MqlTradeRequest 형식 변수와 MqlTradeResult 형식 변수라는 두 개의 인수를 사용합니다.


보시다시피 OrderSend를 사용하여 주문할 때 MqlTradeRequest 유형 변수와 MqlTradeResult 유형 변수를 사용했습니다.


주문을 보내면 MqlTradeResult 유형 변수를 사용하여 주문 결과를 확인합니다. 우리의 명령이 성공적으로 수행되면 알려주고 싶다. 알고 싶지 않다면 우리는 알고 싶어한다. MqlTradeResult 유형 변수 'mresult'를 사용하면 주문 반환 코드 인 Operation return에 액세스 할 수 있습니다.


리턴 코드 10009는 OrderSend 요청이 성공적으로 완료되었음을 나타내고 10008은 주문이 배치되었음을 보여줍니다. 그래서 우리는이 두 가지 반환 코드를 확인했습니다. 우리가 그 중 하나를 가지고 있다면, 우리는 주문이 완료되었거나 주문되었음을 확신합니다.


Sell ​​Opportunity를 확인하기 위해 우리는 ADX를 제외하고는 Buy Opportunity에 대해 수행 한 작업의 반대 작업을 확인합니다. 이 작업은 지정된 최소값보다 커야합니다.


구매 섹션에서했던 것처럼 우리는 주문을하기 전에 충족되어야하는 각 조건에 대한 bool 유형 변수를 선언합니다. A bool type variable can only contain TRUE or FALSE. So, our Sell strategy has been broken down into four conditions. If any of the conditions is met or satisfied, then a value of TRUE is stored in our bool type variable, otherwise, a value of FALSE will be stored. Let us look at them one by one as we did for the Buy section.


Here we are looking at the MA-8 values on Bars 0, 1 and 2 . If value of MA-8 on the current bar is less than its value on the previous Bar 1 and also the MA-8 value on Bar 1 is less than its value on Bar 2 , it means that MA-8 is decreasing downwards . This satisfies one of our conditions for a Sell setup.


This expression is checking to see if Bar 1 Close price is lower than the value of MA-8 at the same period (Bar 1 period). If the price is lower, then our second condition has also been satisfied, then we can check for other conditions. However, if the two conditions we have just considered were not met, then there will be no need to check other conditions. That is why we decide to include the next expressions within these two initial conditions (expressions).


Now we want to check if the current value of ADX (ADX value on Bar 0) is greater than the Minimum ADX value declared in the input parameters. If this expression is true, that is, the current value of ADX is greater than the Minimum required value; we also want to be sure that the MinusDI value is greater than the plusDI value. This is what we achieved in the next expression.


If these conditions are met, that is, if they return true, then we want to be sure that we do not open a new Buy position if we already have one. It is now time to check the value of the Buy_opened variable we declared earlier in our code.


If Sell_opened is true, we do not want to open another Sell position, so, we display an alert to inform us and then return so that our EA will now wait for the next Tick. However, if Sell_opened is FALSE, then we setup our Sell trade request as we did for Buying order.


The major difference here is the way we calculated our stop loss price and take profit price. Also since we are selling, we sell at the Bid price; that is why we used our MqlTick type variable latest_price to get the latest bid price. The other type here, as explained earlier, is ORDER_TYPE_SELL.


Also here, we used the NormalizeDouble function for the Bid price, the StopLoss and TakeProfit values, it is good practice to always normalize these prices to the number of digits of currency pair before sending it to the trade server.


Just as we did for our Buy order, we must also check if our Sell order is successful or not. So we used the same expression as in our Buy order.


3. Debugging and Testing our Expert Advisor.


At this point, we need to test our EA to know it our strategy works or not. Also, it is possible that there are one or two errors in our EA code. This will be discovered in the next step.


Debugging our code helps us to see how our code performs line by line (if we set breakpoints) and there and then we can notice any error or bug in our code and quickly make the necessary corrections before using our code in real trade.


Here, we are going to go through the step by step process of debugging our Expert Advisor, first of all, by setting breakpoints and secondly, without breakpoints . To do this, Make sure you have not closed the Editor. First of all, let us select the chart we want to use to test our EA. On the Editor Menu bar, click on Tools and click on Options as shown below:


Figure 8. Setting Debugging options.


Once the Options window appears, select the currency pair, and the period/timeframe to use and click the OK button:


Before we start the debugger, let us set breakpoints. Breakpoints allow us to monitor the behavior/performance of our code at certain selected locations or lines. Rather than running through all the code at once, the debugger will stop whenever it see a breakpoint, waiting for your net action. By this we will be able to analyze our code and monitor its behavior as it reaches every set break-points. We will also be able to evaluate the values of some of our variables to see if things are actually the way we envisaged.


To insert a breakpoint, go to the line in your code where you want to set the breakpoint. By the left hand side, on the gray field near the border of the code line, double-click and you will see a small round blue button with a white square inside it. Or on the alternative, place the cursor of your mouse anywhere on the code line where you want the breakpoint to appear and press F9 . To remove the breakpoint, press F9 again or double-click on it.


Figure 10. Setting a breakpoint.


For our code, we are going to set breakpoint on five different lines.


I will also label them form 1 to 5 for the sake of explanation.


To continue, set breakpoint at the seven code lines as shown in the figure below. Breakpoint 1 is the one we have created above.


Figure 11. Setting additional breakpoints.


Once we have finished setting our breakpoints, we are now set to start debugging our code.


To start the debugger, press F5 or click the green button on the Toolbar of the MetaEditor:


Figure 12. Starting the Debugger.


The first thing the editor does is to compile the code, if there is any error at the point, it will display it and if no error, it will let you know that the code compiled successfully.


Figure 13. Compilation Report.


Please note that the fact that the code compiled successfully does not mean there may not be errors in your code. Depending on how your code is written, there may be runtime errors. For example, if any of our expressions does not evaluate correctly due to any little oversight, the code will compile correctly but may not run correctly. Too much of the talk, let’s see it in action…


Once the debugger has finished compiling the code, it takes you to the trading terminal, and attach the EA to the chart you have specified on the MetaEditor Options settings. At the same time, it shows you the Input parameters section of the EA. Since we are not adjusting anything yet, just click the OK button.


Figure 14. Expert Advisor Input Parameters for Debugging.


You will now see the EA clearly on the top-right hand corner of the chart.


Once it starts the OnTick() , it will stop as soon as it gets to our breakpoint 1.


Figure 15. Debugger stops at the first breakpoint.


You will notice a green arrow at that code line. That tells you that previous code line had been executed; we are now ready to execute the present line.


Let me make some explanations before we proceed. If you look at the Editor’s Tool Bar, you will observe that the three buttons with curved arrows which were earlier grayed out are now activated. This is because we are now running the debugger. These buttons/commands are used to step through our code (Step into, Step over or Step out)


Figure 16. Step into command.


The Step Into is used to go from one step of the program execution into the next step, entering into any called functions within that code line. Click on the button or press F11 to invoke the command. (We will use this command in our Step-by-Step debugging of our code.)


Figure 17. Step over command.


The Step over , on the other hand does not enter into any called function within that code line. Click on the button or press F10 to invoke the command.


Figure 18. Step out command.


To execute a program step that is one level higher, you click this button or press Shift+F11 .


Also, at the lower part of the Editor, you will see the Toolbox window . The Debug tab in this window has the following headings:


File : This displays the name of the file been called Function : This displays the present function from the file been called Line : This displays the number of the code line in the file from which the function is called. Expression : This is where you can type the name of any expression/variable you are interested in monitoring from our code. Value : This will display the value of the expression/variable we typed at the Expression area. Type : This will display the data type of the expression/variable been monitored.


Back to our debugging process…


The next thing we want to do is now to type in the variables/expressions from our code that we are interested in monitoring. Make sure you only monitor the variables/expressions that really matters in your code. For our example, we will monitor the following:


Old_Time (old bar time) New_Time[0] (current bar time) IsNewBar (flag that indicates the new bar)


You can add other ones like the ADX values, the MA-8 values, etc.


To add the expression/variable, double-click under the Expressions area or right-click under the Expressions area and select Add as shown in the figure above.


Type the expression/variable to monitor or watch.


Figure 19. The expressions watching window.


Type all the necessary variables/expressions…


Figure 20. Adding expressions or variables to watch.


If the variable hasn't been declared yet, its type is "Unknown identifier" (except the static variables).


Now, lets move on…


Figure 21. Step into command in action.


Click the Step into button or press F11 and observe what happens. Keep on pressing this button or F11 until you get to breakpoint no 2 , continue until you get to breakpoint no 4 as shown below and observe the expressions watching window.


Figure 22. Watching the expressions or variables.


Figure 23. Watching the expressions or variables.


Figure 24. Watching the expressions or variables.


Once there is a new tick, it will return to the fist code line of the OnTick() function. And all the values of our variables/expression will now be reset because this is a new tick except if any of them is declared as a static variable. In our case we have one static variable Old_Time.


Figure 25. Values of variables on NewTick event.


To go over the process again, continue pressing the F11 key and keep monitoring the variables at the expressions watching window. You can stop the debugger and then remove all the breakpoints.


As we see, in Debug mode it prints the message "We have new bar here. ".


Figure 26. Expert Advisor prints the message in Debug mode.


Start the debugging process again; but this time without breakpoints. Keep watching at every tick and if any of our Buy/Sell condition is met, it will place a trade and since we have written our code to tell us if an order is placed successful or otherwise, we will see an alert.


Figure 27. Expert Advisor places trade during debugging.


I think you can leave the EA to work for a few more minutes while you take a coffee. Once you are back and you have made some money ( just kidding ), then click the STOP (Red) button on the MetaEditor to stop debugging.


Figure 28. Stopping the debugger.


What we have actually done here is to see that our EA only checks for a trade at the opening of a new Bar and that our EA actually works. There is still a lot of room for adjustments to our EA code.


Let me make it clear, at this point that, the Trading terminal must be connected to the internet, otherwise, debugging will not work because the terminal will not be able to trade.


3.2 TESTING OUR EA STRATEGY.


At this point we now want to test our EA using the Strategy Tester built into the Trading Terminal. To start the Strategy Tester, press CONTROL+R or click the View menu on the Terminal Menu Bar and click on Strategy Tester as shown below.


Figure 26. Starting the Strategy Testing.


The Tester (Strategy Tester) is shown at the lower part of the terminal. For you to see all the Tester’s settings, you need to expand/resize it. To do this, move your mouse pointer to the point shown by the red arrow (as shown below)


Figure 27. The Strategy Tester window.


The mouse pointer changes to a double-end arrow, hold down the mouse and drag the line upwards. Stop when you discover that you can see everything on the settings tab.


Figure 28. The Strategy Tester Settings Tab.


Select the EA you want to test Select the Currency pair to use for the test Select the Period/Timeframe to use for the test Select Custom Period and set the dates in 5 Set the dates for the custom period to be used for the test Execution is Normal Select the deposit amount in USD to be used for the test Set Optimization to Disable (We are not optimizing now, we just want to test) Click this button when you are ready to start test.


Before we click the Start button, lets look at the other tabs on the Tester.


The processor used by the Tester for the Test. Depending on your Computer’s processor type. Mine is only one (1) core processor.


Figure 29. The Strategy Tester Agents tab.


Once the agent, you will see something similar to the figure below.


Figure 30. The Strategy Tester Agents tab during a test.


This is where all the events going on during the test period is displayed.


Figure 31. The Strategy Tester Journal tab showing trade activities.


This is where you can specify the input parameters for the EA.


Figure 32. The Strategy Tester Inputs tab.


If we are optimizing our EA, then we will need to set the values in the circled area.


The Start is the values you want the Tester to begin with. The Step is the increment rate for the value you selected, and The Stop is the value at which the Tester will stop incrementing the value for that parameter.


However, in our case we are not optimizing our EA, so we will not need to touch that for now.


Once everything is set, we now go back to the Settings tab and click the Start button. Then the tester begins its work. All you need to do now is to go and take another cup of coffee if you like, or, if you are like me, you may want to monitor every event, then turn to the Journal tab.


Once you begin to see messages about orders been sent on the Journal Tab, you may then wish to turn to a NEW tab named Graph which has just been created. Once you switch to the Graph tab, you will see the graph keep on increasing or decreasing as the case may be depending on the outcome of your trades.


Figure 33. The graph result for the Expert Advisor Test.


Once the test is completed, you will see another tab called Results . Switch to the Results tab and you will see the summary of the test we have just carried out.


Figure 34. The Strategy Tester Results tab showing test results summary.


You can see the total Gross Profit, Net Profit, total trades total loss trades and many more. Its really interesting to see that we have about USD 1,450.0 within the period we selected for our test. At least we have some profit.


Let me make something very clear to you here. You will discover that the settings for the EA parameters that you see in the Strategy tester is different from the initial settings in the Input parameters of the EA. I have just demonstrated to you that you can change any of those input parameters to get the best out of your EA. Instead of using a period of 8 each for the Moving Average and ADX, I changed it to 10 for Moving Average and 14 for ADX. I also change the Stop Loss from 30 to 35. Last but not the least, I decided to use 2 Hour timeframe. Remember, this is the Strategy Tester.


If you want to view a complete report of the test, then right-click on anywhere in the Results tab, you will see a menu. From this menu, Select ‘ Save as Report’ .


Figure 35. Saving the result of the test.


The save dialog window will appear, type a name for your report (if you want, otherwise leave the default name) and click the save button. The whole report will be saved in HTML format for you.


To view the chart for the test that was carried out, click Open Chart and you will see the chart displayed.


Figure 36. The chart showing the test.


That’s it, we have successfully written and tested our EA and we now have a result to work with. You can now go back to the strategy tester Settings tab and make the test for other Timeframes/Period.


I want you to carry out the test using different currency pairs, different timeframes, different Stop Loss, different Take profit and see how the EA performs. You can even try new Moving Average and ADX values. As I said earlier, that is the essence of the Strategy tester. I will also like you to share your results with me.


결론.


In this step by step guide, we have been able to look at the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. We have also looked at how we check our EA for errors using the debugger. We also discussed how to test the performance of our EA using the Strategy Tester. With this, we have been able to see the power and robustness of the new MQL5 language. Our EA is not yet perfect or complete as many more adjustments must still be made in order to used it for real trading.


There is still more to learn and I want you to read the article over again together with the MQL5 manual, and try everything you have learn in this article, I can assure you that you will be a great EA developer in no distant future.


Advanced Guide To MetaTrader 4 - Expert Advisors.


Click on the MetaEditor icon in the Standard Toolbar: or.


Link - To the developer's website, if applicable.


Inputs - the list of Expert inputs To add a new parameter to the Inputs field, press the "Add" button. For each Parameter, the trader must specify the Name, Type and Initial Value, as shown in Figure 3. To delete a parameter, highlight the parameter and press "Delete." These become the Input Variables within the Expert. Once all the inputs have been listed, click "Finish" to continue.


OP_BUYLIMIT - Buy limit pending position.


OP_SELLLIMIT - Sell limit pending position.


Traders can find a MQL4 Reference in the Help tab of the Toolbox in the MetaEditor window. This Reference includes information that is helpful to beginner and experienced programmers including:


Select File > Compile (see Figure 6); 또는.


Click the Compile button on the toolbar; 또는.


Press F5 on the computer keyboard. Once compiling has been initiated, an update appears in the Toolbox beneath the code in the MetaEditor window, as shown in Figure 6. An errors or warnings will be listed.


Expert Advisor Setup.


Pressing CTRL + O on the computer keyboard.


Either action will open the "Options" window. Select the "Expert Advisors" tab, as shown in Figure 8.


Enable Expert Advisors - this option allows the user to enable (check) or disable (uncheck) the use of all Experts.


Disable experts when the account has been changed - this option disables the Expert if the account has been changes, such as from a demo to a live account.


Disable experts when the profile has been changed - this option prevents Experts from launching if the profile has changed.


Allow live trading - to enable Experts in real-time mode (rather than testing an Expert on historical data).


Ask manual confirmation - to send trade confirmation prior to submitting the order.


DLL 가져 오기 허용 - DLL을 사용하여 전문가 기능을 향상시킵니다.


DLL 함수 호출 확인 - 호출 된 각 함수의 실행을 제어 할 수 있습니다.


Allow external experts imports - to allow the Expert to access functions from other Experts or MQL4 libraries. Once the selections have been made, click "OK" to close the window.


After the Expert has been created and setup, it is ready to be launched. To launch an Expert:


All Experts are shutdown if the Terminal is closed.


If a chart is closed, the Expert attached to the chart will shut down as well.


Adding another Expert to a chart will remove the previous one (a confirmation appears).


Deleting the Expert from the Navigator window does not shut down an Expert of the same name on an active price chart. SEE: Trading Systems Coding.


전문가 고문.


Inexperienced beginners are always interested in finding a trade robot that does all the work, so that the trader does not have to lift a finger. This idea has been pursued by all traders of the computer age. 상인의 신경을 쓰는 의사 결정에 대한 책임 부담은 무역 거래 전문가 전문가에게 정면으로 드러납니다.


Forex Expert Advisor는 무엇입니까?


외환 전문 고문은 직접 참여하지 않고 상인의 지시에 따라 행동을 수행 할 수있는 프로그램입니다. 모든 작업은 자동 또는 기계적으로 수행되므로 어드바이저는 전문가 또는 기계 거래 시스템 (MTS)으로 불립니다. 간단히 말해서, 이것은 상인의 ​​개입없이 중개인에게 응용 프로그램을 보내는 프로그램입니다. 서버 브로커에 연결된 기존 외환 온라인 거래 플랫폼에 이익 외환 전문가를 설치하고 모든 설정을 조정하면 사전 설정 전략에 따라 거래가 시작됩니다.


Forex Expert Advisors의 이점.


심리적 인 관점에서, forex 전문가 고문은 대신 할 수 없습니다. 상인은 의사 결정에 대한 책임을 줄이고 거래는 덜 스트레스를받습니다. 상인은 모든 계산이 이미 프로그램에 포함되어 있기 때문에 기술 및 기본 분석에 대한 심층적 인 지식이 필요하지 않습니다. 게다가, 고문은 상인이 직장에없는 경우에도 거래 신호를 처리 할 수 ​​있습니다.


Forex Expert Advisor 작성.


MetaTrader4의 Forex Expert Advisors는 MQL4 프로그래밍 언어로 작성되었습니다. 이 언어는 전문 고문 작성을 위해 무역 단말기 제조업체가 개발했습니다. 그것은 상인이 아무런 어려움없이 거래 시스템을 프로그래밍 할 수있게하여 주야간 온라인 모드로 거래됩니다. 이 언어에 익숙한 프로그래머는 업무 수행에 어려움이 없습니다. 일반 사용자의 경우이 작업이 더 어려워집니다.


Forex Expert Advisors 지표.


고문이보다 효과적인 업무를 수행 할 수 있도록 기술 지표를 만들 수 있습니다. MetaTrader4 터미널의 기존 표시기에 큰 도움이됩니다. 권고 자 지표를 사용하는 목적은 분석 함수를 구현하고 거래 신호를 생성하는 것입니다.


붙박이 Forex 전문가 자문관.


MetaTrader4 거래 터미널에는 여러 가지 내장 된 전문 고문이 있습니다. 그들은 독립적 인 거래 시스템의 기능을 가지고 있으며 거래 신호를 더빙합니다. 초보자들 사이에서 매우 인기가 있으며 특별히 MetaTrader 4 Client Terminal을 프로그래밍 할 수있는 능력을 보여주기 위해 만들어졌습니다.


자신의 고문 작성 가능성은 단순히 눈부신 것입니다. 가격과 시간별로 다양한 주문을 할 수 있고, 카운터 주문을 자동으로 열 수 있습니다. 이 프로그램은 직장에서 상인을 대신 할 수 있습니다.


Forex Expert Advisors 테스트.


거래 단말기는 어드바이저를 작성할 수있을뿐만 아니라 사용하기 전에 히스토리 데이터를 점검 할 수 있습니다. 이는 어드바이저 사용의 또 다른 고유 한 기능입니다. 테스트는 매우 유용합니다. 과거의 데이터에 대한 기계 거래 시스템의 능 력과 효과를 측정하고 미래의 수익 및 오류 가능성을 예측하는 데 도움이되기 때문에 테스트가 매우 유용합니다. 고문을 테스트하고 다른 시장 조건에서 어떻게 작동하는지 알고 있다면 개입 할 필요없이 거래를 시작할 수 있습니다. 이 목적을 위해, 단말기에는 권고 자의 입력 매개 변수를 최적화 할 수있는 특수 창이 있습니다.


초보자를위한 별개의 단어.


초보자는 고문과의 거래가 매우 복잡하다고 생각할 수 있습니다. 그렇지 않습니다. 약 1 개월 후에 어떤 상인이라도 자신의 자동 거래 시스템을 프로그래밍 할 수 있습니다. 컴퓨터 프로그램에 대한 돈을 신뢰하는 것에 주저하더라도 5 가지 경보로 조언자를 구성 할 수 있으므로 작업을 크게 쉽게 할 수 있으므로 신호가 예상대로 열리고 닫히기를 기다리는 그래픽 분석에 더 적은 시간을 할애 할 수 있습니다.


인터넷을 통해 많은 조언자를 찾을 수 있지만 유익한 조언자를 찾는 것은 매우 어려우며 모든 사람 하나를 사용하는 것은 힘들어지고 보증금이 소진 될 수 있습니다. That is why you are advised against buying the first advisor you come across. 많은 상담가가 한 통화 쌍에서 테스트했을 때 탁월한 결과를 보여 주지만 다른 사람은 잘 수행하지 못합니다. 테스트 한 장비에 대해서는 권고자를 사용하는 것이 좋습니다.


Trade CFDs on Bitcoin and Ethereum!


"MQL5 신호들"에 대해 지불한다. 서비스 구독.


VIP 프로그램에 가입하면 탁월한 특전을 누릴 수 있습니다.


프로그래밍 기술이 없어도 5 분.


100 USD에서 실제 주식 시장으로의 액세스.


귀하의 계정에 매달 리베이트를주고 받으십시오!


거래량에 대한 추가 수익을 얻습니다.


RoboForex Ltd는 IFSC, 라이센스 번호 IFSC / 60 / 271 / TS / 17에 의해 규제되는 RoboForex 그룹의 회원사 인 국제 중개인입니다.


우리는 EU, 캐나다, 미국 및 일본의 거주자에게 금융 서비스를 제공하지 않습니다.


Dakar 2017의 "Starikovich-Heskes"팀 공식 후원사.


유럽, 아프리카 및 호주에서 6 만 km가 넘는 도로 킬로미터를 경험 한 레이서를 경험했습니다.


Muay 타이어 전투기의 공식 후원자 Andrei Kulebin.


많은 시간을 타이 권투 세계 챔피언, 경험있는 트레이너, 그리고 명예 마스터 스포츠.


판권 소유.


도움이 필요 하신가요? 질문을하고 지금 당장 답을 얻으십시오!

No comments:

Post a Comment