예스스탁
예스스탁 답변
2024-05-17 10:00:00
안녕하세요
예스스탁입니다.
1
ADX는 과거봉수가 현재값에 영향을 주게 됩니다.
분봉이하 주기에서 일봉값을 그리시면 값의 차이가 있을 수 있습니다.
최대한 많은 봉을 조회해서 적용하시기 바랍니다.
전략실행차트는 최대봉조회갯수가 1만봉입니다.
사용자함수명 : DayADX
반환값형 : 숫자형
input : Length(Numeric);
var : TL(0),TH(0),cnt(0),Dcnt(0),preTRange(0),prePlusDM14(0),MinusDM14(0),TRange1(0),preMinusDM14(0);
Var : Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0),preADX(0);
Var : CummDMI(0), Return(0);
Array : HH[61](0),LL[61](0),CC[61](0),TR[61](0),DMIv[61](0),ADXv[61](0);
Array : DPlus[61](0),DMinus[61](0);
if bdate != bdate[1] Then
{
Dcnt = Dcnt+1;
HH[0] = H;
LL[0] = L;
CC[0] = C;
preTRange = TRange[1];
prePlusDM14 = PlusDM14[1];
preMinusDM14 = MinusDM14[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];
ADXv[cnt] = ADXv[cnt-1][1];
Dplus[cnt] = Dplus[cnt-1][1];
Dminus[cnt] = Dminus[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] = 0;
PlusDM14 = 0;
TRange = 0;
DMinus[0] = 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];
var1 = PlusDM;
var2 = MinusDM;
If var1 >= var2 Then
MinusDM = 0;
If var2 >= var1 Then
PlusDM = 0;
TRange = TRange + TR[Counter];
PlusDM14 = PlusDM14 + PlusDM;
MinusDM14 = MinusDM14 + MinusDM;
}
If TRange <> 0 Then
DPlus[0] = 100 * PlusDM14 / TRange;
Else
DPlus[0] = 0 ;
If TRange <> 0 Then
DMinus[0] = 100 * MinusDM14 / TRange;
Else
DMinus[0] = 0;
If Dplus[0] + Dminus[0] == 0 Then
DMIv[0] = 0;
Else
DMIv[0] = 100 * AbsValue(Dplus[0] - Dminus[0]) / (Dplus[0] + 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];
var1 = PlusDM;
var2 = MinusDM;
If var1 >= var2 Then
MinusDM = 0;
If var2 >= var1 Then
PlusDM = 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[0] = 100 * PlusDM14 / TRange;
Else
DPlus[0] = 0 ;
If TRange <> 0 Then
DMinus[0] = 100 * MinusDM14 / TRange;
Else
DMinus[0] = 0;
If Dplus[0] + Dminus[0] == 0 Then
DMIv[0] = 0;
Else
DMIv[0] = 100 * AbsValue(Dplus[0] - Dminus[0]) / (Dplus[0] + Dminus[0]);
}
If DMIV[Length] == 0 Then{
CummDMI = 0;
for Counter = 0 To Length-1 Begin
if DMiV[counter] > 0 Then
CummDMI = CummDMI + DMIV[Counter];
End;
ADXv[0] = CummDMI / CurrentBar;
}
Else
ADXv[0] = (ADXv[1] * (Length - 1) + DMIv[0]) / Length;
DayADX = ADXv[0];
2
사용자함수명 : DayATR
반환값형 : 숫자형
input : Period(Numeric);
var : sumTR(0),TH(0),TL(0),cnt(0);
sumTR = 0;
for cnt = 0 to Period-1
{
If DayClose(cnt+1) > DayHigh(cnt) then
TH = DayClose(cnt+1);
else
TH = DayHigh(cnt);
If DayClose(cnt+1) < daylow(cnt) then
TL = DayClose(cnt+1);
else
TL = daylow(cnt);
sumTR = sumTR + (TH-TL);
}
DayATR = sumTR/Period;
3
사용자함수명 : DayBandWidth
반환값형 : 숫자형
input : Period(Numeric),Dv(Numeric);
var : sum(0),cnt(0),mav(0),SumSqrt(0),Stdv(0);
var : BBup(0),BBdn(0),Counter(0);
If DayClose(Period) > 0 Then
{
#일봉 이동평균 계산
sum = 0;
for cnt = 0 to Period-1{
sum = sum + DayClose(cnt);
}
mav = sum/Period;
#표준편차 계산
SumSqrt = 0;
For Counter = 0 To Period - 1 {
SumSqrt = SumSqrt + (DayClose(Counter) - mav)^2;
}
Stdv = SquareRoot(SumSqrt / Period);
# 일봉 볼린져밴드 계산
BBup = mav + (Dv * Stdv);
BBdn = mav - (Dv * Stdv);
DayBandWidth = (BBup - BBdn)/ mav*100;
}
4
해당 수식에서 각 선을 크로스 할때 값은 아래와 같습니다.
(지지2는 1, 지지1은 2, 피봇은 3, 저장1은 4,저항2는 5)
매도식이 현재크로스가 된 선과 관계없이
직전 크로스가 3(피봇)이고 전전은 2(지지1)일때 발생하게 됩니다.
해당식 적용해 보았지만 피봇크로스에만 신호가 발생하지는 않습니다.
직전이 피봇크로스이고 전전이 지지1 크로스이면
저항1이나 저항2를 돌파할때도 신호가 발생합니다.
또한 해당식이 당일만 기준으로 하지는 않습니다
만약 당일움직임 기준이면 수식 상단에 아래 내용 추가해야 합니다.
Var : Pv(0),R1(0),R2(0),S1(0),S2(0);
var : T(0),T1(0),T2(0),T3(0);
Pv = (HighD(1)+LowD(1)+CloseD(1))/3;
R1 = 2*Pv-LowD(1);
R2 = Pv+HighD(1)-LowD(1);
S1 = 2*Pv-HighD(1);
S2 = Pv-HighD(1)+LowD(1);
if Bdate != Bdate[1] Then
{
T = 0;
T1 = 0;
T2 = 0;
t3 = 0;
}
if CrossUp(c,R2) or CrossDown(c,R2) Then
{
T = 5;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,R1) or CrossDown(c,R1) Then
{
T = 4;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,Pv) or CrossDown(c,Pv) Then
{
T = 3;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,S1) or CrossDown(c,S1) Then
{
T = 2;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,S2) or CrossDown(c,S2) Then
{
T = 1;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if T1 == 3 and T2 == 2 Then
Sell();
즐거운 하루되세요
> 돈을잃자 님이 쓴 글입니다.
> 제목 : 안녕하세요
> 1. 일봉에서의 adx값을 리턴하는 사용자함수
2. 일봉에서의 atr값을 리턴하는 사용자함수
3. 일봉에서의 볼밴의 좁아짐 정도값을 리턴하는 사용자 함수
4. 아래는 일전에 짜주신내용인데 선행조건을 만족하지 않아도 그냥 피봇만 크로스업 다운하면
신호가 발생하기도 하네요
Var : Pv(0),R1(0),R2(0),S1(0),S2(0);
var : T(0),T1(0),T2(0),T3(0);
Pv = (HighD(1)+LowD(1)+CloseD(1))/3;
R1 = 2*Pv-LowD(1);
R2 = Pv+HighD(1)-LowD(1);
S1 = 2*Pv-HighD(1);
S2 = Pv-HighD(1)+LowD(1);
if CrossUp(c,R2) or CrossDown(c,R2) Then
{
T = 5;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,R1) or CrossDown(c,R1) Then
{
T = 4;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,Pv) or CrossDown(c,Pv) Then
{
T = 3;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,S1) or CrossDown(c,S1) Then
{
T = 2;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if CrossUp(c,S2) or CrossDown(c,S2) Then
{
T = 1;
T1 = T[1];
T2 = T1[1];
T3 = T2[1];
}
if T1 == 3 and T2 == 2 Then
Sell();
항상 감사합니다 ^^