본문 바로가기

EA 교육자료

RSI상대강도지수 소스 매매코딩

1-3-6. RSI상대강도지수 mql4소스코딩(1-3-2.RSI상대강도지수를 활용한 매매전략)

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

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

extern int MagicNo = 1234;   //외부변수 값 설정
extern double Lots = 1.0;   //랏사이즈 설정
extern int RSIperiod = 14;   //RSI기간
extern int Top = 70;   //RSI윗선   
extern int Bottom = 30;   //RSI아래선


int start()
  {
   double preRSI,curRSI;   //double타입의 변수 설정
   int i, ticket, total;    //int타입의 변수 설정
   bool CloseSuccess;   //bool타입의 변수 설정

   preRSI = iRSI(NULL,0,RSIperiod,PRICE_OPEN,1);
   curRSI = iRSI(NULL,0,RSIperiod,PRICE_OPEN,0);
   
// preRSI,curRSI 변수 안에 볼린져밴드 보조지표 값을 넣어줌.
// iRSI(통화쌍,시간봉,기간,기준가격,캔들순서)

//-----------------------------------------------------------------------------------  
   total=OrdersTotal();  //변수 total에 현재 오픈포지션의 개수를 입력
   if(total<1)   //현재 오픈포지션의 개수가 1보다 작다면, 즉 현재 오픈포지션이 없다면
     {
         if(preRSI < Bottom && curRSI > Bottom)
         //이전 캔들의 RSI값이 Bottom(30)보다 작고, 현재 캔들의 RSI값이 Bottom(30)보다 클때. 즉, 30기준선을 상향돌파 시
           {
            ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"RSI",MagicNo,0,Blue);  //매수포지션 오픈  
            //OrderSend(통화쌍,오더의종류,랏사이즈,체결가격,슬리피지,손절매,이익실현가,코멘트,매직넘버,지정가주문유효기간,오더색상)       
            if(ticket>0) //ticket이 '0'보다 클때. 즉, 해당오더가 성공적으로 오픈되었다면
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  //해당오더를 선택
                  Print("BUY order opened : ",OrderOpenPrice());  //해당오더의 '오픈가격'을 프린트 함
              }
            else  //ticket이 '0'이거나 '0'보다 작을때. 즉, 해당오더가 주문실패했다면
               Print("Error opening BUY order : ",GetLastError());  //에러번호를 프린트 함            
            return(0); 
           }
         if(preRSI > Top && curRSI < Top)
         //이전 캔들의 RSI값이 Top(70)보다 크고, 현재 캔들의 RSI값이 Top(70)보다 작을때. 즉, 70기준선을 하향돌파 시
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"RSI",MagicNo,0,Red);  //매도포지션 오픈 
            if(ticket>0)
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                  Print("SELL order opened : ",OrderOpenPrice());
              }
            else
               Print("Error opening SELL order : ",GetLastError());                  
            return(0); 
           }
      return(0);
     }

//-----------------------------------------------------------------------  
//OrderClose()함수를 사용하여 조건청산 
 
  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(curRSI >= Top)  //현재캔들의 RSI값이 Top(70)보다 크거나 같을때. 즉, RSI 70기준선에 닿을 시.
                   {
                    CloseSuccess=OrderClose(OrderTicket(),OrderLots(),Bid,10,White);   //청산
                    return(0);
                   }      
                }
              if(OrderType() == OP_SELL)  //오더타입이 SELL포지션이며
                {
                 if(curRSI <= Bottom)  //현재캔들의 RSI값이 Bottom(30)보다 작거나 같을 때. 즉, RSI 30기준선에 닿을 시. 
                   {
                    CloseSuccess=OrderClose(OrderTicket(),OrderLots(),Ask,10,White);   //청산
                    return(0);
                   }   
                }                                      
          }
       }
    }  
return(0);