본문 바로가기

EA 교육자료

볼린져밴드 매매코딩

1-2. 볼린밴드

1-2-1. 볼린밴드 설명

볼린밴드는 가격변동성분석과 추세분석을 동시에 수행하며, 추세가 시작되는 가격돌파 시점을 잡는데 보편적으로 사용되는 보조지표입니다. 볼린밴드는 추세중심선, 상단선, 하단선으로 구성되며, 상단선과 하단선의 폭이 좁은 가격대를 형성했을 때, 가격이 볼린밴드 상단선을 뚫고 상승할 때가 매수신호입니다. 반대로 하단선을 뚫고 하락할 때는 매도신호입니다. 사용자의 해석에 따라 횡보매매를 위한 보조지표로 활용되기도 합니다.

 


1-2-2. 볼린밴드를 활용한 매매전략

[진입]
가격이 볼린밴드의 상단선을 상승돌파 할 때 매수진입
가격이 볼린밴드의 하단선을 하락돌파 할 때 매도진입
 [청산]
진입과 동시에 이익실현 핍과 손절매 핍 설정


1-2-3. iBands()볼린밴드 함수 구조

double  iBands(
   string       symbol,           // 통화쌍
   int          timeframe,        // 시간봉
   int          period,           // 기간
   double       deviation,        // 승수
   int          bands_shift,       // 볼린밴드 쉬프트
   int          applied_price,     // 기준가격
   int          mode,            // 라인 인덱스
   int          shift             // 캔들순서(현재봉일경우0,전봉은1,전전봉은2..)
   );


1-2-4. iBands()볼린밴드 함수 작성법

[표기]
iBands(symbol, timeframe,period,deviation,bands_shift,applied_price,mode,shift)
[해석]
iBands (통화쌍,시간봉,기간,승수,쉬프트,기준가격,라인인덱스,캔들순서)


1-2-5. iBands()볼린밴드 함수 속성 상세설명

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

b. 시간봉(timeframe)

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

c. 기간(period)
 
볼린밴드 값을 산출할 기간 설정

d. 승수(deviation)

 볼린밴드 승수 설정

e. 볼린밴드 쉬프트(bands_shift)

 볼린밴드 챠트이동설정

f. 기준가격(applied_price)

 볼린밴드를 만들 캔들데이터 선택

g. 라인 인덱스(mode)

 0 - MODE_MAIN, 1 - MODE_UPPER, 2 - MODE_LOWER

h. 캔들순서(shift)

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


1-2-6. 볼린밴드 mql4소스코딩(1-2-2.볼린밴드를 활용한 매매전략)

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

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

extern int MagicNo = 1234;   //외부변수 값 설정
extern double Lots = 1.0;   //랏사이즈 설정
extern int BBperiod = 20;   //볼린밴드 기간
extern int BBdeviation = 2;   //볼린밴드 승수
extern double TakeProfit = 50;  //이익실현 핍
extern double StopLoss = 50;   //손절매 핍

int start()
  {
   double BBupper,BBlower;   //double타입의 변수 설정
   int i, ticket, total;    //int타입의 변수 설정
   bool ticketM;    //bool타입의 변수 설정   

   BBupper = iBands(NULL,0,BBperiod,BBdeviation,0,PRICE_OPEN,MODE_UPPER,0);
   BBlower = iBands(NULL,0,BBperiod,BBdeviation,0,PRICE_OPEN,MODE_LOWER,0);
   
// BBupper,BBlower 변수 안에 볼린밴드 보조지표 값을 넣어줌.
// iBands(통화쌍,시간봉,기간,승수,쉬프트,기준가격,라인인덱스,캔들순서)

//-----------------------------------------------------------------------------------  
   total=OrdersTotal();  //변수 total에 현재 오픈포지션의 개수를 입력
   if(total<1)   //현재 오픈포지션의 개수가 1보다 작다면, 즉 현재 오픈포지션이 없다면
     {
         if(Bid > BBupper) //현재가격이 볼린밴드 상단선보다 클때. 즉, 볼린밴드 상단선 돌파 시 
           {
            ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"Bands",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(Bid < BBlower) //현재가격이 볼린밴드 하단선보다 작을때. 즉, 볼린밴드 하단선 돌파 시 
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"Bands",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);
     }

//-----------------------------------------------------------------------  
//아래구문에서 해당오더에 대한 손절/익절값을 넣어줌. 
 
  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);