이번 글에서는 MetaTrader 4에서 2 MA(이동평균) 교차를 기반으로 한 자동매매 시스템을 구축하는 방법을 알아보겠습니다. 먼저, 필요한 입력 변수를 정의하는 것으로 시작합니다.
//--- 입력 변수 input int period_ma_fast = 8; // 빠른 이동평균 기간 input int period_ma_slow = 20; // 느린 이동평균 기간 input double takeProfit = 20.0; // 이익 실현 (핍) input double stopLoss = 20.0 // 손실 제한 (핍) input double lotSize = 0.10 // 로트 사이즈 input double minEquity = 100.0; // 최소 자본 ($) input int Slippage = 3; // 슬리피지 input int MagicNumber = 889; // 매직 넘버
그 다음, 글로벌 변수를 정의합니다. 글로벌 스코프를 가진 변수는 모든 함수에서 접근할 수 있습니다.
// 글로벌 변수 double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
EA가 실행될 때, 가장 먼저 호출되는 함수는 OnInit()입니다. 이 함수는 주로 초기화 및 글로벌 변수를 검증하는 데 사용됩니다.
int OnInit() { // 입력 값 검증 if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){ Alert("경고 - 초기 입력 데이터가 유효하지 않습니다"); return (INIT_PARAMETERS_INCORRECT); } double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(lotSize<min_volume) { string 메시지 =StringFormat("볼륨이 허용 한도보다 작습니다: %.2f",min_volume); Alert (메시지); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(),Slippage); return(INIT_SUCCEEDED); }
시장 가격이 움직일 때, OnTick() 함수가 호출되어 모든 명령어를 실행합니다. 이 함수는 다양한 다른 함수를 호출하게 됩니다.
먼저 checkMinEquity() 함수를 호출하여 거래 자본의 적정성을 확인합니다. 자본이 충분할 경우, 신호 변수를 선언하고 NewCandle() 함수를 호출하여 새로운 캔들이 생성될 때를 알립니다.
getSignal() 함수는 두 개의 이동평균 지표 값을 읽어 상승 또는 하락 교차 여부를 신호로 반환합니다. 이 신호 정보를 기반으로 transaction() 함수에서 매수 또는 매도 포지션을 설정합니다.
그 다음, setTPSL() 함수를 호출하여 이익 실현과 손실 제한 가격을 설정합니다. 만약 자본이 최소 요구 사항을 충족하지 않으면 알림이 표시되고 EA가 종료됩니다.
void OnTick() { if (cekMinEquity()){ int signal = -1; bool isNewCandle = NewCandle(Period(), Symbol()); signal = getSignal(isNewCandle); transaction(isNewCandle, signal); setTPSL(); }else{ // 거래 중지, 자본이 부족함 Print("EA가 자본 부족으로 종료됩니다"); } }
setTPSL() 함수
void setTPSL(){ int tOrder = 0; string strMN = "", pair = ""; double sl = 0.0, tp = 0.0; pair = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--){ bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); strMN = IntegerToString(OrderMagicNumber()); if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){ if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() + (takeProfit * myPoint); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() - (stopLoss * myPoint); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){ Print ("주문 수정 성공"); } } } if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() - (takeProfit * myPoint); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() + (stopLoss * myPoint); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){ Print ("주문 수정 성공"); } } } } }
이 글에서는 MetaTrader 4에서 2 MA 교차를 활용한 자동매매 시스템을 구축하는 방법을 살펴보았습니다. 더 많은 교육과 자료를 원하신다면, 저희 텔레그램 그룹에 참여해 주세요. t.me/codeMQL
또한, 거래를 지원하는 앱을 찾고 계시다면, 저희 SignalForex 앱을 플레이 스토어에서 다운로드해 보세요.
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex