안녕하세요, 트레이더 여러분! 오늘은 MetaTrader 4에서 2개의 이동평균(MA) 교차를 이용한 거래 자동화 시스템을 만드는 방법에 대해 이야기해볼게요. 이 자동매매 프로그램을 통해 효율적으로 거래를 수행할 수 있습니다.
1. 입력 변수 정의하기
먼저, 이 EA(자동매매 프로그램)를 만들기 위해 입력 변수를 정의해야 합니다.
//--- 입력 파라미터 input int period_ma_fast = 8; // 빠른 MA 기간 input int period_ma_slow = 20; // 느린 MA 기간 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; // 매직 넘버
2. 전역 변수 정의하기
그 다음으로, 전역 변수를 정의해 보겠습니다. 이 전역 변수는 모든 함수에서 접근할 수 있습니다.
// 전역 변수 double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
3. EA 초기화
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); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(), Slippage); return(INIT_SUCCEEDED); }
4. 가격 변동 시 동작
시장이 움직일 때는 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가 자본 부족으로 중지됩니다."); } }
5. 이익 실현 및 손절 설정
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 ("주문 수정 성공"); } } } }// 매직 넘버 및 심볼 끝 }// for 끝 }
6. 마무리
오늘 설명한 내용을 바탕으로 여러분의 거래 전략을 더욱 효과적으로 자동화해보세요. 이 EA를 사용하여 더 나은 결과를 얻을 수 있기를 바랍니다!
더 많은 정보를 원하신다면, 저희 텔레그램 그룹에 가입해주세요. t.me/codeMQL
거래를 지원하는 앱을 찾고 계신다면, Play Store에서 SignalForex 앱을 다운로드해보세요!
댓글 0