분봉 차트에서 다른 분봉을 계산할 때는,
현재 차트 주기의 배수에 해당하는 더 큰 주기만 가능합니다.
예) 5분봉 → 10분봉, 15분봉, 20분봉
랭귀지는 봉의 시가, 고가, 저가, 종가만 활용할 수 있으며,
개별 봉의 내부 가격 변동이나 시간 흐름은 알 수 없습니다.
따라서 차트 주기보다 낮은 주기는 수식으로 계산할 수 없으며,
차트 주기의 배수가 아닌 주기 역시 계산이 불가능합니다.
Input : 분주기(30),전환선기간(9),기준선기간(26),선행스팬2기간(52);
Var : TF(0),S1(0),D1(0),TM(0),cnt(0);
Var : H1(0),L1(0),H2(0),L2(0);
Var : PrevH1(0),PrevL1(0),PrevH2(0),PrevL2(0);
Var : H3(0),L3(0);
Var : 전환선(0),기준선(0),선행스팬1(0),선행스팬2(0);
Array : HH[100](0),LL[100](0);
// 새로운 영업일이 시작하면 시작시간(S1)과 날짜(D1)를 초기화
if Bdate != Bdate[1] 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 Bdate != Bdate[1] or
(Bdate == Bdate[1] and 분주기 > 1 and TF < TF[1]) or
(Bdate == Bdate[1] and 분주기 > 1 and TM >= TM[1]+분주기) or
(Bdate == Bdate[1] and 분주기 == 1 and TM > TM[1]) Then
{
//배열의 0번방기준으로 최신값순으로 저장하기 위해
//배열의 기존값을 다음방으로 이동
for cnt = 99 downto 1
{
HH[cnt] = HH[cnt-1];
LL[cnt] = LL[cnt-1];
}
//0번방에는 초기값으로 고가, 저가 저장
HH[0] = H; // 우선 현재 고가를 0번에 기록
LL[0] = L; // 우선 현재 저가를 0번에 기록
}
//최고,최저를 갱신하면 값 저장
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
// 선행스팬2기간+25 이전까지 데이터가 쌓였는지 확인
if HH[선행스팬2기간+25] > 0 and LL[선행스팬2기간+25] > 0 then
{
//전환선 계산을 위한 초기값 설정
H1 = HH[0];
L1 = LL[0];
//25봉전 전환선을 계산하기 위해 데이터 초기값 설정
PrevH1 = HH[25];
PrevL1 = LL[25];
//기준선 계산을 위한 초기값 설정
H2 = HH[0];
L2 = LL[0];
//25봉전 기준선을 계산하기 위해 데이터 초기값 설정
PrevH2 = HH[25];
PrevL2 = LL[25];
// 선행스팬2 계산을 위한 초기값
H3 = HH[25];
L3 = LL[25];
// 최근 선행스팬2기간 동안의 최고/최저를 탐색
for cnt = 0 to 선행스팬2기간-1
{
//전환선 계산을 위해 최고가/최저가 계산
if cnt < 전환선기간 Then
{
if HH[cnt] > H1 Then
H1 = HH[cnt];
if LL[cnt] < L1 Then
L1 = LL[cnt];
// 25봉전 기준 전환선기간 동안 최고가/최저가 계산
if HH[cnt+25] > PrevH1 Then
PrevH1 = HH[cnt+25];
if LL[cnt+25] < PrevL1 Then
PrevL1 = LL[cnt+25];
}
//기준선 계산을 위해 최고가/최저가 계산
if cnt < 기준선기간 Then
{
if HH[cnt] > H2 Then
H2 = HH[cnt];
if LL[cnt] < L2 Then
L2 = LL[cnt];
//25봉전 기준 기주선선기간 동안 최고가/최저가 계산
if HH[cnt+25] > PrevH2 Then
PrevH2 = HH[cnt+25];
if LL[cnt+25] < PrevL2 Then
PrevL2 = LL[cnt+25];
}
//25봉전 선행스팬2기간 동안 최고가/최저가 계산
if HH[cnt+25] > H3 Then
H3 = HH[cnt+25];
if LL[cnt+25] < L3 Then
L3 = LL[cnt+25];
}
// 전환선
전환선 = (H1 + L1)/2;
// 기준선
기준선 = (H2 + L2)/2;
// 선행스팬1 = (전환선(25봉 전) + 기준선(25봉 전)) / 2
선행스팬1 = ((PrevH1+PrevL1)/2 + (PrevH2+PrevL2)/2) / 2 ;
// 선행스팬2 = (25봉전 기준 선행스팬2기간의 최고 + 최저) / 2
선행스팬2 = (H3+L3) / 2;
// 차트에 출력: 전환선, 기준선, 선행스팬1, 선행스팬2
plot1(전환선);
plot2(기준선);
plot3(선행스팬1);
plot4(선행스팬2);
}
}
JavaScript
복사
[지수이동평균 계산공식]
전환선 = (9일 최고가 + 9일 최저가)/2
기준선 = (26일 최고가 + 26일 최저가)/2
후행스팬 현재봉 종가
선행스팬1 = (전환선+기준선)/2
선행스팬2 = (52일 최고가 + 52일 최저가)/2
후행스팬은 현재종가를 25봉 뒤로 이동시킨 선입니다.
선행스팬1,2는 현재값을 25봉 앞으로 이동시킨 선입니다.
[설명]
분봉차트에서 다른 분봉주기의 일목균형표을 계산하는 수식입니다.
선행스팬은 앞으로 25봉 이동한 선이므로 현재봉에는 25봉전 값이 위치합니다.
후행스팬은 현재봉 종가를 25봉전으로 이동한 선인데 다른주기값으로 그리면 다른주기로 고정갯수로 이전봉을 지정할 수 없어 그리지 않습니다.
1.
24시간 거래되는 상품들도 있으므로
날짜변경이 아닌 영업일 변경을 기준으로 현재봉이 몇분이 경과했는지 계산
2.
경과한 분을 다른주기로 나누어 나머지를 구해서 다른주기의 시작봉 체크
3.
필요한 값을 배열에 저장하는데
새로운 다른주기 시작봉이 발생하면 기존 배열의 값을 다음방으로 순차적으로 이동하고
0번방에 최신값 저장
4.
계산에 필요한 배열값이 모이면 계산