Search
📝

(국내선옵)분봉에서 다른분봉 RSI

국내선옵의 경우 18시(야간장시작)가 영업일 변경시간이고 오전 8:45분에 주간장이 시작입니다. 30분봉 차트를 보고 있다면 야간장에는 매시와 매시 30분이 새로운 시작봉이지만 주간장에는 45분과 15분에 새로운 봉이 시작됩니다. 그러므로 국내선옵 차트에 적용하는 타분봉 수식은 8시45분부터 지정한 타분봉 주기로 구분되도록 별도 시간처리가 추가되어야 합니다.
분봉 차트에서 다른 분봉을 계산할 때는, 현재 차트 주기의 배수에 해당하는 더 큰 주기만 가능합니다.
예) 5분봉 → 10분봉, 15분봉, 20분봉
랭귀지는 봉의 시가, 고가, 저가, 종가만 활용할 수 있으며, 개별 봉의 내부 가격 변동이나 시간 흐름은 알 수 없습니다.
따라서 차트 주기보다 낮은 주기는 수식으로 계산할 수 없으며, 차트 주기의 배수가 아닌 주기 역시 계산이 불가능합니다.
Input : 분주기(30),Length(14),signal(9); Var : Reschedule(false); var : i(0),S1(0),D1(0),TM(0),TF(0),idx(0); Var : DownAmt(0), UpAmt(0),UpSum(0),DownSum(0),UpAvg(0),DownAvg(0); var : PreUpAvg(0), preDownAvg(0),SigSum(0),RSIsig(0); Array : C1[100](0),RSIV[100](-1); #새로운 영업일이 시작하거나 845분 이후 첫봉이면 true 아니면 false Reschedule = Bdate != Bdate[1] or (sDate != sDate[1] and sTime >= 84500) or (sDate == sDate[1] and sTime >= 84500 and sTime[1] < 84500); //새로운 영업일이거나 8시 45분 이후 첫봉이면 //시작시간(S1)과 날짜(D1)를 초기화 if Reschedule == true Then { S1 = TimeToMinutes(stime); D1 = sdate; } // D1에 날짜가 저장된 이후(영업일 변경이 되는 봉이 발생 후에) if D1 > 0 then { //같은 날짜인지 판단하여 영업일 변경이후 경과분(TM)계산 if sdate == D1 Then TM = TimeToMinutes(stime)-S1;//첫봉과 동일날짜이면 첫봉부터 경과분계산 Else TM = TimeToMinutes(stime)+1440-S1;//다음날이면 24시간(1440분)을 더해서 보정 //영업일 변경이후 경과분을 분주기로 나누어 나머지를 구함 TF = TM%분주기; //새로운 영업일이 시작하거나 새로운 분이 시작되면 if Reschedule == true or (Reschedule == False and 분주기 > 1 and TF < TF[1]) or (Reschedule == False and 분주기 > 1 and TM >= TM[1]+분주기) or (Reschedule == False and 분주기 == 1 and TM > TM[1]) Then { for i = 99 downto 1 { C1[i] = C1[i-1]; RSIV[i] = RSIV[i-1]; } PreUpAvg = UpAvg[1]; preDownAvg = DownAvg[1]; idx = idx + 1; } C1[0] = C; // RSI계산 최초일 If idx == Length+2 Then { //Length 기간 전체를 직접 합산하여 Up/Down 평균 계산 UpSum = 0; DownSum = 0; For i = 0 To Length - 1 { //UpAmt에 전일대비 종가 등락 저장 UpAmt = C1[i] - C1[i+1]; //상승이면 If UpAmt >= 0 Then //상승이면 DownAmt = 0; //DownAmt은 0 Else //아니면 { DownAmt = -UpAmt; //DownAmt에 하락값 저장 UpAmt = 0;//UpAmt은 0 } // 전체 상승합 UpSum = UpSum + UpAmt; // 전체 하락합 DownSum = DownSum + DownAmt; } // Length 기간 평균 상승 UpAvg = UpSum / Length; // Length 기간 평균 하락 DownAvg = DownSum / Length; } // RSI계산 두번째일 부터 If idx > Length+2 Then { //UpAmt에 전일대비 종가 등락 저장 UpAmt = C1[0] - C1[1]; //상승이면 If UpAmt >= 0 Then DownAmt = 0; //DownAmt은 0 Else //아니면 { DownAmt = -UpAmt; //DownAmt에 하락값 저장 UpAmt = 0; //UpAmt은 0 } // 이전 상승값을 (Length-1)배로 하고 현재 상승값을 더해서 Length로 나눔어 상승평균 계산 UpAvg = (PreUpAvg * (Length - 1) + UpAmt) / Length; // 이전 하락값을 (Length-1)배로 하고 현재 하락값을 더해서 Length로 나눔어 하락평균 계산 DownAvg = (preDownAvg * (Length - 1) + DownAmt) / Length; } //상승평균과 하락형균의 합이 0이 아닐때 If UpAvg + DownAvg <> 0 Then //RSIV배열의 0번방에 오늘 RSI 계산해서 저장 RSIv[0] = 100 * UpAvg / (UpAvg + DownAvg); Else //상승평균과 하락평균의 합이 0이면 오늘 RSI는 0 RSIv[0] = 0; //일봉 RSI의 평균값을 만들만큼 데이터가 모이면 if RSIV[signal-1] >= 0 Then { // 최근 signal 개의 RSI 값 합산 SigSum = 0; For i = 0 to signal-1 { SigSum = SigSum + RSIV[i]; } // 시그널은 단순 이동평균(SMA) RSIsig = SigSum/signal; } plot1(RSIv[0],"RSI"); plot2(RSIsig,"signal"); PlotBaseLine1(30, "기준선 30"); PlotBaseLine2(70, "기준선 70"); }
JavaScript
복사
[RSI 공식]
RSI = n일간의 주가 상승폭 합계/(n일간의 주가 상승폭 합계 -n일간의 주가 하락폭 합계) *100
[설명] 분봉차트에서 다른 분봉주기의 RSI를 계산하는 수식입니다.
1.
24시간 거래되는 상품들도 있으므로 날짜변경이 아닌 영업일 변경을 기준으로 현재봉이 몇분이 경과했는지 계산
2.
경과한 분을 다른주기로 나누어 나머지를 구해서 다른주기의 시작봉 체크
3.
필요한 값을 배열에 저장하는데 새로운 다른주기 시작봉이 발생하면 기존 배열의 값을 다음방으로 순차적으로 이동하고 0번방에 최신값 저장
4.
계산에 필요한 배열값이 모이면 계산