English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
알고리즘에 기반한 트레이딩 시스템을 설계하는 이유와 방법

알고리즘에 기반한 트레이딩 시스템을 설계하는 이유와 방법

MetaTrader 5트레이딩 | 4 5월 2022, 16:40
272 11
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

프로그래밍이나 코딩의 중요성이 세상의 모든 분야에서 나날이 증가하고 있다는 사실은 의심할 여지가 없습니다. 따라서 이것들이 어떻게 우리의 삶을 편하게 만들고 쉽게 만들 수 있는지를 우리는 잘 알고 있을 뿐만 아니라 우리가 원하는 것과 이전에 결정한 것에 따른 정확한 결과를 보장할 수 있습니다.

이 거대하고도 깊은 역사를 가진 트레이딩의 세계와 관련해서는 우리가 정확하고 좋은 프로그램을 개발하게 될 경우 생성된 프로그램은 그러한 용이함과 자동화를 가져오게 되고 코딩이 우리의 트레이딩을 쉽고 체계적으로 만들게 되고 우리는 이러한 것들을 프로그램에서 기대하고 얻게 됩니다. 따라서 코딩의 세계는 우리에게 많은 이점을 제공할 수 있지만 제 생각에는 트레이딩을 위한 코딩의 주요 이점은 트레이더가 훈련을 받게끔 한다는 것입니다. 우리는 트레이더로서 언제나 트레이딩의 결정과 관련한 훈련을 받아야 한다는 것을 알고 있습니다. 훈련은 우리의 거래 및 투자 결과에 영향을 미치는 위대하고도 중요한 특성이므로 거래에서 훈련을 받는 것은 선택 사항이 아닙니다. 저는 항상 말하고 싶습니다. 훈련은 트레이딩은 물론 인생의 성공의 열쇠입니다. 훈련이 무엇인지 간단히 정의하면 주변 환경이 어떻든 간에 해야 할 일을 해야 할 시간에 하는 것을 의미합니다. 따라서 이를 달성하는 데 도움이 되는 도구를 찾을 때에는 주의를 기울여야 하고 그 도구에 대해 배워야 합니다. 이를 위한 올바른 도구는 코딩입니다.

우리 모두가 알다시피 거래를 하는 동안 우리의 훈련을 방해하는 가장 일반적인 것은 감정이며 감정은 부정적인 방식으로 거래의 결정에 영향을 미치므로 이러한 감정을 우리는 피해야 합니다. 인간의 간섭 없이 미리 결정된 매개변수로 작동하는 시스템이 있다고 상상해 보시기 바랍니다. 이 경우 우리는 트레이딩의 결정에 있어 감정의 부정적인 영향을 피할 수 있습니다. 좋은 소식은 우리에게는 그렇게 하는 데 도움이 되는 도구가 있다는 것입니다. MetaTrader 플랫폼용 MQL(MetaQuotes Language)에 대해 알려드리겠습니다. 이 훌륭한 프로그래밍 언어 혹은 도구는 특정한 실행 또는 특정한 거래 결정을 보장하는 특정한 매개변수를 사용하여 트레이딩 시스템을 설계하도록 돕습니다.

이 개념에 대해 더 알고 싶으시다면 이 예제를 참조해 보시기 바랍니다. 두 명의 투자자(A&B)가 있고 그들의 거래 전략이 같다면 상승 추세에서는 매수 및 보유를 하고 추세 반전 시에는 매도하겠지만 실제는 각자 다르게 행동합니다. 투자자 A는 훈련을 받은 사람이지만 투자자 B는 그렇지 않습니다. 아래 그림을 보세요:


2- Investor_B


이전 수치에 따르면 좋은 결과를 얻으려면 훈련이 필수적이지만 훈련이 없으면 좋지 않은 결과가 나오는 것은 당연합니다.

저는 이 기사를 통해 간단한 거래 시스템인 일명 단순 이동평균 교차를 공유하여 MQL5 코딩의 기본 사항 중 일부를 예제와 함께 공유하고 이러한 기본 사항을 연습하고 깊이 이해할 수 있도록 하여 여러분만의 트레이딩 시스템을 설계하는 방법을 알려 드릴 것입니다. 이글의 목표는 이 멋진 도구를 사용하여 수행할 수 있는 작업에 대한 개요를 알려 드리는 것입니다.

