본문 바로가기

EA 교육자료

이동평균선 매매코딩

1-1. 이동평균선

1-1-1. 이동평균선 설명

이동평균선은 일정기간 동안의 가격을 산술 평균한 값을 차례로 연결해 만든 선이며, 이러한 선의 일정한 방향성을 활용하여 향후 가격추이를 예측하는데 사용되는 가장 대표적인 기술적 보조지표입니다. 단기/중기/장기 이동평균선으로 구분되며, 평균선들이 만나는 지점을 크로스로 구분하여 가격방향성을 예측합니다.

 


1-1-2. 이동평균선을 활용한 매매전략

[진입]
단기이동평균선이 장기이동평균선을 상향돌파(골드크로스) 할 때 매수진입
단기이동평균선이 장기이동평균선을 하향돌파(데드크로스) 할 때 매도진입
[청산]
진입과 동시에 이익실현 핍과 손절매 핍 설정


1-1-3. iMA()이동평균선 함수 구조

double  iMA(
   string       symbol,           // 통화쌍
   int          timeframe,        // 시간봉
   int          ma_period,        // 이동평균선기간
   int          ma_shift,          // 이동평균선 쉬프트
   int          ma_method,       // MA방법
   int          applied_price,     // 기준가격
   int          shift             // 캔들순서(현재봉일경우0,전봉은1,전전봉은2..)
   );


1-1-4. iMA()이동평균선 함수 작성법

[표기]
iMA(symbol,timeframe,ma_period,ma_shift,ma_method,applied_price,shift)
[해석]
iMA(통화쌍,시간봉,이동평균기간,이평선 쉬프트,MA방법,기준가격,캔들순서)


1-1-5. iMA()이동평균선 함수 속성 상세설명

a. 통화쌍(symbol)
 
오더의 통화쌍을 지정합니다.
“EURUSD” :EURUSD통화쌍의 오더를 오픈하도록 합니다. 
Symbol(): EA가 적용된 챠트 통화쌍의 오더를 오픈합니다.
NULL: EA가 적용된 챠트 통화쌍의 오더를 오픈합니다.

b. 시간봉(timeframe)
 
데이터를 불러올 시간봉. ’0’은 현재챠트의 값 사용

c. 이동평균선기간(ma_period)

 이동평균선 값을 산출할 기간(캔들개수)

d. 이동평균선 쉬프트(ma_shift)
 
이동평균선 챠트이동설정

e. MA방법(ma_method)
 
Simple/Exponential/smoothed/linear Weighted 중 선택

f. 기준가격(applied_price)
 
이동평균선을 만들 캔들데이터 선택

g. 캔들순서(shift)

 ‘0’은 현재캔들, ‘1’은 직전캔들, ‘2’는 전전캔들…


1-1-6. 이동평균선 mql4소스코딩(1-1-2.이동평균선을 활용한 매매전략)

검정색글자: 소스코딩
붉은색글자: 해설

//------------------------------------------------------------------------------------------------------------

extern int MagicNo = 1234;   //외부변수 값 설정
extern double Lots = 1.0;   //랏사이즈 설정
extern int ShortMA = 30;   //단기이동평균선 기간
extern int LongMA = 120;   //장기이동평균선 기간
extern double TakeProfit = 50;  //이익실현 핍
extern double StopLoss = 50;   //손절매 핍

int start()
  {
   double SMACur,SMAPre,LMACur,LMAPre;   //double타입의 변수 설정
   int i, ticket, total;    //int타입의 변수 설정
   bool ticketM;    //bool타입의 변수 설정

   SMACur=iMA(NULL,0,ShortMA,0,MODE_SMA,PRICE_OPEN,0);   //현재봉의 단기이동평균선 값 
   SMAPre=iMA(NULL,0,ShortMA,0,MODE_SMA,PRICE_OPEN,1);   //직전봉의 단기이동평균선 값
   LMACur=iMA(NULL,0,LongMA,0,MODE_SMA,PRICE_OPEN,0);   //현재봉의 장기이동평균선 값
   LMAPre=iMA(NULL,0,LongMA,0,MODE_SMA,PRICE_OPEN,1);   //직전봉의 장기이동평균선 값  
   
// SMACur,SMAPre,LMACur,LMAPre 변수 안에 이동평균선 보조지표 값을 넣어줌.
// iMA(통화쌍,시간봉,이동평균기간,이평선 쉬프트,이평선종류,사용할 캔들가격,봉순서-현재봉일경우0)

//-----------------------------------------------------------------------------------  
   total=OrdersTotal();  //변수 total에 현재 오픈포지션의 개수를 입력
   if(total<1)   //현재 오픈포지션의 개수가 1보다 작다면, 즉 현재 오픈포지션이 없다면
     {
         if(SMACur > LMACur && SMAPre < LMAPre)  
         //현재봉의 단기이평선이 현재봉의 장기이평선보다 위에 있고, 직전봉의 단기이평선이 직전봉의 장기이평선보다 아래에 있을 때
         //즉, 이동평균선 골드크로스 발생 시 
           {
            ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"MA",MagicNo,0,Blue);  //매수포지션 오픈  
            //OrderSend(통화쌍,오더의종류,랏사이즈,체결가격,슬리피지,손절매,이익실현가,코멘트,매직넘버,지정가주문유효기간,오더색상)       
            return(0); 
           }
         if(SMACur < LMACur && SMAPre > LMAPre)   //이동평균선 데드크로스 발생 시
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"MA",MagicNo,0,Red);       
            return(0); 
           }
      return(0);
     }

//-----------------------------------------------------------------------  
//아래구문에서 해당오더에 대한 손절/익절값을 넣어줌. 
 
  for(i=0;i<OrdersTotal();i++)   //현재 오픈되어 있는 전체 오더를 대상으로 for구문을 돌림
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)   //OrderSelect함수로 개별오더를 잡아줌
       {
        if(OrderMagicNumber()== MagicNo && OrderSymbol()==Symbol()) //해당오더의 매직넘버&통화쌍을 확인
          {
              if(OrderType() == OP_BUY)  //오더타입이 BUY포지션이라면
                {
                 if(OrderStopLoss()==0 && OrderTakeProfit() ==0)  //해당오더의 손절과 익절값이 '0'이라면
                   {
                    ticketM=OrderModify(OrderTicket(),OrderOpenPrice(),Ask-StopLoss*Point*10,Ask+TakeProfit*Point*10,0,Blue);
                    //새로운 속성으로 해당오더를 변경함
                    return(0);
                   }      
                }
              if(OrderType() == OP_SELL) 
                {
                 if(OrderStopLoss()==0 && OrderTakeProfit() ==0) 
                   {
                    ticketM=OrderModify(OrderTicket(),OrderOpenPrice(),Bid+StopLoss*Point*10,Bid-TakeProfit*Point*10,0,Red);
                    return(0);
                   }   
                }                                      
          }
       }
    }  
return(0);