Input : Length(14),signal(9);
var : i(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);
//영업일이 바뀌면
if Bdate != Bdate[1] Then
{
//배열의 0번방기준으로 최신값순으로 저장하기 위해
//배열의 기존값을 다음방으로 이동
for i = 99 DownTo 1
{
C1[i] = C1[i-1];
RSIV[i] = RSIV[i-1];
}
// 이전일의 UpAvg를 보관
PreUpAvg = UpAvg[1];
// 이전일의 DownAvg 보관
preDownAvg = DownAvg[1];
//날짜수 1씩 증가
idx = idx + 1;
}
//0번방에 최신 종가 저장
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