커뮤니티
다중 주기 관련 문의
2012-04-22 12:29:25
479
글번호 50313
안녕하세요.
선물 60분봉 차트에서 선물 1일봉 차트의 값을 참조 하려 합니다.
종목추가로 1일봉 차트 추가 및 참조는 하고 있는데 추가한 1일봉 차트 기준의 지표값을 만들면서 구현이 안되고 있네요..
종목추가한 1일봉 차트 기준 RSI(12)를 만드려는데 다른 글들을 보니 함수를 다 풀어서 작성 해야 한다고 되어 있길래 RSI를 모두 풀어서 새로 정의 하고 있습니다.
실행 결과 별개 1일봉 차트에 추가한 RSI 지표와 같이 틀리게 나오길래 원인을 찾아보니 60분봉 기준으로 1일봉당 8개의 봉이 나오는데 이중에 첫번째 봉에서만 실행을 해야 겠는데 방법 좀 알려 주세요~
Data2(sTime), sTime 을 비교해 보니 090000 값이 data2에서는 8개 모두 090000으로 나오는데 60분 봉에서는 두개가 나와서 하루에 두번씩 실행이 되니 값이 틀려 지네요.. ㅜㅜ
index를 찍어 보니 index는 60분봉 기준으로 계속 올라가도 Data2(index)는 일봉기준으로 값이 변하는걸 보니 처음 바뀌는 부분을 알아내는 방법이 있을거 같은데 말이죠.. @.,@
아래는 구현 함수 입니다.
---------------------------------------------
Input : Period(12) ;
var : Relative(0, data2); // RSI의 반환값
var : Length(0, data2); // 원 RSI함수의 input
// 원 RSI 함수 input인 length에 period(12)를 대입
Length = Period;
//Inputs: Length(NumericSimple);
//Variables: Counter(0, data2), DownAmt(0, data2), UpAmt(0, data2), UpSum(0, data2), DownSum(0, data2), UpAvg(0), DownAvg(0);
Variables: Counter(0, data2), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0);
MessageLog("UpAmt: %.2f / %.2f / %.2f / %.f / %.f / %.f / %.f / %.f / %.f", Data2(CurrentBar), index, Data2(index),sDate, Data2(sDate), Data2(sTime), Data2(Time),sTime, Time);
//index:695
If Data2(CurrentBar) > 300
and sTime == 090000
Then
{
If Data2(CurrentBar) == 1 AND Length > 0 Then Begin
UpSum = 0;
DownSum = 0;
For Counter = 0 To Length - 1 Begin
UpAmt = Data2(C[Counter]) - Data2(C[Counter+1]);
If UpAmt >= 0 Then
DownAmt = 0;
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
End;
UpAvg = UpSum / Length;
DownAvg = DownSum / Length;
End
Else
If Data2(CurrentBar) > 1 AND Length > 0 Then Begin
UpAmt = Data2(C[0]) - Data2(C[1]);
If UpAmt >= 0 Then
DownAmt = 0;
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
//MessageLog("UpAmt: %.2f / %.2f / %.2f / %.2f" , UpAmt, DownAmt);
UpAvg = (UpAvg[1] * (Length - 1) + UpAmt) / Length;
DownAvg = (DownAvg[1] * (Length - 1) + DownAmt) / Length;
//MessageLog("UpAmt: %.2f / %.2f / %.2f / %.2f" , UpAmt, DownAmt, upAvg, DownAvg);
End;
If UpAvg + DownAvg <> 0 Then
Relative = 100 * UpAvg / (UpAvg + DownAvg);
Else
Relative = 0;
//MessageLog("UpAmt: %.2f / %.2f / %.2f / %f", upAvg, DownAvg, Relative, sTime);
// data2는 반드기 일 차트여야 함.
If Data2(DataCompress) != 3
Then
Relative = 0;
}
Else
{
Relative = 0;
}
Plot1(Relative, "RSI_data2");
- 1. 50669_rsi.jpg (0.06 MB)
답변 1
예스스탁 예스스탁 답변
2012-04-23 14:40:40
안녕하세요
예스스탁입니다.
참조데이터로 일봉을 추가하신 상태에서
사용하시면 단지 수식에서 아래와 같이 작성해서
사용하시면 됩니다.
input : Period(9);
plot1(data2(RSI(Period)));
다만 수식에서는 완성된 봉까지만을
이용하므로 당일 일봉은 계산에 포함되지 않습니다.
참조데이터는 항상 완성된 봉까지만 계산을 하므로
당일 봉을 사용할 수 없기때문에
아래와 같이 참조데이터로 일봉을 추가하는 것 없이 사용하기 위해서
분봉차트에서 분봉데이터를 이용해 일봉의 지표를 풀어서 작성하는 내용입니다.
참조데이터 없이 사용하시면 됩니다.
Inputs: Period(9);
Variables: Counter(0), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0), RSIv(0);
var : Dindex(0), PreUpAvg(0), preDownAvg(0);
if date <> date[1] then {
Dindex = dindex + 1;
PreUpAvg = UpAvg[1];
preDownAvg = DownAvg[1];
}
If CurrentBar > 1 AND Period > 0 Then {
UpAmt = dayClose(0)-dayClose(1);
If UpAmt >= 0 Then
DownAmt = 0;
Else {
DownAmt = -UpAmt;
UpAmt = 0;
}
if Dindex <=1 Then {
UpAvg = 1;
DownAvg = 1;
}
Else {
UpAvg = (PreUpAvg * (Period - 1) + UpAmt) / Period;
DownAvg = (preDownAvg * (Period - 1) + DownAmt) / Period;
}
}
If UpAvg + DownAvg <> 0 Then
RSIv = 100 * UpAvg / (UpAvg + DownAvg);
Else
RSIv = 0;
plot1(RSIv,"RSI");
PlotBaseLine1(30, "기준선 30", gray);
PlotBaseLine2(70, "기준선 70", gray);
즐거운 하루되세요
> WT_nazilo75 님이 쓴 글입니다.
> 제목 : 다중 주기 관련 문의
> 안녕하세요.
선물 60분봉 차트에서 선물 1일봉 차트의 값을 참조 하려 합니다.
종목추가로 1일봉 차트 추가 및 참조는 하고 있는데 추가한 1일봉 차트 기준의 지표값을 만들면서 구현이 안되고 있네요..
종목추가한 1일봉 차트 기준 RSI(12)를 만드려는데 다른 글들을 보니 함수를 다 풀어서 작성 해야 한다고 되어 있길래 RSI를 모두 풀어서 새로 정의 하고 있습니다.
실행 결과 별개 1일봉 차트에 추가한 RSI 지표와 같이 틀리게 나오길래 원인을 찾아보니 60분봉 기준으로 1일봉당 8개의 봉이 나오는데 이중에 첫번째 봉에서만 실행을 해야 겠는데 방법 좀 알려 주세요~
Data2(sTime), sTime 을 비교해 보니 090000 값이 data2에서는 8개 모두 090000으로 나오는데 60분 봉에서는 두개가 나와서 하루에 두번씩 실행이 되니 값이 틀려 지네요.. ㅜㅜ
index를 찍어 보니 index는 60분봉 기준으로 계속 올라가도 Data2(index)는 일봉기준으로 값이 변하는걸 보니 처음 바뀌는 부분을 알아내는 방법이 있을거 같은데 말이죠.. @.,@
아래는 구현 함수 입니다.
---------------------------------------------
Input : Period(12) ;
var : Relative(0, data2); // RSI의 반환값
var : Length(0, data2); // 원 RSI함수의 input
// 원 RSI 함수 input인 length에 period(12)를 대입
Length = Period;
//Inputs: Length(NumericSimple);
//Variables: Counter(0, data2), DownAmt(0, data2), UpAmt(0, data2), UpSum(0, data2), DownSum(0, data2), UpAvg(0), DownAvg(0);
Variables: Counter(0, data2), DownAmt(0), UpAmt(0), UpSum(0), DownSum(0), UpAvg(0), DownAvg(0);
MessageLog("UpAmt: %.2f / %.2f / %.2f / %.f / %.f / %.f / %.f / %.f / %.f", Data2(CurrentBar), index, Data2(index),sDate, Data2(sDate), Data2(sTime), Data2(Time),sTime, Time);
//index:695
If Data2(CurrentBar) > 300
and sTime == 090000
Then
{
If Data2(CurrentBar) == 1 AND Length > 0 Then Begin
UpSum = 0;
DownSum = 0;
For Counter = 0 To Length - 1 Begin
UpAmt = Data2(C[Counter]) - Data2(C[Counter+1]);
If UpAmt >= 0 Then
DownAmt = 0;
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
UpSum = UpSum + UpAmt;
DownSum = DownSum + DownAmt;
End;
UpAvg = UpSum / Length;
DownAvg = DownSum / Length;
End
Else
If Data2(CurrentBar) > 1 AND Length > 0 Then Begin
UpAmt = Data2(C[0]) - Data2(C[1]);
If UpAmt >= 0 Then
DownAmt = 0;
Else Begin
DownAmt = -UpAmt;
UpAmt = 0;
End;
//MessageLog("UpAmt: %.2f / %.2f / %.2f / %.2f" , UpAmt, DownAmt);
UpAvg = (UpAvg[1] * (Length - 1) + UpAmt) / Length;
DownAvg = (DownAvg[1] * (Length - 1) + DownAmt) / Length;
//MessageLog("UpAmt: %.2f / %.2f / %.2f / %.2f" , UpAmt, DownAmt, upAvg, DownAvg);
End;
If UpAvg + DownAvg <> 0 Then
Relative = 100 * UpAvg / (UpAvg + DownAvg);
Else
Relative = 0;
//MessageLog("UpAmt: %.2f / %.2f / %.2f / %f", upAvg, DownAvg, Relative, sTime);
// data2는 반드기 일 차트여야 함.
If Data2(DataCompress) != 3
Then
Relative = 0;
}
Else
{
Relative = 0;
}
Plot1(Relative, "RSI_data2");