시스템트레이딩 게시글

2 MA 교차 - MetaTrader 4 자동매매 시스템 구축하기

첨부파일
34176.zip (2.06 KB, 다운로드 0회)

이번 글에서는 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


연관 포스트

댓글 (0)