이 기사의 주요 목적은 초보자가 MQL5에서 알고리즘 거래 시스템을 설계하는 방법을 배우도록 안내하는 것입니다. MQL5의 기본에 대해 알아보고 자신만의 트레이딩 시스템을 단계별로 코딩하기 위한 설명을 할 것입니다. 스크립트로 코딩을 한 다음 코드를 실행한 후 결과를 표시할 것입니다. 이해를 더 빠르게 하고 싶다면 이글에서 다루는 내용을 직접 적용하고 코딩하는 것이 좋습니다. 이렇게 하면 언급된 코드의 개념을 깊이 이해하는 데 도움이 됩니다. 그리고 이 기사에서 생성된 모든 코드, 프로그램 및 거래 전략은 교육 목적으로만 설계된 것입니다. 다른 용도로 만들어진 것이 아닙니다. 물론 저는 여기서 MQL5를 사용하여 코드를 작성할 것입니다.


알고리즘 거래를 설계하기 위해 우리에게 필요한 것

이 파트에서는 우리가 도구로 갖고 싶은 것과 이러한 도구에 대해 알고 싶은 것에 대해 언급하겠습니다:

  • MetaTrader 5 플래폼, 다른 말로 하면 MetaTrader 5 터미널입니다. 터미널을 통해 주문을 실행하고 코드를 테스트합니다. MetaTrader는 가장 인기 있는 트레이딩 플랫폼입니다.



3- MT5 플래폼

데모 계정 여러분의 데모 계정을 브로커사에 개설하여 가상의 자금을 가지고 위험 없이 동일한 시장 환경에서 거래 전략을 테스트할 수 있습니다. 실제 계정이 아닌 이 데모 계정을 사용하십시오. 데모 계정에서 거래를 수행할 프로그램을 만들고 실행할 것입니다.

MetaQuotes Language Editor에서 코드나 프로그램을 작성할 것입니다. 다음 스크린샷은 에디터가 MetaTrader와 함께 설치된 후 에디터를 여는 방법을 보여줍니다. 에디터는 세가지 방법으로 열 수 있습니다.

  • 메뉴의 도구를 클릭하고 MetaQuotes Language Editor: 를 엽니다

4- 메타 에디터 열기  

                   

혹은 메타쿼츠 에디터 아이콘을 클릭합니다:

   5- 메타 에디터 열기

또는 터미널이 실행된 상태에서 키보드의 F4 버튼을 누릅니다.

다음 스크린샷은 에디터가 어떻게 생겼는지 보여주며 여기서 프로그램을 작성하고 거래 시스템을 설계하는 대부분의 작업이 이루어집니다.

   6- 메타 에디터 창

 

이제 이 에디터를 사용하여 첫 번째 코드를 작성해야 합니다. 다음 단계를 따라서 사용 방법을 알아 봅니다.

새로 만들기를 클릭하면 여러개의 선택 가능한 프로그램 유형이 표시됩니다.

7- 메타 에디터 창



8- 메타 에디터 - 새로 만들기



여기에서 알려드리고자 하는 것은 Expert Advisor, Custom Indicator 및 Script입니다.

  • Expert Advisor: EA는 설정한 매개변수에 따라 분석하는 프로세스나 거래 프로세스의 자동화를 위해 개발되고 사용되는 프로그램입니다.
  • 상용 인디케이터: 코드화된 프로그램입니다. 미리 계산된 가격 종속적인 결과를 그래픽으로 표시하기 위한 것입니다.
  • 스크립트: 어떠한 작업을 한 번만 수행하도록 고안된 프로그램으로 분석이나 거래 기능 모두를 수행할 수 있으며 Expert Advisors와 달리 틱이 아닌 요청에 따라 실행됩니다.

The Hello World! 프로그램

여기서는 MQL5에서 우리의 첫 번째 프로그램과 첫 번째 코드를 작성하는 방법을 배웁니다. 프로그래밍 또는 코딩의 모든 초보자는 "Hello World" 코드를 코딩하는 것으로 여정을 시작합니다. 따라서 터미널 화면에 "Hello World"가 표시되도록 하는 프로그램을 작성하는 것으로부터 시작하겠습니다. 자 시작해 봅시다…

위와 같이 MetaEditor를 열고 새로 만들기를 클릭하고 옵션에서 스크립트를 선택하고 다음을 클릭합니다.


9- MetaEditor - 새 파일 - 스크립트


다음을 클릭하면 다음과 같은 창이 나타납니다. 원하는 데이터를 채우십시오:

  • 이름은 스크립트의 이름입니다
  • 저작자는 스크립트 작성자입니다
  • 링크는 여러분의 링크입니다
  • 파라미터는 스크립트와 관련하여 설정해야 하는 매개변수이지만 이 스크립트에 대한 매개변수는 설정하지 않으므로 건너뜁니다.
그리고 나서 마침을 클릭합니다.

10- 메타에디터 - 스크립트 정보


마침을 클릭하면 다음과 같은 창이 열립니다. 그리고 이 창에서 우리의 프로그램이 코딩될 것입니다. 앞서 언급했듯이 여기에서 터미널에 "Hello World!"를 표시하는 프로그램을 만들어야 합니다. 그러므로 우리는 두 개의 중괄호 사이에 코드를 짜기 시작할 것입니다.


 11 - 코드 장소

