커뮤니티
문의드립니다.
2017-11-02 12:41:02
190
글번호 113839
덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
5분봉기준
지표는 30분
진입
-30분차트에서 40볼린저밴드 중앙선 상향돌파시 매수진입
-40볼린저밴드 상단선 상향돌파시 추가진입
청산
-40볼린저밴드 상단선 하향돌파시 추가진입분 청산
-40이평 하향돌파시 청산
필터
60bandwidth 기울기(변동률,전보다 높으면 1 낮으면 0) 하향시(0일시) 진입하지 않음
2. 시스템
5분봉
지표는 30분
밴드폭이 n이하라면
진입1
볼린저밴드 표준편차 1.8 기준 종가가 하단선을 하향돌파하면 매수진입
청산1
조건 1
표준편차 1.8기준 종가가 상단선을 상향돌파하면 진입 1 청산
조건2
진입1한 상태에서 진입시점 밴드폭보다 밴드폭이 x%늘어나면 조건1 청산하고 매도진입으로 바꿈
청산2
조건2를 통해 매수진입이나 매도진입이 바뀐 상태에서는 청산 조건을 이평선으로 바꿈(매수라면 하향돌파, 매도라면 상향돌파)
진입 2
조건3
밴드폭이 n이하라면 표준편차 1.8기준 종가가 상향돌파하면 매도진입
조건3 상태에서 밴드폭보다 밴드폭이 x%늘어나면 조건3 청산하고 매수진입으로 바꿈.
바뀐 경우 청산기준은 청산2를 따름
3. 시스템
5분봉기준
30분봉지표
5일 이평이 20이평 상향돌파 진입
조건1 전거래가 수익이면 n개봉간 진입금지
조건2 진입은 안했지만 진입가정 손실거래가 3회 생겼으면 포지션 2배
4. 지표
5분봉기준
30분봉 볼린저밴드 밴드폭
5. 시스템
진입
5일 이평이 20이평 돌파 진입
청산
5일 이평이 20이평 하향돌파 청산
-진입 수익률이 n%가 되면 n개봉간 진입금지
-손실거래가 3회가 되면 진입포지션 수량 1.5배진입
답변 5
예스스탁 예스스탁 답변
2017-11-02 15:51:10
안녕하세요
예스스탁입니다.
1.
input : 타주기분(30),P(40),Dv(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),BWid(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
BWid = ((BBup - BBdn)/ BBmd);
if crossup(c,bbmd) and BWid > BWid[1] Then
buy("b1");
if MarketPosition ==1 Then
{
if MaxEntries == 1 and crossup(C,bbup) and BWid > BWid[1] Then
buy("b2");
if CrossDown(c,bbup) Then
ExitLong("bx2",OnClose,def,"b2");
if CrossDown(c,bbmd) Then
ExitLong("bx1",OnClose,def,"b1");
}
}
}
2
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
3
수식에서 거래를 가상으로 체크해서 제어하는 부분은
식작성에 시간도 많이 소모되고
차트의 봉갯수 제한으로 매일 신호가 다르게 발생할수 있는 여지가 많아
저희 쪽에서는 따로 식을 작성해 드리지 않습니다.
이용에 참고하시기 바랍니다.
4
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
plot1(diff);
}
}
5
input : 기본수량(2),per(20),n(10);
var1 = ma(c,5);
var2 = ma(C,20);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
if var3 >= 0 Then
var4 = 0;
Else
var4 = var4+1;
}
if MarketPosition == 0 and crossup(var1,var2) Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b",OnClose,def,iff(var4 < 2,기본수량,Floor(기본수량*1.5)));
}
if CrossDown(var1,var2) Then{
exitlong("bx");
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
5분봉기준
지표는 30분
진입
-30분차트에서 40볼린저밴드 중앙선 상향돌파시 매수진입
-40볼린저밴드 상단선 상향돌파시 추가진입
청산
-40볼린저밴드 상단선 하향돌파시 추가진입분 청산
-40이평 하향돌파시 청산
필터
60bandwidth 기울기(변동률,전보다 높으면 1 낮으면 0) 하향시(0일시) 진입하지 않음
2. 시스템
5분봉
지표는 30분
밴드폭이 n이하라면
진입1
볼린저밴드 표준편차 1.8 기준 종가가 하단선을 하향돌파하면 매수진입
청산1
조건 1
표준편차 1.8기준 종가가 상단선을 상향돌파하면 진입 1 청산
조건2
진입1한 상태에서 진입시점 밴드폭보다 밴드폭이 x%늘어나면 조건1 청산하고 매도진입으로 바꿈
청산2
조건2를 통해 매수진입이나 매도진입이 바뀐 상태에서는 청산 조건을 이평선으로 바꿈(매수라면 하향돌파, 매도라면 상향돌파)
진입 2
조건3
밴드폭이 n이하라면 표준편차 1.8기준 종가가 상향돌파하면 매도진입
조건3 상태에서 밴드폭보다 밴드폭이 x%늘어나면 조건3 청산하고 매수진입으로 바꿈.
바뀐 경우 청산기준은 청산2를 따름
3. 시스템
5분봉기준
30분봉지표
5일 이평이 20이평 상향돌파 진입
조건1 전거래가 수익이면 n개봉간 진입금지
조건2 진입은 안했지만 진입가정 손실거래가 3회 생겼으면 포지션 2배
4. 지표
5분봉기준
30분봉 볼린저밴드 밴드폭
5. 시스템
진입
5일 이평이 20이평 돌파 진입
청산
5일 이평이 20이평 하향돌파 청산
-진입 수익률이 n%가 되면 n개봉간 진입금지
-손실거래가 3회가 되면 진입포지션 수량 1.5배진입
잡다백수
2017-11-03 02:00:00
코딩감사합니다. 몇가지 헷갈리는 부분 있어서 질문드립니다.
2번의 diff = BBup-bbdn 이 부분은 밴드폭 수식과는 다른 것 같은데 bbmd로 나누면 되는 건지요? 그리고 코딩을 잘 몰라서 여기서 밴드폭이 x%늘어나면 기존 포지션 청산하고 반대 포지션으로 바꾸는 내용이 어느 부분인 지 모르겠습니다. per란 변수도 잘 모르겠습니다. 신호는 최적화를 해봐도 다 b신호 하나 밖에 나오질 않네요.
5번시스템 코딩은 잘 이해가 가지 않아 부연설명 좀 부탁드립니다. 특히 수익률만큼 거래를 중지한다는 부분이 어느 부분인 지 잘 모르겠습니다. per라는 외부변수는 무엇을 의미하는 지도 잘 모르겠습니다.
3번은 조건2가 어렵다면 조건 1만이라도 해서 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
1.
input : 타주기분(30),P(40),Dv(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),BWid(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
BWid = ((BBup - BBdn)/ BBmd);
if crossup(c,bbmd) and BWid > BWid[1] Then
buy("b1");
if MarketPosition ==1 Then
{
if MaxEntries == 1 and crossup(C,bbup) and BWid > BWid[1] Then
buy("b2");
if CrossDown(c,bbup) Then
ExitLong("bx2",OnClose,def,"b2");
if CrossDown(c,bbmd) Then
ExitLong("bx1",OnClose,def,"b1");
}
}
}
2
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
3
수식에서 거래를 가상으로 체크해서 제어하는 부분은
식작성에 시간도 많이 소모되고
차트의 봉갯수 제한으로 매일 신호가 다르게 발생할수 있는 여지가 많아
저희 쪽에서는 따로 식을 작성해 드리지 않습니다.
이용에 참고하시기 바랍니다.
4
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
plot1(diff);
}
}
5
input : 기본수량(2),per(20),n(10);
var1 = ma(c,5);
var2 = ma(C,20);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
if var3 >= 0 Then
var4 = 0;
Else
var4 = var4+1;
}
if MarketPosition == 0 and crossup(var1,var2) Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b",OnClose,def,iff(var4 < 2,기본수량,Floor(기본수량*1.5)));
}
if CrossDown(var1,var2) Then{
exitlong("bx");
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
5분봉기준
지표는 30분
진입
-30분차트에서 40볼린저밴드 중앙선 상향돌파시 매수진입
-40볼린저밴드 상단선 상향돌파시 추가진입
청산
-40볼린저밴드 상단선 하향돌파시 추가진입분 청산
-40이평 하향돌파시 청산
필터
60bandwidth 기울기(변동률,전보다 높으면 1 낮으면 0) 하향시(0일시) 진입하지 않음
2. 시스템
5분봉
지표는 30분
밴드폭이 n이하라면
진입1
볼린저밴드 표준편차 1.8 기준 종가가 하단선을 하향돌파하면 매수진입
청산1
조건 1
표준편차 1.8기준 종가가 상단선을 상향돌파하면 진입 1 청산
조건2
진입1한 상태에서 진입시점 밴드폭보다 밴드폭이 x%늘어나면 조건1 청산하고 매도진입으로 바꿈
청산2
조건2를 통해 매수진입이나 매도진입이 바뀐 상태에서는 청산 조건을 이평선으로 바꿈(매수라면 하향돌파, 매도라면 상향돌파)
진입 2
조건3
밴드폭이 n이하라면 표준편차 1.8기준 종가가 상향돌파하면 매도진입
조건3 상태에서 밴드폭보다 밴드폭이 x%늘어나면 조건3 청산하고 매수진입으로 바꿈.
바뀐 경우 청산기준은 청산2를 따름
3. 시스템
5분봉기준
30분봉지표
5일 이평이 20이평 상향돌파 진입
조건1 전거래가 수익이면 n개봉간 진입금지
조건2 진입은 안했지만 진입가정 손실거래가 3회 생겼으면 포지션 2배
4. 지표
5분봉기준
30분봉 볼린저밴드 밴드폭
5. 시스템
진입
5일 이평이 20이평 돌파 진입
청산
5일 이평이 20이평 하향돌파 청산
-진입 수익률이 n%가 되면 n개봉간 진입금지
-손실거래가 3회가 되면 진입포지션 수량 1.5배진입
예스스탁 예스스탁 답변
2017-11-03 09:57:20
안녕하세요
예스스탁입니다.
1
bandwidth지표가 중심선을 기준으로 %로 값을 리턴합니다.
다른 문의에서는 bandwidth로 지칭하시고
해당문의에서는 한글로 밴드폭이라고 지칭하셔서
일반적으로 사용하는 폭(상단과 하단의 단순 차이값)을 지정하시는줄 알았습니다.
diff = ((BBup - BBdn)/ BBmd);
위와 같이 계산식 변경해 사용하시면 됩니다.
수식에서 아래와 같은 내용이
"진입시점대비 현재의 Bands Width값이 per이상 커지면"
이라는 내용입니다.
diff >= diff[BarsSinceEntry]*(1+per/100)
2
var3이 청산시 수익율 계산식입니다
per가 수익률 지정입니다.
TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n)
위 내용이
직전거래 수익율에 따른 봉수 제어내용입니다.
전체 첫거래이거나 직전거래가 일정(per)수익율 미만이면 봉갯수 제한없이 진입
직전거래가 일정(per)수익율 이상이면 청산후 n개봉 이후에 진입입니다.
3
input : per(20),n(10);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
}
input : Atime1(3),P1(5),P2(20);
var : cnt(0),S1(0),D1(0),TM(0),TF1(0);
var : sum1(0),mav1(0),sum2(0),mav2(0);
var : sum11(0),mav11(0),sum22(0),mav22(0);
Array : C1[50](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF1 = TM%Atime1;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF1 < TF1[1]) Then
{
for cnt = 1 to 49
{
C1[cnt] = C1[cnt-1][1];
}
}
C1[0] = C;
if C1[P2] > 0 then{
sum1 = 0;
sum11 = 0;
sum2 = 0;
sum22 = 0;
for cnt = 0 to P2-1{
if cnt < P1 then{
sum1 = sum1+C1[cnt];
sum11 = sum11+C1[cnt+1];
}
if cnt < P2 then{
sum2 = sum2+C1[cnt];
sum22 = sum22+C1[cnt+1];
}
}
mav1 = sum1/P1;
mav11 = sum11/P1;
mav2 = sum2/P2;
mav22 = sum22/P2;
}
if MarketPosition == 0 and mav1 > mav2 and mav11 < mav22 Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b");
}
if MarketPosition == 1 and mav1 < mav2 and mav11 > mav22 Then{
exitlong("bx");
}
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : Re : Re : 문의드립니다.
> 코딩감사합니다. 몇가지 헷갈리는 부분 있어서 질문드립니다.
2번의 diff = BBup-bbdn 이 부분은 밴드폭 수식과는 다른 것 같은데 bbmd로 나누면 되는 건지요? 그리고 코딩을 잘 몰라서 여기서 밴드폭이 x%늘어나면 기존 포지션 청산하고 반대 포지션으로 바꾸는 내용이 어느 부분인 지 모르겠습니다. per란 변수도 잘 모르겠습니다. 신호는 최적화를 해봐도 다 b신호 하나 밖에 나오질 않네요.
5번시스템 코딩은 잘 이해가 가지 않아 부연설명 좀 부탁드립니다. 특히 수익률만큼 거래를 중지한다는 부분이 어느 부분인 지 잘 모르겠습니다. per라는 외부변수는 무엇을 의미하는 지도 잘 모르겠습니다.
3번은 조건2가 어렵다면 조건 1만이라도 해서 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
1.
input : 타주기분(30),P(40),Dv(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),BWid(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
BWid = ((BBup - BBdn)/ BBmd);
if crossup(c,bbmd) and BWid > BWid[1] Then
buy("b1");
if MarketPosition ==1 Then
{
if MaxEntries == 1 and crossup(C,bbup) and BWid > BWid[1] Then
buy("b2");
if CrossDown(c,bbup) Then
ExitLong("bx2",OnClose,def,"b2");
if CrossDown(c,bbmd) Then
ExitLong("bx1",OnClose,def,"b1");
}
}
}
2
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
3
수식에서 거래를 가상으로 체크해서 제어하는 부분은
식작성에 시간도 많이 소모되고
차트의 봉갯수 제한으로 매일 신호가 다르게 발생할수 있는 여지가 많아
저희 쪽에서는 따로 식을 작성해 드리지 않습니다.
이용에 참고하시기 바랍니다.
4
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
plot1(diff);
}
}
5
input : 기본수량(2),per(20),n(10);
var1 = ma(c,5);
var2 = ma(C,20);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
if var3 >= 0 Then
var4 = 0;
Else
var4 = var4+1;
}
if MarketPosition == 0 and crossup(var1,var2) Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b",OnClose,def,iff(var4 < 2,기본수량,Floor(기본수량*1.5)));
}
if CrossDown(var1,var2) Then{
exitlong("bx");
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
5분봉기준
지표는 30분
진입
-30분차트에서 40볼린저밴드 중앙선 상향돌파시 매수진입
-40볼린저밴드 상단선 상향돌파시 추가진입
청산
-40볼린저밴드 상단선 하향돌파시 추가진입분 청산
-40이평 하향돌파시 청산
필터
60bandwidth 기울기(변동률,전보다 높으면 1 낮으면 0) 하향시(0일시) 진입하지 않음
2. 시스템
5분봉
지표는 30분
밴드폭이 n이하라면
진입1
볼린저밴드 표준편차 1.8 기준 종가가 하단선을 하향돌파하면 매수진입
청산1
조건 1
표준편차 1.8기준 종가가 상단선을 상향돌파하면 진입 1 청산
조건2
진입1한 상태에서 진입시점 밴드폭보다 밴드폭이 x%늘어나면 조건1 청산하고 매도진입으로 바꿈
청산2
조건2를 통해 매수진입이나 매도진입이 바뀐 상태에서는 청산 조건을 이평선으로 바꿈(매수라면 하향돌파, 매도라면 상향돌파)
진입 2
조건3
밴드폭이 n이하라면 표준편차 1.8기준 종가가 상향돌파하면 매도진입
조건3 상태에서 밴드폭보다 밴드폭이 x%늘어나면 조건3 청산하고 매수진입으로 바꿈.
바뀐 경우 청산기준은 청산2를 따름
3. 시스템
5분봉기준
30분봉지표
5일 이평이 20이평 상향돌파 진입
조건1 전거래가 수익이면 n개봉간 진입금지
조건2 진입은 안했지만 진입가정 손실거래가 3회 생겼으면 포지션 2배
4. 지표
5분봉기준
30분봉 볼린저밴드 밴드폭
5. 시스템
진입
5일 이평이 20이평 돌파 진입
청산
5일 이평이 20이평 하향돌파 청산
-진입 수익률이 n%가 되면 n개봉간 진입금지
-손실거래가 3회가 되면 진입포지션 수량 1.5배진입
잡다백수
2017-11-03 15:31:09
코딩감사합니다. 하지만 여전히 헷갈려서 질문드립니다. 아래 코딩을 실행해봤습니다.
변수를 보면 200에 밴드폭 0.05 이하이고 종가도 200볼밴 하단에 있으므로 조건이 됐습니다.
그러나 신호는 발생하지 않고 있습니다. 타주기분 30분차트 설정에 30분차트를 써서 그런 걸까요?
제가 보기엔 타주기분을 30으로 하고 10분 15분 차트로 해도 대부분 신호가 맞질 않습니다.
왜 그런지 몰라서 질문드립니다. kodex200에 적용해봤습니다.
================================================================
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = (BBup-bbdn)/bbmd;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : Re : Re : 문의드립니다.
> 안녕하세요
예스스탁입니다.
1
bandwidth지표가 중심선을 기준으로 %로 값을 리턴합니다.
다른 문의에서는 bandwidth로 지칭하시고
해당문의에서는 한글로 밴드폭이라고 지칭하셔서
일반적으로 사용하는 폭(상단과 하단의 단순 차이값)을 지정하시는줄 알았습니다.
diff = ((BBup - BBdn)/ BBmd);
위와 같이 계산식 변경해 사용하시면 됩니다.
수식에서 아래와 같은 내용이
"진입시점대비 현재의 Bands Width값이 per이상 커지면"
이라는 내용입니다.
diff >= diff[BarsSinceEntry]*(1+per/100)
2
var3이 청산시 수익율 계산식입니다
per가 수익률 지정입니다.
TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n)
위 내용이
직전거래 수익율에 따른 봉수 제어내용입니다.
전체 첫거래이거나 직전거래가 일정(per)수익율 미만이면 봉갯수 제한없이 진입
직전거래가 일정(per)수익율 이상이면 청산후 n개봉 이후에 진입입니다.
3
input : per(20),n(10);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
}
input : Atime1(3),P1(5),P2(20);
var : cnt(0),S1(0),D1(0),TM(0),TF1(0);
var : sum1(0),mav1(0),sum2(0),mav2(0);
var : sum11(0),mav11(0),sum22(0),mav22(0);
Array : C1[50](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF1 = TM%Atime1;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF1 < TF1[1]) Then
{
for cnt = 1 to 49
{
C1[cnt] = C1[cnt-1][1];
}
}
C1[0] = C;
if C1[P2] > 0 then{
sum1 = 0;
sum11 = 0;
sum2 = 0;
sum22 = 0;
for cnt = 0 to P2-1{
if cnt < P1 then{
sum1 = sum1+C1[cnt];
sum11 = sum11+C1[cnt+1];
}
if cnt < P2 then{
sum2 = sum2+C1[cnt];
sum22 = sum22+C1[cnt+1];
}
}
mav1 = sum1/P1;
mav11 = sum11/P1;
mav2 = sum2/P2;
mav22 = sum22/P2;
}
if MarketPosition == 0 and mav1 > mav2 and mav11 < mav22 Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b");
}
if MarketPosition == 1 and mav1 < mav2 and mav11 > mav22 Then{
exitlong("bx");
}
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : Re : Re : 문의드립니다.
> 코딩감사합니다. 몇가지 헷갈리는 부분 있어서 질문드립니다.
2번의 diff = BBup-bbdn 이 부분은 밴드폭 수식과는 다른 것 같은데 bbmd로 나누면 되는 건지요? 그리고 코딩을 잘 몰라서 여기서 밴드폭이 x%늘어나면 기존 포지션 청산하고 반대 포지션으로 바꾸는 내용이 어느 부분인 지 모르겠습니다. per란 변수도 잘 모르겠습니다. 신호는 최적화를 해봐도 다 b신호 하나 밖에 나오질 않네요.
5번시스템 코딩은 잘 이해가 가지 않아 부연설명 좀 부탁드립니다. 특히 수익률만큼 거래를 중지한다는 부분이 어느 부분인 지 잘 모르겠습니다. per라는 외부변수는 무엇을 의미하는 지도 잘 모르겠습니다.
3번은 조건2가 어렵다면 조건 1만이라도 해서 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
1.
input : 타주기분(30),P(40),Dv(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),BWid(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
BWid = ((BBup - BBdn)/ BBmd);
if crossup(c,bbmd) and BWid > BWid[1] Then
buy("b1");
if MarketPosition ==1 Then
{
if MaxEntries == 1 and crossup(C,bbup) and BWid > BWid[1] Then
buy("b2");
if CrossDown(c,bbup) Then
ExitLong("bx2",OnClose,def,"b2");
if CrossDown(c,bbmd) Then
ExitLong("bx1",OnClose,def,"b1");
}
}
}
2
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
3
수식에서 거래를 가상으로 체크해서 제어하는 부분은
식작성에 시간도 많이 소모되고
차트의 봉갯수 제한으로 매일 신호가 다르게 발생할수 있는 여지가 많아
저희 쪽에서는 따로 식을 작성해 드리지 않습니다.
이용에 참고하시기 바랍니다.
4
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
plot1(diff);
}
}
5
input : 기본수량(2),per(20),n(10);
var1 = ma(c,5);
var2 = ma(C,20);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
if var3 >= 0 Then
var4 = 0;
Else
var4 = var4+1;
}
if MarketPosition == 0 and crossup(var1,var2) Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b",OnClose,def,iff(var4 < 2,기본수량,Floor(기본수량*1.5)));
}
if CrossDown(var1,var2) Then{
exitlong("bx");
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
5분봉기준
지표는 30분
진입
-30분차트에서 40볼린저밴드 중앙선 상향돌파시 매수진입
-40볼린저밴드 상단선 상향돌파시 추가진입
청산
-40볼린저밴드 상단선 하향돌파시 추가진입분 청산
-40이평 하향돌파시 청산
필터
60bandwidth 기울기(변동률,전보다 높으면 1 낮으면 0) 하향시(0일시) 진입하지 않음
2. 시스템
5분봉
지표는 30분
밴드폭이 n이하라면
진입1
볼린저밴드 표준편차 1.8 기준 종가가 하단선을 하향돌파하면 매수진입
청산1
조건 1
표준편차 1.8기준 종가가 상단선을 상향돌파하면 진입 1 청산
조건2
진입1한 상태에서 진입시점 밴드폭보다 밴드폭이 x%늘어나면 조건1 청산하고 매도진입으로 바꿈
청산2
조건2를 통해 매수진입이나 매도진입이 바뀐 상태에서는 청산 조건을 이평선으로 바꿈(매수라면 하향돌파, 매도라면 상향돌파)
진입 2
조건3
밴드폭이 n이하라면 표준편차 1.8기준 종가가 상향돌파하면 매도진입
조건3 상태에서 밴드폭보다 밴드폭이 x%늘어나면 조건3 청산하고 매수진입으로 바꿈.
바뀐 경우 청산기준은 청산2를 따름
3. 시스템
5분봉기준
30분봉지표
5일 이평이 20이평 상향돌파 진입
조건1 전거래가 수익이면 n개봉간 진입금지
조건2 진입은 안했지만 진입가정 손실거래가 3회 생겼으면 포지션 2배
4. 지표
5분봉기준
30분봉 볼린저밴드 밴드폭
5. 시스템
진입
5일 이평이 20이평 돌파 진입
청산
5일 이평이 20이평 하향돌파 청산
-진입 수익률이 n%가 되면 n개봉간 진입금지
-손실거래가 3회가 되면 진입포지션 수량 1.5배진입
예스스탁 예스스탁 답변
2017-11-06 17:43:41
안녕하세요
예스스탁입니다.
수식의 배열갯수를 보시면 100으로 지정이 되어 있습니다.
이전봉 값을 100개만 저장한다는 의미입니다.
더 긴기간을 계산하고자 하시면 array의 사이즈와
값을 넘기는 for문의 최종값을 늘려주셔야 합니다.
1번은 수정한 시스템이고
2번은 지표식입니다. 30분봉의 볼밴은 2번식 적용해보서 보시면 됩니다.
1번 시스템
input : 타주기분(30),P(200),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[300](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 299{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = (BBup-bbdn)/bbmd;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
2번 지표
input : 타주기분(30),P(200),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[300](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 299{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = (BBup-bbdn)/bbmd;
plot1(bbup);
plot2(bbdn);
}
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : Re : Re : Re : Re : 문의드립니다.
> 코딩감사합니다. 하지만 여전히 헷갈려서 질문드립니다. 아래 코딩을 실행해봤습니다.
변수를 보면 200에 밴드폭 0.05 이하이고 종가도 200볼밴 하단에 있으므로 조건이 됐습니다.
그러나 신호는 발생하지 않고 있습니다. 타주기분 30분차트 설정에 30분차트를 써서 그런 걸까요?
제가 보기엔 타주기분을 30으로 하고 10분 15분 차트로 해도 대부분 신호가 맞질 않습니다.
왜 그런지 몰라서 질문드립니다. kodex200에 적용해봤습니다.
================================================================
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = (BBup-bbdn)/bbmd;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : Re : Re : 문의드립니다.
> 안녕하세요
예스스탁입니다.
1
bandwidth지표가 중심선을 기준으로 %로 값을 리턴합니다.
다른 문의에서는 bandwidth로 지칭하시고
해당문의에서는 한글로 밴드폭이라고 지칭하셔서
일반적으로 사용하는 폭(상단과 하단의 단순 차이값)을 지정하시는줄 알았습니다.
diff = ((BBup - BBdn)/ BBmd);
위와 같이 계산식 변경해 사용하시면 됩니다.
수식에서 아래와 같은 내용이
"진입시점대비 현재의 Bands Width값이 per이상 커지면"
이라는 내용입니다.
diff >= diff[BarsSinceEntry]*(1+per/100)
2
var3이 청산시 수익율 계산식입니다
per가 수익률 지정입니다.
TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n)
위 내용이
직전거래 수익율에 따른 봉수 제어내용입니다.
전체 첫거래이거나 직전거래가 일정(per)수익율 미만이면 봉갯수 제한없이 진입
직전거래가 일정(per)수익율 이상이면 청산후 n개봉 이후에 진입입니다.
3
input : per(20),n(10);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
}
input : Atime1(3),P1(5),P2(20);
var : cnt(0),S1(0),D1(0),TM(0),TF1(0);
var : sum1(0),mav1(0),sum2(0),mav2(0);
var : sum11(0),mav11(0),sum22(0),mav22(0);
Array : C1[50](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF1 = TM%Atime1;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF1 < TF1[1]) Then
{
for cnt = 1 to 49
{
C1[cnt] = C1[cnt-1][1];
}
}
C1[0] = C;
if C1[P2] > 0 then{
sum1 = 0;
sum11 = 0;
sum2 = 0;
sum22 = 0;
for cnt = 0 to P2-1{
if cnt < P1 then{
sum1 = sum1+C1[cnt];
sum11 = sum11+C1[cnt+1];
}
if cnt < P2 then{
sum2 = sum2+C1[cnt];
sum22 = sum22+C1[cnt+1];
}
}
mav1 = sum1/P1;
mav11 = sum11/P1;
mav2 = sum2/P2;
mav22 = sum22/P2;
}
if MarketPosition == 0 and mav1 > mav2 and mav11 < mav22 Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b");
}
if MarketPosition == 1 and mav1 < mav2 and mav11 > mav22 Then{
exitlong("bx");
}
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : Re : Re : 문의드립니다.
> 코딩감사합니다. 몇가지 헷갈리는 부분 있어서 질문드립니다.
2번의 diff = BBup-bbdn 이 부분은 밴드폭 수식과는 다른 것 같은데 bbmd로 나누면 되는 건지요? 그리고 코딩을 잘 몰라서 여기서 밴드폭이 x%늘어나면 기존 포지션 청산하고 반대 포지션으로 바꾸는 내용이 어느 부분인 지 모르겠습니다. per란 변수도 잘 모르겠습니다. 신호는 최적화를 해봐도 다 b신호 하나 밖에 나오질 않네요.
5번시스템 코딩은 잘 이해가 가지 않아 부연설명 좀 부탁드립니다. 특히 수익률만큼 거래를 중지한다는 부분이 어느 부분인 지 잘 모르겠습니다. per라는 외부변수는 무엇을 의미하는 지도 잘 모르겠습니다.
3번은 조건2가 어렵다면 조건 1만이라도 해서 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
1.
input : 타주기분(30),P(40),Dv(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),BWid(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
BWid = ((BBup - BBdn)/ BBmd);
if crossup(c,bbmd) and BWid > BWid[1] Then
buy("b1");
if MarketPosition ==1 Then
{
if MaxEntries == 1 and crossup(C,bbup) and BWid > BWid[1] Then
buy("b2");
if CrossDown(c,bbup) Then
ExitLong("bx2",OnClose,def,"b2");
if CrossDown(c,bbmd) Then
ExitLong("bx1",OnClose,def,"b1");
}
}
}
2
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
if CrossDown(c,bbdn) and diff < n Then
buy("b");
if CrossDown(c,bbup) and diff < n Then
sell("s");
if MarketPosition == 1 Then{
if IsEntryName("b") == true and CrossUp(c,bbup) Then
exitlong("bx1");
if IsEntryName("b") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
sell("bs");
if IsEntryName("sb") == true and CrossDown(c,bbmd) Then
exitlong("bx2");
}
if MarketPosition == -1 Then{
if IsEntryName("s") == true and CrossDown(c,bbdn) Then
ExitShort("sx1");
if IsEntryName("s") == true and diff >= diff[BarsSinceEntry]*(1+per/100) Then
buy("sb");
if IsEntryName("bs") == true and Crossup(c,bbmd) Then
ExitShort("sx2");
}
}
}
3
수식에서 거래를 가상으로 체크해서 제어하는 부분은
식작성에 시간도 많이 소모되고
차트의 봉갯수 제한으로 매일 신호가 다르게 발생할수 있는 여지가 많아
저희 쪽에서는 따로 식을 작성해 드리지 않습니다.
이용에 참고하시기 바랍니다.
4
input : 타주기분(30),P(40),Dv(1.8),per(30),n(2);
var : S1(0),D1(0),TM(0),TF(0),cnt(0),SumSqrt(0),Stdv(0);
var : sum(0),BBmd(0),Bbup(0),BBdn(0),diff(0);
Array : CC[100](0);
if Bdate != Bdate[1] Then{
S1 = TimeToMinutes(stime);
D1 = sdate;
}
if D1 > 0 then{
if sdate == D1 Then
TM = TimeToMinutes(stime)-S1;
Else
TM = TimeToMinutes(stime)+1440-S1;
TF = TM%타주기분;
if Bdate != Bdate[1] or (Bdate == Bdate[1] and TF < TF[1]) Then{
for cnt = 1 to 99{
CC[cnt] = CC[cnt-1][1];
}
}
CC[0] = C;
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
BBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - BBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
BBup = BBmd + (Dv * Stdv);
BBdn = BBmd - (Dv * Stdv);
diff = BBup-bbdn;
plot1(diff);
}
}
5
input : 기본수량(2),per(20),n(10);
var1 = ma(c,5);
var2 = ma(C,20);
if TotalTrades > TotalTrades[1] Then{
var3 = (ExitPrice(1)-EntryPrice(1))/EntryPrice(1)*100;
if var3 >= 0 Then
var4 = 0;
Else
var4 = var4+1;
}
if MarketPosition == 0 and crossup(var1,var2) Then{
if TotalTrades == 0 or
(TotalTrades >= 1 and var3 < Per ) or
(TotalTrades >= 1 and var3 >= Per and BarsSinceExit(1) >= n) then
buy("b",OnClose,def,iff(var4 < 2,기본수량,Floor(기본수량*1.5)));
}
if CrossDown(var1,var2) Then{
exitlong("bx");
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
5분봉기준
지표는 30분
진입
-30분차트에서 40볼린저밴드 중앙선 상향돌파시 매수진입
-40볼린저밴드 상단선 상향돌파시 추가진입
청산
-40볼린저밴드 상단선 하향돌파시 추가진입분 청산
-40이평 하향돌파시 청산
필터
60bandwidth 기울기(변동률,전보다 높으면 1 낮으면 0) 하향시(0일시) 진입하지 않음
2. 시스템
5분봉
지표는 30분
밴드폭이 n이하라면
진입1
볼린저밴드 표준편차 1.8 기준 종가가 하단선을 하향돌파하면 매수진입
청산1
조건 1
표준편차 1.8기준 종가가 상단선을 상향돌파하면 진입 1 청산
조건2
진입1한 상태에서 진입시점 밴드폭보다 밴드폭이 x%늘어나면 조건1 청산하고 매도진입으로 바꿈
청산2
조건2를 통해 매수진입이나 매도진입이 바뀐 상태에서는 청산 조건을 이평선으로 바꿈(매수라면 하향돌파, 매도라면 상향돌파)
진입 2
조건3
밴드폭이 n이하라면 표준편차 1.8기준 종가가 상향돌파하면 매도진입
조건3 상태에서 밴드폭보다 밴드폭이 x%늘어나면 조건3 청산하고 매수진입으로 바꿈.
바뀐 경우 청산기준은 청산2를 따름
3. 시스템
5분봉기준
30분봉지표
5일 이평이 20이평 상향돌파 진입
조건1 전거래가 수익이면 n개봉간 진입금지
조건2 진입은 안했지만 진입가정 손실거래가 3회 생겼으면 포지션 2배
4. 지표
5분봉기준
30분봉 볼린저밴드 밴드폭
5. 시스템
진입
5일 이평이 20이평 돌파 진입
청산
5일 이평이 20이평 하향돌파 청산
-진입 수익률이 n%가 되면 n개봉간 진입금지
-손실거래가 3회가 되면 진입포지션 수량 1.5배진입
다음글