지표설명
Impulse System은 본래 일봉에 적용하는 전략으로 알려져 있으나, 이 예제 코드는 분봉 차트에서 상위 주기의 분봉 값과 비교하여 신호를 발생시키는 다중 시간대(Multi-Timeframe, MTF) 전략입니다.
전략의 핵심은 참고분봉(예: 30분봉)으로 설정된 상위 주기의 추세와 현재 차트(예: 5분봉)의 추세가 완벽하게 정렬되는 시점을 포착하는 것입니다. 코드는 Bdate (영업일) 및 TimeToMinutes (시간) 함수를 사용하여, 상위 주기의 EMA(13) 값(TFema)과 MACD Oscillator(12,26,9) 값(TFMACDO)을 현재 봉에서 시뮬레이션합니다.
매수 진입:
상위 주기의 13-EMA와 MACD Oscillator가 모두 1봉 전보다 상승하고, 동시에 현재 차트의 13-EMA와 MACD Oscillator도 모두 1봉 전보다 상승할 때, 즉 두 시간대의 추세가 모두 상승으로 정렬되면 매수(Buy)합니다.
매도 진입:
반대로, 상위 주기와 현재 주기의 13-EMA 및 MACD Oscillator가 모두 1봉 전보다 하락할 때, 즉 두 시간대의 추세가 모두 하락으로 정렬되면 매도(Sell)합니다.
활용예시
Input : 참고분봉(30),Period(13),short(12),long(26),sig(9);
Var : S1(0),D1(0),TM(0),TF(0),Didx(0);
Var : TFEP(0),TFEP1(0),TFEP2(0),TFEP3(0);
var : TFema(0),preTFema(0);
Var : TFJISU1(0),TFJISU2(0),PreTFJISU1(0),PreTFJISU2(0);
Var : TFMACDV(0),TFMACDS(0),TFMACDo(0);
Var : PreTFMACDV(0),PreTFMACDS(0),PreTFMACDo(0);
var : Emav(0),MACDO(0);
var : Bcond(False),Scond(False);
//지수이평 평활계수
TFEP = 2/(Period+1);
// MACD에 사용할 지수이평 평활계수
TFEP1 = 2/(short+1);
TFEP2 = 2/(long+1);
TFEP3 = 2/(sig+1);
// 새로운 영업일이 시작하면 시작시간(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
{
Didx = Didx + 1;
PreTFema = TFema[1];
PreTFJISU1 = TFJISU1[1];
PreTFJISU2 = TFJISU2[1];
PreTFMACDV = TFMACDV[1];
PreTFMACDS = TFMACDS[1];
PreTFMACDO = TFMACDO[1];
}
if Didx <= 1 then
{
TFema = c;
TFJISU1 = C;
TFJISU2 = C;
TFMACDV = TFJISU1-TFJISU2;
TFMACDS = TFMACDV;
TFMACDO = TFMACDV-TFMACDS;
}
else
{
TFema = C * TFEP + PreTFema * (1-TFEP); ;
TFJISU1 = C * TFEP1 + PreTFJISU1 * (1-TFEP1);
TFJISU2 = C * TFEP2 + PreTFJISU2 * (1-TFEP2);
TFMACDV = TFJISU1-TFJISU2;
TFMACDS = TFMACDV * TFEP3 + PreTFMACDS * (1-TFEP3);
TFMACDO = TFMACDV-TFMACDS;
}
}
Emav = Ema(C,Period);
MACDO = MACD_OSC(short,long,sig);
# 매수진입
//주봉과 일봉 지수이평과 MACD오실레이터가 동시상승이면 Bcond는 true 아니면 false
Bcond = TFema > PreTFema and TFMACDO > PreTFMACDO and
emav > emav[1] and MACDO > MACDO[1];
//주봉과 일봉 지수이평과 MACD오실레이터가 동시하락이면 Scond는 true 아니면 false
Scond = TFema < PreTFema and TFMACDO < PreTFMACDO and
emav < emav[1] and MACDO < MACDO[1];
//Bcond가 False에서 true로 변경되면 매수진입
If Bcond == true and Bcond[1] == False Then
buy();
//Scond가 False에서 true로 변경되면 매도진입
If Scond == true and Scond[1] == False Then
Sell();
JavaScript
복사