여기서 우리는 다음을 사용할 것입니다:

  • Alert: Alert는 나타내고자 하는 내용을 표시하거나 프로그램에서 미리 결정된 메시지를 표시합니다. 예를 들어 "Hello World!" 처럼 말입니다.
  • (" "): 내가 원하는 것 또는 미리 정해진 메시지 "Hello World!" 사이에 쓰기 또는 다른 무엇이든지 말입니다.
  • ; - 문장을 분리합니다.

우리의 코드는 다음과 같을 것입니다:

//+----------------------------------------------------------+
//|                                         Hello World!.mq5 |
//|                          Copyright 2022, MetaQuotes Ltd. |
//|                                     https://www.mql5.com |
//+----------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+----------------------------------------------------------+
//| Script program start function                            |
//+----------------------------------------------------------+
void OnStart()
  {
   Alert("Hello World!");
  }
//+----------------------------------------------------------+

코드를 작성한 후 컴파일을 클릭하고 오류 및 경고가 없는지 확인하십시오. 프로그램이 다음의 그림과 같이 실행되도록 하려면 코드를 컴파일한 후 오류 탭에 오류가 없어야 합니다. 그런 다음 F4 키를 눌러 터미널로 이동하여 코드를 테스트합니다.

12- Hello World 코드

그런 다음 터미널의 탐색기 창의 스크립트에서 앞에서 정한 이름을 가진 프로그램을 찾을 수 있습니다. (Hello World!), 차트에 끌어다 놓거나 더블 클릭하세요. 그러면 코드 작성시 정한 내용과 함께 Alert 메시지가 나타납니다. 다음의 스크린샷과 같이 말입니다.

13- Hello World alert



트레이딩 전략 아이디어(2개의 단순 이동 평균 교차)

여기에서는 교육용의 거래 전략 아이디어를 제시합니다. 이는 MQL5의 기본과 MQL5에서 프로그래밍하는 방법을 학습할 수 있도록 돕기 위한 것입니다.

경고
모든 정보는 정보 제공의 목적으로만 '있는 그대로' 제공되며 거래 목적이나 조언을 위한 것이 아닙니다. 과거의 성과가 미래의 결과를 보장하지 않습니다. 거래 계정에서 여기의 자료를 사용하기로 선택하는 경우 귀하는 이에 대한 위험을 감수해야 합니다.

여기에서 전략 아이디어는 두 개의 단순 이동 평균 지표에서 확인하는 신호를 통해 추세를 확인하여 사용하는 방식으로 거래합니다.

  • 단순 이동 평균은 특정 기간 동안의 평균 종가를 계산하는 후행 기술 지표로 가격의 움직임이 주는 신호의 뒤에 신호가 오기 때문에 후행입니다.
  • 전략은 다음과 같습니다:
    • 더 짧은 단순 이동 평균(주기가 20)이 더 긴 단순 이동 평균(주기가 50) 위에 교차되면 신호는 매수입니다.
    • 더 짧은 단순 이동 평균(기간은 20)이 더 긴 단순 이동 평균(기간은 50) 아래로 교차되면 신호는 매도입니다.

이제 우리는 그렇게 하기 위한 프로그램을 설계해야 합니다.

15- 거래 아이디어1


14- 거래 아이디어


알고리즘 거래 시스템 청사진

