MQL5 Cookbook: 다양한 프린트 모드 사용
소개
MQL5 Cookbook 시리즈의 첫 번째 글입니다. 프로그래밍을 처음 시작하는 사람들이 새로운 언어에 점차 익숙해질 수 있도록 간단한 예제부터 시작하겠습니다. 나는 그것이 내 인생의 첫 번째 프로그래밍 언어라는 사실을 감안할 때 꽤 어려웠다고 말할 수 있는 거래 시스템을 설계하고 프로그래밍하는 첫 번째 노력을 기억합니다. 그때까지 저는 내가 이것을 위해 만들어지지 않았고 거의 이해할 수 없을 것이라고 생각했습니다.
그러나 생각보다 쉬웠고 상당히 복잡한 프로그램을 개발하는 데 몇 달 밖에 걸리지 않았습니다. "MetaTrader 5 및 MQL5의 무한한 기회"라는 글에서 이에 대해 자세히 알아볼 수 있습니다.
여기서는 Expert Advisors의 초보 개발자를 프로그래밍 프로세스를 통해 간단한 것부터 복잡한 것까지 안내하려고 합니다. MetaEditor 5 메뉴의 도움말에서 사용할 수 있는 정보를 여기에 복사하지 않을 것이므로 F1 키를 자주 눌러야 합니다. 동시에 이 글 시리즈는 원래 및 사용자 정의된 방식으로 개발에 사용할 수 있는 많은 예제, 기성품 기능 및 체계를 제공합니다.
시작하겠습니다. 이 글에서는 다양한 모드에서 기호 속성 중 일부를 프린트하는 간단한 스크립트를 만들 것입니다. 프로그램을 개발할 때, 특히 학습 과정 초기에 프로그램이 예상대로 응답하지 않는 상황이 종종 있습니다. 이 경우 계산과 관련된 특정 변수의 값을 확인해야 합니다. 우리의 경우 Print(), Comment() 및 Alert() 함수를 사용할 세 가지 방법을 자세히 살펴보겠습니다. 그리고 나중에 어떤 방법이 더 편리한지 스스로 결정할 수 있습니다.
MQL5 마법사
MQL5에 대한 나의 연구는 스크립트로 시작되었습니다. 그것은 꽤 쉽고 빠릅니다. 스크립트가 로드되면 생성한 함수가 실행되고 차트에서 삭제됩니다. 이를 통해 이동 중에 실험하고 어떤 방향으로 이동할지 확인할 수 있습니다.
MetaTrader 5 거래 터미널을 아직 설치하지 않았다면 지금 설치할 수 있습니다. 설치 후 터미널을 시작하고 F4 키를 눌러 MetaEditor 5를 엽니다. 이 버튼은 MetaTrader 5 거래 터미널과 MetaEditor 5 사이를 빠르게 전환하는 데 사용할 수 있습니다. 터미널 도구 모음에서 해당 버튼을 클릭하여 MetaEditor 5를 시작할 수도 있습니다. 특정 문제가 있는 경우에만 간략하게만 다룰 수 있으므로 거래 터미널 및 MetaEditor 5에서 도움말(F1)을 사용하여 프로그램 인터페이스를 잘 연구하세요.
MetaEditor 5를 시작하고 MetaEditor 패널의 메인 메뉴 아래에 있는 Ctrl+N 또는 새로 만들기 버튼을 누르십시오. 만들려는 프로그램 유형을 선택할 수 있는 MQL5 마법사 창이 열립니다. 이 경우 스크립트를 선택하고 다음을 누릅니다.
그림 1. MQL5 마법사 - 스크립트
그런 다음 스크립트 이름(파일 이름)을 입력해야 합니다. 기본적으로 스크립트는 Metatrader 5\MQL5\Scripts\file_name.mq5 아래에 생성됩니다. 해당 디렉토리에서 다른 폴더를 만들어 목적별로 파일을 그룹화할 수도 있습니다.
그림 2. MQL5 마법사 - 파일 이름
이 시점에서 필요한 경우 입력 매개변수를 추가할 수도 있습니다. 모든 것이 설정되고 준비되면 마침을 클릭하세요. 템플릿을 사용하여 새 문서가 생성되고 스크립트를 계속 진행할 수 있습니다.
//+------------------------------------------------------------------+ //| PrintModes.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- } //+------------------------------------------------------------------+
코드 작성
이중 슬래시 뒤에 오는 모든 것은 주석이며 프로그램 실행에 영향을 미치지 않습니다. 특히 긴 휴식 후에 프로그램 논리를 훨씬 더 쉽게 이해할 수 있도록 코드에 자세한 설명을 제공하는 것이 좋습니다.
위 코드의 처음 세 줄에서 #property 뒤에 오는 모든 것은 프로그램 속성과 관련이 있습니다. 각 기능 및 속성에 대한 자세한 내용은 MQL5 참조에서 확인할 수 있습니다. 주어진 기능에 대한 설명을 빠르게 보려면 해당 기능을 두 번 클릭하여 선택하고 F1 키를 누르기만 하면 됩니다. 선택한 기능에 대한 설명을 제공하는 도움말 창이 열립니다.
그 다음에는 다른 모든 함수와 계산을 포함하는 기본 스크립트 함수인 OnStart()가 옵니다.
프로그램을 실행하기 전에 필요한 정보를 프린트하는 방법을 선택할 수 있는 가능성을 허용해야 합니다. 이는 드롭다운 목록에서 필요한 모드를 선택할 수 있는 외부 매개변수가 있어야 함을 의미합니다. 또한 프로그램 실행 전에 스크립트의 외부 매개변수가 있는 창을 여는 역할을 하는 다른 속성(#property)을 지정해야 합니다. 이 속성은 script_show_inputs입니다. 코드에 이미 있는 다른 모든 속성 아래에 추가합니다.
#property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property script_show_inputs //---
외부 매개변수에 드롭다운 목록을 사용하려면 모든 모드의 열거를 생성해야 합니다. 프로그램 속성 뒤에 다음 코드를 삽입해 보겠습니다.
// ENUMERATION enum ENUM_PRINT_MODE { PRINT = 0, COMMENT = 1, ALERT = 2 }; //---
다음은 이 스크립트의 유일한 외부 매개변수인 PrintMode입니다.
// INPUT PARAMETERS input ENUM_PRINT_MODE printMode=PRINT; // Print mode
입력 매개변수는 일반적으로 프로그램 시작 부분에 위치하며 외부 매개변수를 정의하는 input modifier는 변수 유형 앞에 배치됩니다. 지금 스크립트를 실행하면 프로그램 창이 열리고 프린트 모드 매개변수의 드롭다운 목록에서 프린트 모드를 선택할 수 있습니다.
그림 3. 스크립트 매개변수 창
그런 다음 변수를 만들고 외부 매개변수에서 사용자가 지정한 모드를 사용하여 추가로 프린트하기 위해 일부 값(이 경우 일부 기호 데이터를 프린트함)을 할당합니다. 이를 위해 기본 OnStart() 함수에서 호출되는 별도의 사용자 함수인 PrintSymbolProperties()를 정렬해야 합니다.
함수를 생성하려면 아래와 같이 코드를 삽입하기만 하면 됩니다.
//+------------------------------------------------------------------+ //| PRINTING SYMBOL PROPERTIES | //+------------------------------------------------------------------+ void PrintSymbolProperties() { }
반환할 값의 유형은 함수 이름 앞에 지정해야 합니다. 또는 우리의 경우와 같이 함수가 아무 것도 반환하지 않으면 void를 넣어야 합니다. 또한 중괄호 사이의 PrintSymbolProperties() 함수 본문에서 나머지 코드를 작성해야 합니다. 먼저 변수를 생성해 보겠습니다.
string symb_symbol = ""; // Symbol int symb_digits = 0; // Number of decimal places int symb_spread = 0; // Difference between the ask price and bid price (spread) int symb_stoplevel = 0; // Stop levels double symb_ask = 0.0; // Ask price double symb_bid = 0.0; // Bid price
변수 유형은 할당될 데이터 유형에 따라 다릅니다. 이제 이 변수에 값을 할당해 보겠습니다. 기호 속성을 얻기 위해 MQL5는 모든 데이터 유형에 대한 특수 기능을 제공합니다.
symb_symbol =Symbol(); symb_digits =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); //---
자료를 적절하게 학습하려면 MQL5 참조를 사용하여 전달하는 모든 기능과 매개변수를 연구하세요. 여기에 있는 모든 기호 속성은 자주 참조해야 하는 테이블에 표시됩니다.
이제 변수에 값이 할당되었으므로 모든 프린트 모드에 대해 적절한 코드를 작성하기만 하면 됩니다. 다음과 같습니다.
//--- // If it says to print to the journal if(printMode==PRINT) { Print("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); } //--- // If it says to print to the chart if(printMode==COMMENT) { int mb_res=-1; // Variable with the option selected in the dialog box //--- Comment("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); //--- // Open a dialog box mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION); //--- // If "Yes" is clicked, remove the comments from the chart if(mb_res==IDYES) { Comment(""); } //--- return; } //--- // If it says to print to the alert window if(printMode==ALERT) { Alert("Symbol: "+symb_symbol+"\n", "Digits: "+IntegerToString(symb_digits)+"\n", "Spread: "+IntegerToString(symb_spread)+"\n", "Stops Level: "+IntegerToString(symb_stoplevel)+"\n", "Ask: "+DoubleToString(symb_ask,_Digits)+"\n", "Bid: "+DoubleToString(symb_bid,_Digits) ); } //---
Expert Advisor의 외부 매개변수로 PRINT를 선택하면 Expert Advisors 저널(Toolbox - Experts 탭)에 정보가 프린트됩니다.
그림 4. 도구 상자 - Expert 탭
댓글을 선택하면 차트의 왼쪽 상단에 정보가 표시됩니다. 정보가 차트에 나타난 후 MessageBox() 함수는 차트에서 주석을 삭제할지 묻는 대화 상자를 엽니다.
그림 5. 차트의 왼쪽 상단 모서리에 있는 주석
ALERT를 선택하면 스크립트를 실행한 후 요청된 정보 또는 간단한 사용자 메시지가 포함된 경고 창이 나타납니다. 이 경우 PRINT 옵션의 경우와 같이 저널에도 정보가 프린트되지만 추가로 음성 알림이 함께 제공됩니다.
그림 6. 경고 창
다음은 전체 스크립트 코드입니다.
//+------------------------------------------------------------------+ //| PrintModes.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://tol64.blogspot.com" #property description "email: hello.tol64@gmail.com" #property version "1.00" #property script_show_inputs //--- //--- ENUMERATION enum ENUM_PRINT_MODE { PRINT = 0, COMMENT = 1, ALERT = 2 }; //--- // INPUT PARAMETERS input ENUM_PRINT_MODE printMode=PRINT; // Print mode //--- //+------------------------------------------------------------------+ //| MAIN FUNCTION | //+------------------------------------------------------------------+ void OnStart() { PrintSymbolProperties(); } //+------------------------------------------------------------------+ //| PRINTING SYMBOL PROPERTIES | //+------------------------------------------------------------------+ void PrintSymbolProperties() { string symb_symbol = ""; // Symbol int symb_digits = 0; // Number of decimal places int symb_spread = 0; // Difference between the ask price and bid price (spread) int symb_stoplevel = 0; // Stop levels double symb_ask = 0.0; // Ask price double symb_bid = 0.0; // Bid price //--- symb_symbol =Symbol(); symb_digits =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); //--- // If it says to print to the journal if(printMode==PRINT) { Print("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); } //--- // If it says to print to the chart if(printMode==COMMENT) { int mb_res=-1; // Variable with the option selected in the dialog box //--- Comment("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); //--- // Open a dialog box mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION); //--- // If "Yes" is clicked, remove the comments from the chart if(mb_res==IDYES) { Comment(""); } //--- return; } //--- // If it says to print to the alert window if(printMode==ALERT) { Alert("Symbol: "+symb_symbol+"\n", "Digits: "+IntegerToString(symb_digits)+"\n", "Spread: "+IntegerToString(symb_spread)+"\n", "Stops Level: "+IntegerToString(symb_stoplevel)+"\n", "Ask: "+DoubleToString(symb_ask,_Digits)+"\n", "Bid: "+DoubleToString(symb_bid,_Digits) ); } } //+------------------------------------------------------------------+
결론
이 글은 여기서 마치겠습니다. 위에서 설명한 방법 외에도 파일에 데이터를 쓸 수도 있습니다. 일반 텍스트 파일일 수도 있고 CSS를 사용하여 멋지게 형식화된 HTML 보고서일 수도 있습니다. 그러나 이러한 방법은 초보자에게는 훨씬 더 복잡하며 위에 제공된 방법으로 시작하기에 충분합니다.
MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/638