커뮤니티
배열에서 1분봉에서 30분봉으로 쓰는 방법중 수식이해 안되서
2011-10-07 08:56:19
520
글번호 43434
트레이드스테이션에서 1분봉에서 30분봉을 참고하는 수식입니다
ts에선 mod(TimeToMinutes(time),30)=0 이렇게 표현 한것을 예스에서는
var1 = TimeToMinutes(stime)%TT;
if dayindex == 0 or (var1 < var1[1] and stime > stime[1]) Then{
라고 했던데 그럼 1분봉에서 30분봉만 배열에 저장해야 되는데 예스 로직에서 그런 의미를 나타내는 수식이 어떤건가요
예스로직상으로는 1분마다 30분봉이 다 배열에 저장되는것 같던데
{30분봉MACD300-650-225}
input: LLEmaLen(300), LLmacd1(300), LLmacd2(650), LLmacd3(225);
var : LLemaV(0), LLmacdV(0), LLmacdS(0), LLmacdOsc(0);
{#3분봉의 5이평 계산}
input : P1(60); {#3분봉의 5이동평균}
var : stime(0),cnt(0),count(0),sum1(0),mav1(0),bearmarket(0),bullmarket(0),Factor(0),XAvPrice(0);
Array : CC[60](0);
print(date:0:0," ",time:0:0," 0TimeToMinutes(time) ",TimeToMinutes(time):0:0," ",stime:0:0,
" C of data2 ",C of data2);
if TimeToMinutes(time)= 0 or TimeToMinutes(time) <0 then
stime = 0
else if mod(TimeToMinutes(time),30)=0 or time =2359 then begin
stime = time;
for cnt =1 to 60 begin
CC[cnt] = CC[cnt-1][1];{현재봉의 CC[0]은 아래 정의하므로 전 1분봉의 값을 대입,CC[0]으로 해도 무관}
end;
CC[0] = C of data2;
print(date:0:0," ",time:0:0," 0TimeToMinutes(time) ",TimeToMinutes(time):0:0," ",stime:0:0, " 1LemaV300 ",LemaV:0:0,
" C of data2 ",C of data2," CC[0] ",CC[0]:0:0," CC[1] ",CC[1]:0:0);
for count = 0 to 59 begin
{ If LLEmaLen + 1 <> 0 Then Begin
If CurrentBar <= 1 Then Begin
Factor = 2 / (LLEmaLen + 1);
XAvPrice = CC[count];
End
Else
XAvPrice = Factor * CC[count] + (1 - Factor) * XAvPrice[1];
End;}
{ LLemaV = XAvPrice;
{LLemaV = Round(XAverage(CC[count],LLEmaLen),1);}
LLMacdV = macd(CC[count],LLmacd1,LLmacd2);
LLMacdS = XAverage(LLMacdV,LLmacd3);
LLMacdOsc = LLMacdV-LLMacdS;
print(date:0:0," ",time:0:0," stime ",stime:0:0, " count ",count:0:0," 2LLemaV300 ",LLemaV:0:0," CC[count] ",CC[count]:1:3,
" XAvPrice[1] ",XAvPrice[1]:5:3,
" LLMacdV ",LLMacdV:5:3," LLMacdS ",LLMacdS:1:3,
" LLMacdOsc ",LLMacdOsc,
" C of data2 ",C of data2,
" CC[count]",CC[count],
" CC[1]",CC[1]);}
end;
end;
안녕하세요
예스스탁입니다.
input : TT(30),Length(14);
var : TL(0),TH(0),cnt(0),Dcnt(0),preTRange(0),prePlusDM14(0),DMinus(0),MinusDM14(0),TRange1(0),preMinusDM14(0);
Variables: Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0),Dplus(0),preADX(0),ADXv(0);
Array : HH[61](0),LL[61](0),CC[61](0),TR[61](0),DMIv[61](0);
var1 = TimeToMinutes(stime)%TT; <-----(나눈값이 영이 되야 되지 않나요?)
<---아래식은 var1이 만족하는경우만 돌아야 될것 같은데 그런수식이 없는데 어찌 이해해야 하난요?
단순히 날짜가 바뀌경우만 저장하라면 1분봉에서 30분봉 참조시 각 1분마다
30분봉의 데이타를 배열에 저장하는꼴이 될것 같은데요?
if dayindex == 0 or (var1 < var1[1] and stime > stime[1]) Then{
Dcnt = Dcnt+1;
HH[0] = H;
LL[0] = L;
CC[0] = C;
preTRange = TRange[1];
prePlusDM14 = PlusDM14[1];
preMinusDM14 = MinusDM14[1];
preADX = ADXv[1];
for cnt = 1 to 60{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
TR[cnt] = TR[cnt-1][1];
DMIv[cnt] = DMIv[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if CC[1] > 0 Then{
If CC[1] > HH[0] then
TH = CC[1];
else
TH = HH[0];
If CC[1] < LL[0] then
TL = CC[1];
else
TL = LL[0];
TR[0] = TH-TL;
}
If Dcnt == Length+1 Then {
MyRange = Length;
DPlus = 0;
PlusDM14 = 0;
TRange = 0;
DMinus = 0;
MinusDM14 = 0;
TRange1 = 0;
For Counter = 0 To MyRange - 1 {
If HH[Counter] - HH[Counter+1] < 0 Then
PlusDM = 0 ;
Else
PlusDM = HH[Counter] - HH[Counter+1];
If LL[Counter+1] - LL[Counter] < 0 Then
MinusDM = 0;
Else
MinusDM = LL[Counter+1] - LL[Counter];
If MinusDM >= PlusDM Then
PlusDM = 0;
If PlusDM >= MinusDM Then
MinusDM = 0;
TRange = TRange + TR[Counter];
PlusDM14 = PlusDM14 + PlusDM;
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
DPlus = 100 * PlusDM14 / TRange;
Else
DPlus = 0 ;
If TRange <> 0 Then
DMinus = 100 * MinusDM14 / TRange;
Else
DMinus = 0;
}
Else If Dcnt > Length+1 Then {
If HH[0] - HH[1] < 0 Then
PlusDM = 0;
Else
PlusDM = HH[0] - HH[1];
If LL[1] - LL[0] < 0 Then
MinusDM = 0;
Else
MinusDM = LL[1] - LL[0];
If MinusDM >= PlusDM Then
PlusDM = 0;
If PlusDM >= MinusDM Then
MinusDM = 0 ;
If MyRange > 0 Then {
TRange = preTRange - (preTRange / MyRange) + TR[0];
PlusDM14 = prePlusDM14 - (prePlusDM14 / MyRange) + PlusDM;
MinusDM14 = preMinusDM14 - (preMinusDM14 / MyRange) + MinusDM;
}
If TRange <> 0 Then
DPlus = 100 * PlusDM14 / TRange;
Else
DPlus = 0 ;
If TRange <> 0 Then
DMinus = 100 * MinusDM14 / TRange;
Else
DMinus = 0;
}
If DPlus + DMinus == 0 Then
DMIv[0] = 0;
Else
DMIv[0] = 100 * Abs(DPlus - DMinus) / (DPlus + DMinus);
Variables: CummDMI(0), Return(0);
Return = 0;
If dcnt >= Length AND Length > 0 Then Begin
If CurrentBar < Length+1 Then begin
CummDMI = 0;
for Counter = 0 To CurrentBar - 1 Begin
CummDMI = CummDMI + DMIV[Counter];
End;
Return = CummDMI / CurrentBar;
End
Else
Return = (preADX[1] * (Length - 1) + DMIv[0]) / Length;
End;
ADXv = Return;
plot1(ADXv);
plot2(Dplus);
plot3(Dminus);
즐거운 하루되세요
> 대뽀12 님이 쓴 글입니다.
> 제목 : 5분봉에서 30분봉 지표를 볼수있는 수식을 부탁드립니다
> 안녕하세요.
5분봉이나 10분봉 차트에서 30분봉 상 adx 지표를 볼수 있는 수식좀 부탁드립니다
답변 1
예스스탁 예스스탁 답변
2011-10-07 15:20:29
안녕하세요
예스스탁입니다.
mod(TimeToMinutes(time),30)와 TimeToMinutes(stime)%30은 같은 계산식입니다.
예스랭귀지에서도 mod(TimeToMinutes(time),30)로 작성하셔도 됩니다.
다만 1분봉에서 30분봉의 시작봉을 TimeToMinutes(stime)%30 == 0으로 표현하지 않은 이유는
mod(TimeToMinutes(time),30)와 TimeToMinutes(stime)%30은
1분봉에서 00분이나 30분에 0으로 시작해서 29분에 29, 59분에 29까지 값을 가지고
다시 0으로 됩니다.
0-1-2-3--~~~~~~27-28-29- 0-1-2-~~~~
1분봉에서 0값이 나오는 봉이 30분 봉과 00분 봉입니다.
9시 29분--> 9시 30분봉 이라면
29 --> 0으로 값이 변경이 되겠지만
만약 거래가 없어 9시 30분봉이 만들어지 지지않고 바로 9시 31분봉으로 간다면
29 --> 1로 변경이 되므로
mod(TimeToMinutes(time),30)=0와 같이 작성된 수식은 해당 구간 인지하지 못하고
이전의 30분 구간과 현재 30분 구간을 하나로 인식하게 됩니다.
그래서 수식을 아래와 같이 표현해서
if dayindex == 0 or (var1 < var1[1] and stime > stime[1]) Then
직전봉 대비 시간이 증가했지만 TimeToMinutes(stime)%30 값은 감소한 봉을
30분봉의 시작봉으로 인식하도록 작성해서
시간의 공백이 있어도 해당 부분을 최대한 커버하게 작성한 것입니다.
위 내용으로 첫봉은 지정이 되지 않으므로 or조건으로 dayindex == 0을 추가한 것입니다.
식 작성에 참고하시기 바랍니다.
즐거운 하루되세요
> 날으는여우 님이 쓴 글입니다.
> 제목 : 배열에서 1분봉에서 30분봉으로 쓰는 방법중 수식이해 안되서
> 트레이드스테이션에서 1분봉에서 30분봉을 참고하는 수식입니다
ts에선 mod(TimeToMinutes(time),30)=0 이렇게 표현 한것을 예스에서는
var1 = TimeToMinutes(stime)%TT;
if dayindex == 0 or (var1 < var1[1] and stime > stime[1]) Then{
라고 했던데 그럼 1분봉에서 30분봉만 배열에 저장해야 되는데 예스 로직에서 그런 의미를 나타내는 수식이 어떤건가요
예스로직상으로는 1분마다 30분봉이 다 배열에 저장되는것 같던데
{30분봉MACD300-650-225}
input: LLEmaLen(300), LLmacd1(300), LLmacd2(650), LLmacd3(225);
var : LLemaV(0), LLmacdV(0), LLmacdS(0), LLmacdOsc(0);
{#3분봉의 5이평 계산}
input : P1(60); {#3분봉의 5이동평균}
var : stime(0),cnt(0),count(0),sum1(0),mav1(0),bearmarket(0),bullmarket(0),Factor(0),XAvPrice(0);
Array : CC[60](0);
print(date:0:0," ",time:0:0," 0TimeToMinutes(time) ",TimeToMinutes(time):0:0," ",stime:0:0,
" C of data2 ",C of data2);
if TimeToMinutes(time)= 0 or TimeToMinutes(time) <0 then
stime = 0
else if mod(TimeToMinutes(time),30)=0 or time =2359 then begin
stime = time;
for cnt =1 to 60 begin
CC[cnt] = CC[cnt-1][1];{현재봉의 CC[0]은 아래 정의하므로 전 1분봉의 값을 대입,CC[0]으로 해도 무관}
end;
CC[0] = C of data2;
print(date:0:0," ",time:0:0," 0TimeToMinutes(time) ",TimeToMinutes(time):0:0," ",stime:0:0, " 1LemaV300 ",LemaV:0:0,
" C of data2 ",C of data2," CC[0] ",CC[0]:0:0," CC[1] ",CC[1]:0:0);
for count = 0 to 59 begin
{ If LLEmaLen + 1 <> 0 Then Begin
If CurrentBar <= 1 Then Begin
Factor = 2 / (LLEmaLen + 1);
XAvPrice = CC[count];
End
Else
XAvPrice = Factor * CC[count] + (1 - Factor) * XAvPrice[1];
End;}
{ LLemaV = XAvPrice;
{LLemaV = Round(XAverage(CC[count],LLEmaLen),1);}
LLMacdV = macd(CC[count],LLmacd1,LLmacd2);
LLMacdS = XAverage(LLMacdV,LLmacd3);
LLMacdOsc = LLMacdV-LLMacdS;
print(date:0:0," ",time:0:0," stime ",stime:0:0, " count ",count:0:0," 2LLemaV300 ",LLemaV:0:0," CC[count] ",CC[count]:1:3,
" XAvPrice[1] ",XAvPrice[1]:5:3,
" LLMacdV ",LLMacdV:5:3," LLMacdS ",LLMacdS:1:3,
" LLMacdOsc ",LLMacdOsc,
" C of data2 ",C of data2,
" CC[count]",CC[count],
" CC[1]",CC[1]);}
end;
end;
안녕하세요
예스스탁입니다.
input : TT(30),Length(14);
var : TL(0),TH(0),cnt(0),Dcnt(0),preTRange(0),prePlusDM14(0),DMinus(0),MinusDM14(0),TRange1(0),preMinusDM14(0);
Variables: Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0),Dplus(0),preADX(0),ADXv(0);
Array : HH[61](0),LL[61](0),CC[61](0),TR[61](0),DMIv[61](0);
var1 = TimeToMinutes(stime)%TT; <-----(나눈값이 영이 되야 되지 않나요?)
<---아래식은 var1이 만족하는경우만 돌아야 될것 같은데 그런수식이 없는데 어찌 이해해야 하난요?
단순히 날짜가 바뀌경우만 저장하라면 1분봉에서 30분봉 참조시 각 1분마다
30분봉의 데이타를 배열에 저장하는꼴이 될것 같은데요?
if dayindex == 0 or (var1 < var1[1] and stime > stime[1]) Then{
Dcnt = Dcnt+1;
HH[0] = H;
LL[0] = L;
CC[0] = C;
preTRange = TRange[1];
prePlusDM14 = PlusDM14[1];
preMinusDM14 = MinusDM14[1];
preADX = ADXv[1];
for cnt = 1 to 60{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
TR[cnt] = TR[cnt-1][1];
DMIv[cnt] = DMIv[cnt-1][1];
}
}
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
CC[0] = C;
if CC[1] > 0 Then{
If CC[1] > HH[0] then
TH = CC[1];
else
TH = HH[0];
If CC[1] < LL[0] then
TL = CC[1];
else
TL = LL[0];
TR[0] = TH-TL;
}
If Dcnt == Length+1 Then {
MyRange = Length;
DPlus = 0;
PlusDM14 = 0;
TRange = 0;
DMinus = 0;
MinusDM14 = 0;
TRange1 = 0;
For Counter = 0 To MyRange - 1 {
If HH[Counter] - HH[Counter+1] < 0 Then
PlusDM = 0 ;
Else
PlusDM = HH[Counter] - HH[Counter+1];
If LL[Counter+1] - LL[Counter] < 0 Then
MinusDM = 0;
Else
MinusDM = LL[Counter+1] - LL[Counter];
If MinusDM >= PlusDM Then
PlusDM = 0;
If PlusDM >= MinusDM Then
MinusDM = 0;
TRange = TRange + TR[Counter];
PlusDM14 = PlusDM14 + PlusDM;
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
DPlus = 100 * PlusDM14 / TRange;
Else
DPlus = 0 ;
If TRange <> 0 Then
DMinus = 100 * MinusDM14 / TRange;
Else
DMinus = 0;
}
Else If Dcnt > Length+1 Then {
If HH[0] - HH[1] < 0 Then
PlusDM = 0;
Else
PlusDM = HH[0] - HH[1];
If LL[1] - LL[0] < 0 Then
MinusDM = 0;
Else
MinusDM = LL[1] - LL[0];
If MinusDM >= PlusDM Then
PlusDM = 0;
If PlusDM >= MinusDM Then
MinusDM = 0 ;
If MyRange > 0 Then {
TRange = preTRange - (preTRange / MyRange) + TR[0];
PlusDM14 = prePlusDM14 - (prePlusDM14 / MyRange) + PlusDM;
MinusDM14 = preMinusDM14 - (preMinusDM14 / MyRange) + MinusDM;
}
If TRange <> 0 Then
DPlus = 100 * PlusDM14 / TRange;
Else
DPlus = 0 ;
If TRange <> 0 Then
DMinus = 100 * MinusDM14 / TRange;
Else
DMinus = 0;
}
If DPlus + DMinus == 0 Then
DMIv[0] = 0;
Else
DMIv[0] = 100 * Abs(DPlus - DMinus) / (DPlus + DMinus);
Variables: CummDMI(0), Return(0);
Return = 0;
If dcnt >= Length AND Length > 0 Then Begin
If CurrentBar < Length+1 Then begin
CummDMI = 0;
for Counter = 0 To CurrentBar - 1 Begin
CummDMI = CummDMI + DMIV[Counter];
End;
Return = CummDMI / CurrentBar;
End
Else
Return = (preADX[1] * (Length - 1) + DMIv[0]) / Length;
End;
ADXv = Return;
plot1(ADXv);
plot2(Dplus);
plot3(Dminus);
즐거운 하루되세요
> 대뽀12 님이 쓴 글입니다.
> 제목 : 5분봉에서 30분봉 지표를 볼수있는 수식을 부탁드립니다
> 안녕하세요.
5분봉이나 10분봉 차트에서 30분봉 상 adx 지표를 볼수 있는 수식좀 부탁드립니다
다음글
이전글