국내선옵의 경우 18시(야간장시작)가 영업일 변경시간이고
오전 8:45분에 주간장이 시작입니다.
30분봉 차트를 보고 있다면 야간장에는 매시와 매시 30분이 새로운 시작봉이지만
주간장에는 45분과 15분에 새로운 봉이 시작됩니다.
그러므로 국내선옵 차트에 적용하는 타분봉 수식은
8시45분부터 지정한 타분봉 주기로 구분되도록
별도 시간처리가 추가되어야 합니다.
분봉 차트에서 다른 분봉을 계산할 때는,
현재 차트 주기의 배수에 해당하는 더 큰 주기만 가능합니다.
예) 5분봉 → 10분봉, 15분봉, 20분봉
랭귀지는 봉의 시가, 고가, 저가, 종가만 활용할 수 있으며,
개별 봉의 내부 가격 변동이나 시간 흐름은 알 수 없습니다.
따라서 차트 주기보다 낮은 주기는 수식으로 계산할 수 없으며,
차트 주기의 배수가 아닌 주기 역시 계산이 불가능합니다.
Input : 분주기(30),Sto1(10),Sto2(5),Sto3(5);
Var : Reschedule(false);
Var : S1(0),D1(0),TM(0),TF(0),Bar(0);
Var : cnt(0), Hv(0), LV(0), FK(0), SK(0), SD(0);
Var : EP1(0), EP2(0), JISU(0), DINDEX(0), PreSK(0), PreSD(0);
Array : HH[100](0),LL[100](0);
// 스토캐스틱 평활계수 계산
EP1 = 2/(Sto2+1);
EP2 = 2/(Sto3+1);
#새로운 영업일이 시작하거나 8시45분 이후 첫봉이면 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
{
//첫봉의 stime을 분단위로 변환
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
{
//다른주기 분봉 갯수 카운트 카운트
bar = bar+1;
//배열의 0번방기준으로 최신값순으로 저장하기 위해
//배열의 기존값을 다음방으로 이동
for cnt = 99 downto 1
{
HH[cnt] = HH[cnt-1];
LL[cnt] = LL[cnt-1];
}
//0번방에는 초기값으로 고가, 저가 저장
HH[0] = H;
LL[0] = L;
//이전 다른주기 분봉의 SK와 SK값값을 저장
PreSK = SK[1];
PreSD = SD[1];
}
//최고,최저를 갱신하면 값 저장
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
// FastK를 계산하기 위한 값들이 확보된 이후에
if bar >= Sto1 then
{
//다른주기 N개봉 최고가,최저가 계산
Hv = 0;
LV = 0;
for cnt = 0 to Sto1-1
{
if Hv == 0 or (Hv > 0 and HH[cnt] > Hv) then
Hv = HH[cnt];
if LV == 0 or (LV > 0 and LL[cnt] < LV) then
LV = LL[cnt];
}
//FastK 계산: 현재 종가의 위치를 0~100으로 환산
FK = (C-LV)/(Hv-LV)*100;
if bar >= Sto1 then
{
#FastK계산이 가능한 첫봉이면
if bar == Sto1 Then
{
//SlowK와 slowD는 모두 FK값
SK = FK;
SD = SK;
}
else //#FastK계산이 가능한 두번째 봉부터
{
// 지수 평활: SK은 EP1로, SD는 EP2로 추가 평활
SK = FK * EP1 + PreSK * (1-EP1);
SD = SK * EP2 + PreSD * (1-EP2);
}
// 차트 출력: SK, SD 및 기준선(20/80)
plot1(SK,"타분봉 SlowK");
plot2(SD,"타분봉 SlowD");
PlotBaseLine1(20);
PlotBaseLine2(80);
}
}
}
JavaScript
복사
[지수이동평균 계산공식]
FastK = (현재종가-n일기간 최저가) / (n일기간 최고가 - n일기간 최저가)*100;
SlowK = FastK의 n지수이동평균
SlowD = SlowK의 n지수이동평균
[설명]
분봉차트에서 다른 분봉주기의 스토케스틱을 계산하는 수식입니다.
1.
24시간 거래되는 상품들도 있으므로
날짜변경이 아닌 영업일 변경을 기준으로 현재봉이 몇분이 경과했는지 계산
2.
경과한 분을 다른 분주기로 나누어 나머지를 구해서
다른 분주기의 시작봉 체크
3.
다른 분주기의 시작봉이 발생하면 다른 분주기의 봉갯수를 카운트하고
FastK를 계산할 만큼 데이터가 확보된 이후에 계산
기본적으로 제공되는 스토케스틱은 지수이평기준입니다.
지수이평평균에서 기간값은 봉수가 아닌 평활계수 계산에 사용되는 값입니다.
지수이동평균은 현재값과 직전봉값에 각각 비율을 지정해 합산한 값이므로
과거봉수에 따라 현재값의 차이가 발생하게 되고 시간이 경과함에 따라 과거의 영향력이 소멸하므로 차트에 되도록 많은 봉수를 조회해서 보셔야 합니다.