//+------------------------------------------------------------------+ //| CustomSymbolSetInteger.mq5 | //| Copyright 2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define CUSTOM_SYMBOL_NAME Symbol()+".C" // 사용자 지정 심볼 명 #define CUSTOM_SYMBOL_PATH "Forex" // 심볼이 생성될 그룹의 이름 #define CUSTOM_SYMBOL_ORIGIN Symbol() // 사용자 정의 심볼의 기반이 되는 심볼 명 //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- 사용자 정의 심볼을 생성할 때 오류 코드를 가져옵니다. int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAME, CUSTOM_SYMBOL_PATH, CUSTOM_SYMBOL_ORIGIN); //--- 오류 코드가 0(심볼 생성 성공)도 아니고 5304(심볼이 이미 생성됨)도 아닌 경우 - 그대로 둠 if(create!=0 && create!=5304) return; //--- 사용자 정의 심볼의 기반이 되는 심볼의 속성을 저널에서 가져오고 출력합니다. //--- (거래 모드, 스탑 주문 설치 수준 및 트레이딩 운영 중지 거리) ENUM_SYMBOL_TRADE_EXECUTION origin_exe_mode = (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(CUSTOM_SYMBOL_ORIGIN, SYMBOL_TRADE_EXEMODE); int origin_stops_level = (int)SymbolInfoInteger(CUSTOM_SYMBOL_ORIGIN, SYMBOL_TRADE_STOPS_LEVEL); int origin_freeze_level= (int)SymbolInfoInteger(CUSTOM_SYMBOL_ORIGIN, SYMBOL_TRADE_FREEZE_LEVEL); PrintFormat("The '%s' symbol from which the custom '%s' was created:\n"+ " Deal execution mode: %s\n Stops Level: %d\n Freeze Level: %d", CUSTOM_SYMBOL_ORIGIN, CUSTOM_SYMBOL_NAME, StringSubstr(EnumToString(origin_exe_mode), 23), origin_stops_level, origin_freeze_level); //--- 사용자 정의 심볼 속성에 대한 다른 값을 설정합니다. ResetLastError(); bool res=true; res &=CustomSymbolSetInteger(CUSTOM_SYMBOL_NAME, SYMBOL_TRADE_EXEMODE, SYMBOL_TRADE_EXECUTION_MARKET); res &=CustomSymbolSetInteger(CUSTOM_SYMBOL_NAME, SYMBOL_TRADE_STOPS_LEVEL, 10); res &=CustomSymbolSetInteger(CUSTOM_SYMBOL_NAME, SYMBOL_TRADE_FREEZE_LEVEL, 3); //--- 속성을 설정할 때 오류가 발생하면 저널에 해당 메시지를 표시합니다. if(!res) Print("CustomSymbolSetInteger() failed. Error ", GetLastError()); //--- 수정된 사용자 정의 심볼 속성을 저널에서 가져오고 인쇄합니다. //--- (거래 모드, 스탑 주문 설치 수준 및 트레이딩 운영 중지 거리) ENUM_SYMBOL_TRADE_EXECUTION custom_exe_mode = (ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(CUSTOM_SYMBOL_NAME, SYMBOL_TRADE_EXEMODE); int custom_stops_level = (int)SymbolInfoInteger(CUSTOM_SYMBOL_NAME, SYMBOL_TRADE_STOPS_LEVEL); int custom_freeze_level= (int)SymbolInfoInteger(CUSTOM_SYMBOL_NAME, SYMBOL_TRADE_FREEZE_LEVEL); PrintFormat("Custom symbol '%s' based on '%s':\n"+ " Deal execution mode: %s\n Stops Level: %d\n Freeze Level: %d", CUSTOM_SYMBOL_NAME, CUSTOM_SYMBOL_ORIGIN, StringSubstr(EnumToString(custom_exe_mode), 23), custom_stops_level, custom_freeze_level); //--- 차트 주석에 스크립트 종료 키에 대한 힌트를 표시합니다. Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit", CUSTOM_SYMBOL_NAME)); //--- Esc 또는 Del 키를 눌러 무한 루프를 종료할 때까지 기다립니다. while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0) { Sleep(16); //--- Del을 누르면 생성된 사용자 정의 심볼이 삭제됩니다. if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0) { if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME)) PrintFormat("Custom symbol '%s' deleted successfully", CUSTOM_SYMBOL_NAME); break; } } //--- 종료하기 전에 차트를 삭제 Comment(""); /* 결과: The 'EURUSD' symbol from which the custom 'EURUSD.C' was created: Deal execution mode: INSTANT Stops Level: 0 Freeze Level: 0 Custom symbol 'EURUSD.C' based on 'EURUSD': Deal execution mode: MARKET Stops Level: 10 Freeze Level: 3 */ } //+------------------------------------------------------------------+ //| Create a custom symbol, return an error code | //+------------------------------------------------------------------+ int CreateCustomSymbol(const string symbol_name, const string symbol_path, const string symbol_origin=NULL) { //--- 사용자 정의 심볼의 기반이 될 심볼명을 정의합니다. string origin=(symbol_origin==NULL ? Symbol() : symbol_origin); //--- 사용자 정의 심볼 생성에 실패했고 오류 5304가 아닌 경우 저널에 이를 보고합니다. ResetLastError(); int error=0; if(!CustomSymbolCreate(symbol_name, symbol_path, origin)) { error=GetLastError(); if(error!=5304) PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d", symbol_name, symbol_path, origin, error); } //--- 성공 return(error); } //+------------------------------------------------------------------+ //| Remove a custom symbol | //+------------------------------------------------------------------+ bool DeleteCustomSymbol(const string symbol_name) { //--- 종합시세 창에서 심볼 숨기기 ResetLastError(); if(!SymbolSelect(symbol_name, false)) { PrintFormat("SymbolSelect(%s, false) failed. Error %d", GetLastError()); return(false); } //--- 사용자 정의 심볼 삭제에 실패한 경우 이를 저널에 보고하고 'false'를 반환합니다. ResetLastError(); if(!CustomSymbolDelete(symbol_name)) { PrintFormat("CustomSymbolDelete(%s) failed. Error %d", symbol_name, GetLastError()); return(false); } //--- 성공 return(true); } |