여기에서 저는 시스템을 쉽고 원활하게 코딩하려는 경우 수행해야 하는 매우 중요한 단계에 대해 설명합니다. 이 단계는 시스템이 정확히 수행되도록 일련의 단계와 방식대로 원하는 전략 및 거래 아이디어와 관련한 청사진을 만드는 것이며 예를 들어 명확한 청사진을 제공하는 다이어그램을 통해서도 할 수 있습니다. 그리고 여기에 우리가 코딩해야 하는 것과 이 시스템에서 얻을 것으로 기대하는 것을 명확하게 볼 수 있는 우리의 (두개의 단순 이동 평균의 교차) 시스템의 청사진의 예가 있습니다.

    16- Simple 2MA-Blueprint-–-MQL5


      이제 먼저 MQL5의 몇 가지 기본 사항에 대해 이해한 다음 설계에 필요한 것들을 사용하겠습니다.


      변수와 유형 및 사용 방법

      이 부분에서는 다음을 식별하고 이해할 것입니다.

      • 변수란 무엇인가?
      • 변수의 유형.
      • 어떻게 사용할 수 있나?

      일반적으로 프로그램에서 데이터 값은 일정하거나 가변적일 수 있습니다. 값이 가변적이면 프로그램과 사용자에 의해 변경될 수 있습니다. 변수는 메모리 위치입니다. 변수는 해당 위치와 연결된 이름이 있습니다. 따라서 메모리 위치는 데이터를 저장하는 데 사용됩니다. MQL5의 프로그램에는 수십 개 혹은 수백 개의 변수가 포함될 수 있습니다. 각 변수의 매우 중요한 속성은 프로그램에서 해당 값을 사용할 수 있다는 것입니다. 이와 같은 가능성의 한계는 변수의 값을 사용할 수 있는 프로그램의 위치인 변수 범위와 연결됩니다. 모든 변수에는 범위가 있습니다.

      그러므로 범위에 따라 MQL5에는 로컬 및 글로벌의 두 가지 유형의 변수가 있습니다. 지역 변수는 함수 내에서 선언된 변수입니다. 지역 변수의 범위는 변수가 선언된 함수의 본문입니다. 지역 변수는 해당 유형에 해당하는 상수 또는 표현식으로 초기화될 수 있습니다. 전역 변수는 모든 함수를 넘어서 선언됩니다. 전역 변수의 범위는 전체 프로그램입니다. 전역 변수는 해당 유형(표현식이 아님)에 해당하는 상수로만 초기화될 수 있습니다. 전역 변수는 특수 함수의 실행을 명시하기 전에 한 번만 초기화됩니다.

      변수의 범위에 관계없이 이제 다음 유형의 변수를 살펴보겠습니다.

      • int는 숫자의 유형입니다; 길이가 다른 숫자 값을 저장하기 위한 다양한 유형의 정수가 있습니다.
      • double. 거래에 사용되는 숫자를 처리하는 프로그램을 사용하려면 부동 소수점 숫자를 관리할 수 있는 데이터 유형이 필요합니다. 따라서 MetaTrader는 이러한 데이터를 처리하기 위해 float 및 double과 같은 데이터 유형을 제공합니다. 이들 간의 차이점은 메모리에 할당된 바이트(float의 경우 4개, double의 경우 8개)로, 결과적으로 다음과 같은 최소값과 최대값이 생성됩니다.
        • float - 최소 1.175494351e-38, 최대 3.402823466e+38
        • double - 최소 2.2250738585072014e-308, 최대 1.7976931348623158e+308
          이러한 유형의 데이터를 선언하려면 float 및 double 키워드를 사용하십시오.
      • string은 MQL5 코딩에서도 널리 사용되는 매우 중요한 데이터 유형입니다. string을 사용하면 알파벳 문자의 나열을 저장하고 조작할 수 있습니다.
      • bool - Boolean은 다음 중 하나의 값을 가질 수 있는 논리적 유형입니다. 또는 거짓.

      변수를 사용하는 예를 들어 보겠습니다.

      //+------------------------------------------------------------------+
      //|                                                    Variables.mq5 |
      //|                                  Copyright 2022, MetaQuotes Ltd. |
      //|                                             https://www.mql5.com |
      //+------------------------------------------------------------------+
      #property copyright "Copyright 2022, MetaQuotes Ltd."
      #property link      "https://www.mql5.com"
      #property version   "1.00"
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
          int myInteger = 5;
          double myDouble = 10.56;
          string myString = "My name is Mohamed";
          bool myBoolean = true;
          
          Alert(myInteger);
          Alert(myDouble);
          Alert(myString);
          Alert(myBoolean); 
        }
      //+------------------------------------------------------------------+
      

      위에서 언급한 대로 작성하면 이전 코드를 컴파일한 후 오류나 경고를 찾을 수 없을 것이고 아래 스크린샷과 같은 알림 창이 표시되어야 합니다.

      18- 변수

      변수를 사용하는 또 다른 예입니다.

        여기서 우리는 변수와 그 값을 저장하거나 기억해야 합니다, A와 그 값 10, B = 10, C = 10 + 5, var1 = 2.5, var2 = 4, result = 2.5/4, message1 = Hello Mohamed 및 message2 = A의 값은 10입니다. 따라서 이 코드를 실행하면 알림 메시지에는 4개의 요소가 포함됩니다.
        • message1에 해당하는 값
        • C에 해당하는 값
        • 결과에 해당하는 값
        • message2의 해당 값
        //+------------------------------------------------------------------+
        //|                                                  Variables 2.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           int A = 10;
           int B = 5;
           int C;
         
           double var1 = 2.5;
           double var2 = 4;
           double result = var1 / var2;
           
           string greeting = "Hello";
           string space = " ";
           string name = "Mohamed";
           string message1;
           string message2;
           
           C = A + B;
           message1 = greeting + space + name;  
           message2 = "Value of A is: " + string(A);
           
           Alert(message1);
           Alert(C);
           Alert(result);
           Alert(message2);
          }
        //+------------------------------------------------------------------+
        


         19- 변수 2

        Boolean 연산

        Boolean: 단순히 논리 연산에 대해 참 또는 거짓을 반환합니다.

        • == 같음을 의미합니다
        • != 같지 않음을 의미합니다
        • < 보다 작음을 의미합니다.
        • <=는 작거나 같음을 의미합니다.
        • > 보다 크다를 의미합니다
        • >= 는 크거나 같음을 의미합니다.
        //+------------------------------------------------------------------+
        //|                                           Boolean Operations.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           bool result = 4 < 5;
           Alert (result);     //true
          }
        //+------------------------------------------------------------------+
        

        여기서 알림 메시지에서 4 < 5이므로 true를 반환해야 합니다.

         20- Boolean 연산

        While 루프

        while 연산자는 확인된 표현식과 반드시 충족되어야 하는 연산자로 구성됩니다. 표현식이 참이면 표현식이 거짓이 될 때까지 연산자가 실행됩니다. 다음 예에서 루프의 시작과 끝을 알기 위해 루프를 시작할 때 첫번째 알림 문구를 보이고 이후 프로그램이 카운터의 값을 확인하고 3보다 작으면 그 값을 표시한다는 것을 알수 있습니다. 그런 다음 이 경우 (= 또는 > 3)가 거짓이 될 때까지 이전 결과에 1을 추가한 다음 루프가 완료되면 마지막 알림을 표시합니다. 따라서 알림 메시지에서 이 코드의 다음과 같은 메시지를 볼 수 있습니다: 스크립트 시작, 1, 2, 루프가 완료되었습니다.
        //+------------------------------------------------------------------+
        //|                                                   While Loop.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           //While (Loop)
           Alert("Start of script");
           
           int counter = 1;
           
           while(counter < 3) //true?
            {
              Alert(counter);
              counter = counter + 1;
            }
            
            Alert("Loop has finished");
          }
        


         21- While 루프


        For 루프

        for 연산자는 세 가지 표현식과 실행 가능한 연산자로 구성됩니다.

                 for(expression1; expression2; expression3)
                 operator;

        Expression1은 루프 초기화를 나타냅니다. Expression2는 루프 종료 조건을 확인합니다. 참이면 루프 본문 for가 실행됩니다. 루프는 거짓이 될 때까지 expression2를 반복합니다. 거짓이면 루프를 종료하고 다음 연산자에게 제어권을 넘겨줍니다. Expression3은 각 반복 후에 계산됩니다.

        따라서 다음 for 루프 예제에 따라 코드를 실행하면 Hello(I =0, I = 2, ………,I = 4)라는 5개의 메시지가 생성되고 = 5가 될 것이라고 예상할 수 있습니다. 그리고 루프가 종료됩니다.

        //+------------------------------------------------------------------+
        //|                                                     For Loop.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           for(int i=0; i<5 ; i++)
           {
           Alert("Hello");
           }
          }
        //+------------------------------------------------------------------+
        


        22- For 루프

        IF, Else 문

        IF - ELSE 연산자는 선택을 해야 할 때 사용됩니다. 구문은 보통 다음과 같습니다.


        if (expression)
        operator1
        else
        operator2


        표현식이 참이면 operator1이 실행되고 operator2 뒤에 오는 연산자에게 제어권이 주어집니다(operator2는 실행되지 않음). 표현식이 거짓이면 operator2가 실행됩니다.

        예: 다음 예에 따르면 먼저 Bid 값으로 알림을 수신한 다음 Bid 값이 1.146600보다 큰지 확인하면 "가격이 1.146600 이상입니다 -> BUY"라는 알림이 표시됩니다. 그렇지 않은 경우 "가격이 1.146600 미만입니다 -> 매도"라는 알림이 표시됩니다. 그리고 다음은 코드와 그 실행 결과입니다.

        //+------------------------------------------------------------------+
        //|                                            If-else statement.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           double level = 1.146600;
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           Alert("Bid Price = " + string(Bid));
        
          if(Bid > level)
          {
          Alert ("The price is above " + string(level) + " -> BUY");
          }
        // What if the condition is false and we need to take an action also here we can use else function instead of writing another if code
           else
           {
           Alert ("The price is below " + string(level) + " -> SELL");
           } 
            
          }
        //+------------------------------------------------------------------+
        


         23- If-Else 문


        트레이더 입력

        여기에서는 코드를 작성하는 대신 프로그램에 대한 입력 또는 선호하는 매개변수를 결정하는 방법을 배웁니다.

        Properties(#property): 모든 MQL5 프로그램은 명시적으로 시작할 필요 없이 프로그램과 관련한 적절한 서비스에서 클라이언트 터미널을 돕는 #property라는 추가적인 특정 매개변수를 지정할 수 있습니다.

        script_show_inputs: 스크립트를 실행하기 전에 속성이 있는 창을 표시하고 이 확인 창을 비활성화합니다.

        입력 변수: 입력스토리지 클래스는 외부 변수를 정의합니다. 입력수정자는 데이터 유형 앞에 표시됩니다.

        //+------------------------------------------------------------------+
        //|                                                Trader Inputs.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        #property script_show_inputs
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        input int TakeProfit = 10;
        input int StopLoss = 10;
        
        void OnStart()
          {
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10)
           double StopLossLevel = Bid - StopLoss * 0.00001;
           
           Alert("Price now = " + string(Bid));
           Alert ("TakeProfitLevel = ", TakeProfitLevel);
           Alert ("StopLossLevel = ", StopLossLevel);
          }
        //+------------------------------------------------------------------+
        

        24- 트레이더 입력 1


        24- 트레이더 입력 2


         24- 트레이더 입력 3


        24- 트레이더 입력 4


        주문 전송

        이 부분에서는 주문을 전송하는 코드를 작성하는 방법을 알아보겠습니다.

        //+------------------------------------------------------------------+
        //|                                                         TEST.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        #property script_show_inputs
        #include <Trade\Trade.mqh>
        CTrade trade;
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        input int TakeProfit = 150;
        input int StopLoss = 100;
        
        void OnStart()
          {
           double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
           double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
           double TakeProfitLevel = (Ask+TakeProfit*0.00001);
           double StopLossLevel = (Ask-StopLoss*0.00001);
           
           
           if(Equity >= Balance)
           trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
           
           for (int i=PositionsTotal()-1; i>=0; i--)
           {
             ulong ticket = PositionGetTicket(i);
             ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
        
              
             Alert (" Order Ticket # ", ticket);
             Alert("TakeProfit = ", TakeProfitLevel);
             Alert("StopLoss = ", StopLossLevel);
           }
          }
        //+------------------------------------------------------------------+
          스크립트 실행 후 결과는 다음과 같습니다:

          25- 주문 전송


          오류 처리 테크닉

          프로그램이 실행되면 누구나 충돌을 발견할 수 있으며 문제가 생겼다는 것을 알 수 있습니다. 따라서 실행된 모든 주문이나 코드를 확인하고 문제가 발생하면 경고하기 위해 이 오류 처리 방안을 코드에 포함해야 합니다. 즉 부적절한 상황에서 트레이더 자신과 자신의 자금을 보호하는 보호 기술입니다. 

          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             
             
             if(Equity >= Balance)
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
                for (int i=PositionsTotal()-1; i>=0; i--)
                {
                   ulong ticket = PositionGetTicket(i);
                   ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
                  
                 if (ticket <= 0)
                  {
                   Alert("Error!");  //in Case of error and the order did not open, appears "Error!"
             
                  }
                else
                  {
                   Alert("Your ticket # is: " + string(ticket));
                   Alert("TakeProfit = ", TakeProfitLevel);
                   Alert("StopLoss = ", StopLossLevel);
                  }
                }
            }
          //+------------------------------------------------------------------+
          

          26- 오류 처리 테크닉 1


          27- 오류 처리 테크닉 2


          주문 청산

          이 부분에서 우리는 주문을 청산하는 방법을 배우기 위해 주문을 전송하고 청산하는 코드를 만들 것입니다.
          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             
             
             
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
             for (int i=PositionsTotal()-1; i>=0; i--)
             {
               ulong ticket = PositionGetTicket(i);
               ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
          
                
               Alert (" Order Ticket # ", ticket);
               Alert("TakeProfit = ", TakeProfitLevel);
               Alert("StopLoss = ", StopLossLevel);
               
               Sleep(2000);
               
               trade.PositionClose(ticket,-1);
               Alert("Order Closed...");
             }
          
            }
          //+------------------------------------------------------------------+


           28- 주문 청산

          OrderModify로 주문 수정하기

          이 부분에서는 주문을 수정하는 데 도움이 되는 코드를 만드는 방법을 배웁니다. 이전에 열렸거나 미체결 중인 주문의 특성을 수정합니다.

          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             double TakeProfitLevel2 = (TakeProfitLevel+0.00100);
             double StopLossLevel2 = (StopLossLevel-0.00050);   
             
             
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
             for (int i=PositionsTotal()-1; i>=0; i--)
             {
               ulong ticket = PositionGetTicket(i);
               ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
          
                
               Alert (" Order Ticket # ", ticket);
               Alert("TakeProfit = ", TakeProfitLevel);
               Alert("StopLoss = ", StopLossLevel);
               
               Sleep(5000);
               
               trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2);
               Alert("Order Modified...");
               Alert("Modified TakeProfit = ", TakeProfitLevel2);
               Alert("Modified StopLoss = ", StopLossLevel2);
             }
          
            }
          //+------------------------------------------------------------------+
          

          29- 주문 수정



          두개의 단순 이동 평균 교차 시스템

          여기에서 우리는 두 개의 단순 이동 평균 교차를 코딩하기 위해 모두 것을 작성할 것입니다. 위에서 언급한 청사진에 따른 필요한 모든 것을 할 것입니다.

          MetaEditor에서 새로 만들기를 클릭하여 새 프로젝트를 시작할 때 Expert Advisor를 선택합니다.

          다음은 모든 것을 기억하기 위해 필요한 거래 시스템의 자세한 청사진입니다.

          16- Simple 2MA-Blueprint-–-MQL5


          이제 해야 할 일은 이 전략을 코딩하는 것입니다.
          • 짧은 단순이동평균선(주기 20)이 더 긴 단순이동평균선의 위로 교차하는 경우(기간은 50)신호는 매수입니다.
          • 더 짧은 단순 이동 평균(주기 20)이 더 긴 단순 이동 평균(주기: 50)을 교차하여 그 아래로 내려가면 신호는 매도입니다.
          다음은 이 프로그램의 코드와 실행 방법입니다.
          //+------------------------------------------------------------------+
          //|                                                SMA crossover.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          //+------------------------------------------------------------------+
          //| Expert tick function                                             |
          //+------------------------------------------------------------------+
          
          void OnTick()
            {
             //create an array for several prices
             double myMovingAverageArray1[], myMovingAverageArray2[];
             
             //define the properties of  MAs - simple MA, 1st 20 / 2nd 50
             int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
             int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
             
             //sort the price arrays 1, 2 from current candle
             ArraySetAsSeries(myMovingAverageArray1,true);
             ArraySetAsSeries(myMovingAverageArray2,true);
             
             //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result
             CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
             CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
             
             //Check if we have a buy entry signal
             if (
                (myMovingAverageArray1[0]>myMovingAverageArray2[0])
             && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
                )
                   {
                   Comment("BUY");
                   }
              
             //check if we have a sell entry signal      
             if (
                (myMovingAverageArray1[0]<myMovingAverageArray2[0])
             && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
                )
                   {
                   Comment("SELL");
                   }          
            }
          //+------------------------------------------------------------------+
          


          프로그램을 실행한 후 이 전략에 따라 현재의 신호(매수 또는 매도)와 함께 차트에 설명을 표시합니다. 이는 다음의 그림에 나와 있습니다.


          30- 단순 이동 평균 - 코멘트


           31- 단순 이동 평균  - 매도 코멘트

          이제 다음 그림은 터미널에서 설계된 시스템을 찾는 방법과 실행 방법을 설명합니다.

          32- 단순 이동 평균 프로그램의 위치

          프로그램을 드래그 앤 드롭하거나 더블 클릭하면 다음과 같은 창이 나타납니다.

          33- 32- 단순 이동 평균 프로그램의 인터페이스

          'Algo 거래 허용' 옵션을 활성화한 다음 확인을 클릭합니다. 그러면 Expert Advisor가 차트에 첨부되고 성공적으로 로드되면 Journal 탭에 메시지가 나타납니다.


           34- 단순 평균 프로그램 활성화 1


          35- 단순 이동 평균 프로그램 활성화 2

          이렇게 우리는 자동화 프로그램인 두개의 단순 이동 평균 교차 프로그램을 만들고 실행했습니다. 이것이 우리가 우리의 거래를 위해 코딩할 수 있는 간단한 예입니다. 또한 이 멋진 도구, MQL5를 사용하여 다른 거래 전략을 코딩하고 자동화할 수 있습니다.

          다시 말하지만, 이 기사의 주요 목표는 이 전략을 사용하는 것이 아니라 MQL5의 기본 사항 중 일부를 배우고 우리가 무엇을 할 수 있는지 알아보고 거래를 더 쉽고 수익성 있게 만들기 위해 만들 수 있는 것들을 배울 수 있도록 하는 것입니다. 따라서 이 전략에는 많은 개선 사항이 필요하며 만약 그대로 사용하는 경우 책임은 여러분에게 있습니다.


          결론

          MQL5는 훌륭하고 수익성 있는 알고리즘 거래 시스템을 설계하여 거래를 더 쉽고 수익성 있게 만드는 데 도움이 되는 훌륭한 도구입니다. 따라서 이 훌륭한 도구를 배우고 사용하는 데 투자하는 것은 매우 가치 있는 투자가 될 것입니다.

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

          최근 코멘트 | 토론으로 가기 (11)
          Laudable222
          Laudable222 | 9 2월 2022 에서 10:40

          안녕하세요 @Mohamed Abdelmaaboud 입니다.

          MT4에 대해 동일한 작업을 수행하고 사용자 지정 지표 를 사용하여 EA를 생성하는 방법을 설명할 수 있습니까?

          Mohamed Abdelmaaboud
          Mohamed Abdelmaaboud | 14 2월 2022 에서 18:55
          Laudable222 사용자 지정 지표 를 사용하여 EA를 생성하는 방법을 설명할 수 있습니까?

          안녕하세요 로더블222님

          MQL4가 지원되지 않으므로 MQL5가 지원하지 않으므로 기사를 통해 게시할 수 없습니다.

          Toto Sarono
          Toto Sarono | 17 3월 2022 에서 02:17

          친애하는 모하메드.


          저는 거래 세계에 처음 입문한 사람이며 첫 번째 질문은 "언제 포지션을 열고 닫습니까?"입니다.

          위의 중요한 질문에 대한 답변으로 이어지는 명확한 기사에 감사드립니다.

          나머지는 트레이딩 변화와 시장 이슈를 느끼기 위해 많은 연습이 필요하다고 생각합니다.


          건배,

          토토 사로노

          Mohamed Abdelmaaboud
          Mohamed Abdelmaaboud | 18 3월 2022 에서 13:59
          Toto Sarono # :

          친애하는 모하메드.


          저는 거래 세계에 처음 입문한 사람이며 첫 번째 질문은 "언제 포지션을 열고 닫습니까?"입니다.

          위의 중요한 질문에 대한 답변으로 이어지는 명확한 기사에 감사드립니다.

          나머지는 트레이딩 변화와 시장 이슈를 느끼기 위해 많은 연습이 필요하다고 생각합니다.


          건배,

          토토 사로노

          친애하는 토토,

          환영합니다. 제 기사가 도움이 되었다니 기쁩니다.

          그리고 여기서 확인해야 할 것은 연습과 일관성이 거래 또는 다른 분야에서 성공하는 데 중요한 열쇠입니다.

          행운을 빕니다.

          Toto Sarono
          Toto Sarono | 20 3월 2022 에서 12:43
          Mohamed Abdelmaaboud # :

          친애하는 토토,

          환영합니다. 제 기사가 도움이 되었다니 기쁩니다.

          그리고 여기서 확인해야 할 것은 연습과 일관성이 거래 또는 다른 분야에서 성공하는 데 중요한 열쇠입니다.

          행운을 빕니다.

          확실히 맞아.....!

          간단한 EA를 구축하기 위한 귀하의 기사와 지침을 찾을 수 있어 정말 행운입니다. 덕분에 다른 트레이더 코드를 쉽게 복사하고 많은 시간을 절약할 수 있습니다.


          좋은 하루 되세요

          Expert Advisor 처음부터 개발하기 Expert Advisor 처음부터 개발하기
          이 기사에서는 최소한의 프로그래밍을 통해 트레이딩 로봇을 개발하는 방법에 대해 알아봅니다. 물론 MetaTrader 5는 트레이딩과 관련한 높은 수준의 제어를 제공합니다. 그러나 수동으로 주문하는 것은 경험이 적은 사용자에게는 상당히 어렵고 위험할 수 있습니다.
          MQL 언어를 사용하여 아무것도 없는 상태에서 심층 신경망(Deep Neural Network) 프로그래밍 하기 MQL 언어를 사용하여 아무것도 없는 상태에서 심층 신경망(Deep Neural Network) 프로그래밍 하기
          이 기사는 MQL4/5 언어를 사용하여 심층 신경망을 만드는 방법을 열려주는 것을 목표로 합니다.
          Fix PriceAction 손절매 혹은 Fixed RSI(스마트 스탑로스) Fix PriceAction 손절매 혹은 Fixed RSI(스마트 스탑로스)
          손절매는 거래에서 자금 관리와 관련된 중요한 도구입니다. 손절매와 이익실현과 랏 크기를 효과적으로 사용하면 트레이더는 더 일관되면서도 전반적으로도 더 많은 수익을 얻을 수 있습니다. 손절매는 훌륭한 도구이지만 사용할 때 직면하게 되는 문제들이 있습니다. 가장 중요한 것은 손절매 사냥입니다. 이 기사에서는 거래에서 손절매 사냥을 줄이는 방법과 전통적인 손절매 사용법을 비교하고 이를 통해 수익성을 결정하는 방법을 살펴봅니다.
          더 나은 프로그래머 (Part 07): 성공적인 프리랜서 개발자가 되기 위한 참고 사항 더 나은 프로그래머 (Part 07): 성공적인 프리랜서 개발자가 되기 위한 참고 사항
          MQL5에서 성공적인 프리랜스 개발자가 되고 싶습니까? 그렇다면 이 기사를 읽어 보시기 바랍니다.