커뮤니티
문의드립니다.
2017-12-04 09:31:18
185
글번호 114659
도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
아래 코딩을 쓰면 컴퓨터에 추세선들이 나와서 리소스를 많이 먹는 것 같더라구요. 여기서 매수 매도에 상관없는 내용들은 다 삭제좀 부탁드립니다.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0),TL(0),
date11(0),date12(0),time11(0),time12(0),TL1(0),
date21(0),date22(0),time21(0),time22(0),TL2(0),
date31(0),date32(0),time31(0),time32(0),TL3(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 새로 생긴 것이니까 전저점에서 전고점까지 추세선을 긋는다.
date11 = date[loBar[1]]; //추세선 시작일. 전저점의 날짜
time11 = stime[loBar[1]]; //추세선 시작시간
Value11 = loVal[1]; //추세선 시작가격
date12 = date[hiBar[1]]; //추세선 종료일. 전고점의 날짜
time12 = stime[hiBar[1]]; //추세선 종료시간
Value12 = hiVal[1]; //추세선 종료가격
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
//TL_New는 신규 추세선을 그려주는 함수
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 추가된 게 아니고 바뀐 것이므로 종료일,종료시간,종료가격만 바꿔준다.
date12 = date[hiBar[1]]; //추세선 종료일
time12 = stime[hiBar[1]];
Value12 = hiVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
//TL_SetEnd는 기존추세선의 종료지점을 변경해주는 추세선 함수이다.
//TL_Delete 함수를 써서 직전의 추세선을 지우고 다시 TL_New로 추세선을 추가해도 된다.
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date11 = date[hiBar[1]]; //전저점이 새로이 생긴 것이므로 시작점은 전고점이 된다.
time11 = stime[hiBar[1]];
Value11 = hiVal[1];
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
}
if trnd == upTr and loVal[2] > loVal[1] then
TL_SetColor(TL1,BLUE);
else if trnd == dnTr and hiVal[2] < hiVal[1] then
TL_SetColor(TL1,RED);
else
TL_SetColor(TL1,BLACK);
TL_SetSize(TL1,2);
TL_SetColor(TL2,RED);
TL_SetColor(TL3,BLUE);
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then{
var1 = 1;
value1 = loval[1];
TL1 = Text_New(sdate[lobar[1]],stime[lobar[1]],value1-PriceScale*2,"●");
TL_SetColor(TL,RED);
TL_SetSize(TL,2);
Text_SetStyle(TL1,2,2);
Text_SetColor(TL1,RED);#텍스트 색상
TL= Text_New(sdate[lobar[1]],stime[lobar[1]],L,"상승");
Text_SetColor(TL,RED);#텍스트 색상
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then{
var1 = -1;
value1 = hival[1];
TL2 = Text_New(sdate[hibar[1]],stime[hibar[1]],value1+PriceScale*2,"●");
TL_SetColor(TL,BLUE);
TL_SetSize(TL,2);
Text_SetStyle(TL2,2,2);#텍스트 좌우 상하 정렬
Text_SetColor(TL2,BLUE);#텍스트 색상
TL= Text_New(sdate[hibar[1]],stime[hibar[1]],H,"하락");
Text_SetColor(TL,BLUE);#텍스트 색상
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2. 기타
-타주기 이격도
-분봉에서 일봉 이격도 코딩 부탁드립니다.
3. 시스템
-참조데이터 종가가 볼린저밴드 상단 위에 위치
-본 데이터 종가도 볼린저밴드 상단 위에 위치
-본 데이터 타주기 봉도 볼린저밴드 상단 이에 위치하면 매수
-위 조건 중 하나라도 무너지면 매도
4. 기타
-타주기 MFI
-분봉에서 일봉 MFI
5. 종목검색
최근 20거래일간 상승률 n%를 기록했던 종목
답변 3
예스스탁 예스스탁 답변
2017-12-04 14:00:35
안녕하세요
예스스탁입니다.
1.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
}
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then
{
var1 = 1;
value1 = loval[1];
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then
{
var1 = -1;
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2
input : P(20);
var : cnt(0),sum(0),mav(0),dpt(0);
sum = 0;
for cnt = 0 to P-1{
sum = sum+DayClose(cnt);
}
mav = sum / P;
dpt = C/mav*100;
plot1(dpt);
PlotBaseLine1(100);
3
input : 타주기분(30),P(20),Dv(2);
var : S1(0,data1),D1(0,data1),TM(0,data1),TF(0,data1);
var : cnt(0,data1),SumSqrt(0,data1),Stdv(0,data1);
var : sum(0,data1),BBmd1(0,data1),Bbup1(0,data1),BBdn1(0,data1);
var : TBBmd(0,data1),TBBup(0,data1),TBBdn(0,data1);
var : BBmd2(0,data1),Bbup2(0,data1),BBdn2(0,data1);
Array : CC[100](0,data1);
bbup1 = data1(BollBandUp(P,dv));
bbdn1 = data1(BollBandDown(P,dv));
bbup2 = data2(BollBandUp(P,dv));
bbdn2 = data2(BollBandDown(P,dv));
if data1(Bdate != Bdate[1]) Then{
S1 = data1(TimeToMinutes(stime));
D1 = data1(sdate);
}
if D1 > 0 then{
if data1(sdate == D1) Then
TM = data1(TimeToMinutes(stime)-S1);
Else
TM = data1(TimeToMinutes(stime)+1440-S1);
TF = TM%타주기분;
if data1(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] = data1(C);
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
TBBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - TBBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
TBBup = TBBmd + (Dv * Stdv);
TBBdn = TBBmd - (Dv * Stdv);
if data1(C > BBup1) and data1(C > TBBup) and data2(C>BBup2) Then
buy();
if MarketPosition == 1 and (data1(C<BBup1) or data1(C<TBBup) or data2(C<BBup2)) Then
exitlong();
}
}
4-1 분봉에서 타분봉
Input :Atime(10),Period(14);
var : TF(0),MFIv(0),cnt(0),sum1(0),sum2(0);
Array : HH[100](0),LL[100](0),CC[100](0),Vv[100](0);
Array : val1[100](0),val2[100](0),val3[100](0),val4[100](0);
TF = TimeToMinutes(stime)%Atime;
if dayindex() == 0 or (TF < TF[1] and stime > stime[1]) or stime >= 151500 Then{
HH[0] = H;
LL[0] = L;
VV[0] = 0;
for cnt = 1 to 99{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
val1[cnt] = val1[cnt-1][1];
val2[cnt] = val2[cnt-1][1];
val3[cnt] = val3[cnt-1][1];
val4[cnt] = val4[cnt-1][1];
}
}
CC[0] = C;
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
VV[0] = VV[0]+V;
val1[0] = HH[0] + LL[0] + CC[0];
val4[0] = VV[0] * Val1[0]/ 3;
if val1[0] > val1[1] then
val2[0] = val4[0];
else
val2[0] = 0;
if val1[0] < val1[1] then
val3[0] = val4[0];
else
val3[0] = 0;
if CC[Period-1] > 0 Then{
sum1 = 0;
sum2 = 0;
for cnt = 0 to Period-1{
sum1 = sum1+val2[cnt];
sum2 = sum2+val3[cnt];
}
MFIv = 100 - 100 / (1 + (sum1/sum2));
plot1(MFIv);
PlotBaseLine1(20, "하단기준선");
PlotBaseLine2(80, "상단기준선");
}
4-2 분봉이하에 일봉
input : Period(14);
var : cnt(0),sum1(0),sum2(0),MFIv(0);
sum1 = 0;
sum2 = 0;
for cnt = 0 to Period-1{
if (dayhigh(cnt)+daylow(cnt)+DayClose(cnt)) > (dayhigh(cnt+1)+daylow(cnt+1)+DayClose(cnt+1)) Then
sum1 = sum1 + DayVolume(cnt)*(dayhigh(cnt)+daylow(cnt)+DayClose(cnt))/3;
Else
sum1 = sum1+0;
if (dayhigh(cnt)+daylow(cnt)+DayClose(cnt)) < (dayhigh(cnt+1)+daylow(cnt+1)+DayClose(cnt+1)) Then
sum2 = sum2 + DayVolume(cnt)*(dayhigh(cnt)+daylow(cnt)+DayClose(cnt))/3;
Else
sum2 = sum2+0;
}
MFIv = 100 - 100 / (1 + (sum1 / sum2));
plot1(MFIv);
PlotBaseLine1(20, "하단기준선");
PlotBaseLine2(80, "상단기준선");
5
input : n(25);
var1 =(C-C[1])/C[1]*100;
if countif(var1 >= n,20) >= 1 Then
find(1);
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
아래 코딩을 쓰면 컴퓨터에 추세선들이 나와서 리소스를 많이 먹는 것 같더라구요. 여기서 매수 매도에 상관없는 내용들은 다 삭제좀 부탁드립니다.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0),TL(0),
date11(0),date12(0),time11(0),time12(0),TL1(0),
date21(0),date22(0),time21(0),time22(0),TL2(0),
date31(0),date32(0),time31(0),time32(0),TL3(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 새로 생긴 것이니까 전저점에서 전고점까지 추세선을 긋는다.
date11 = date[loBar[1]]; //추세선 시작일. 전저점의 날짜
time11 = stime[loBar[1]]; //추세선 시작시간
Value11 = loVal[1]; //추세선 시작가격
date12 = date[hiBar[1]]; //추세선 종료일. 전고점의 날짜
time12 = stime[hiBar[1]]; //추세선 종료시간
Value12 = hiVal[1]; //추세선 종료가격
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
//TL_New는 신규 추세선을 그려주는 함수
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 추가된 게 아니고 바뀐 것이므로 종료일,종료시간,종료가격만 바꿔준다.
date12 = date[hiBar[1]]; //추세선 종료일
time12 = stime[hiBar[1]];
Value12 = hiVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
//TL_SetEnd는 기존추세선의 종료지점을 변경해주는 추세선 함수이다.
//TL_Delete 함수를 써서 직전의 추세선을 지우고 다시 TL_New로 추세선을 추가해도 된다.
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date11 = date[hiBar[1]]; //전저점이 새로이 생긴 것이므로 시작점은 전고점이 된다.
time11 = stime[hiBar[1]];
Value11 = hiVal[1];
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
}
if trnd == upTr and loVal[2] > loVal[1] then
TL_SetColor(TL1,BLUE);
else if trnd == dnTr and hiVal[2] < hiVal[1] then
TL_SetColor(TL1,RED);
else
TL_SetColor(TL1,BLACK);
TL_SetSize(TL1,2);
TL_SetColor(TL2,RED);
TL_SetColor(TL3,BLUE);
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then{
var1 = 1;
value1 = loval[1];
TL1 = Text_New(sdate[lobar[1]],stime[lobar[1]],value1-PriceScale*2,"●");
TL_SetColor(TL,RED);
TL_SetSize(TL,2);
Text_SetStyle(TL1,2,2);
Text_SetColor(TL1,RED);#텍스트 색상
TL= Text_New(sdate[lobar[1]],stime[lobar[1]],L,"상승");
Text_SetColor(TL,RED);#텍스트 색상
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then{
var1 = -1;
value1 = hival[1];
TL2 = Text_New(sdate[hibar[1]],stime[hibar[1]],value1+PriceScale*2,"●");
TL_SetColor(TL,BLUE);
TL_SetSize(TL,2);
Text_SetStyle(TL2,2,2);#텍스트 좌우 상하 정렬
Text_SetColor(TL2,BLUE);#텍스트 색상
TL= Text_New(sdate[hibar[1]],stime[hibar[1]],H,"하락");
Text_SetColor(TL,BLUE);#텍스트 색상
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2. 기타
-타주기 이격도
-분봉에서 일봉 이격도 코딩 부탁드립니다.
3. 시스템
-참조데이터 종가가 볼린저밴드 상단 위에 위치
-본 데이터 종가도 볼린저밴드 상단 위에 위치
-본 데이터 타주기 봉도 볼린저밴드 상단 이에 위치하면 매수
-위 조건 중 하나라도 무너지면 매도
4. 기타
-타주기 MFI
-분봉에서 일봉 MFI
5. 종목검색
최근 20거래일간 상승률 n%를 기록했던 종목
잡다백수
2017-12-04 15:52:14
코딩 감사합니다. 다만 2번의 타주기 분봉 이격도 이건 없는 것 같아서 재 문의 드립니다.
2. 기타
-타주기 이격도
-분봉에서 일봉 이격도 코딩 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
1.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
}
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then
{
var1 = 1;
value1 = loval[1];
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then
{
var1 = -1;
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2
input : P(20);
var : cnt(0),sum(0),mav(0),dpt(0);
sum = 0;
for cnt = 0 to P-1{
sum = sum+DayClose(cnt);
}
mav = sum / P;
dpt = C/mav*100;
plot1(dpt);
PlotBaseLine1(100);
3
input : 타주기분(30),P(20),Dv(2);
var : S1(0,data1),D1(0,data1),TM(0,data1),TF(0,data1);
var : cnt(0,data1),SumSqrt(0,data1),Stdv(0,data1);
var : sum(0,data1),BBmd1(0,data1),Bbup1(0,data1),BBdn1(0,data1);
var : TBBmd(0,data1),TBBup(0,data1),TBBdn(0,data1);
var : BBmd2(0,data1),Bbup2(0,data1),BBdn2(0,data1);
Array : CC[100](0,data1);
bbup1 = data1(BollBandUp(P,dv));
bbdn1 = data1(BollBandDown(P,dv));
bbup2 = data2(BollBandUp(P,dv));
bbdn2 = data2(BollBandDown(P,dv));
if data1(Bdate != Bdate[1]) Then{
S1 = data1(TimeToMinutes(stime));
D1 = data1(sdate);
}
if D1 > 0 then{
if data1(sdate == D1) Then
TM = data1(TimeToMinutes(stime)-S1);
Else
TM = data1(TimeToMinutes(stime)+1440-S1);
TF = TM%타주기분;
if data1(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] = data1(C);
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
TBBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - TBBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
TBBup = TBBmd + (Dv * Stdv);
TBBdn = TBBmd - (Dv * Stdv);
if data1(C > BBup1) and data1(C > TBBup) and data2(C>BBup2) Then
buy();
if MarketPosition == 1 and (data1(C<BBup1) or data1(C<TBBup) or data2(C<BBup2)) Then
exitlong();
}
}
4-1 분봉에서 타분봉
Input :Atime(10),Period(14);
var : TF(0),MFIv(0),cnt(0),sum1(0),sum2(0);
Array : HH[100](0),LL[100](0),CC[100](0),Vv[100](0);
Array : val1[100](0),val2[100](0),val3[100](0),val4[100](0);
TF = TimeToMinutes(stime)%Atime;
if dayindex() == 0 or (TF < TF[1] and stime > stime[1]) or stime >= 151500 Then{
HH[0] = H;
LL[0] = L;
VV[0] = 0;
for cnt = 1 to 99{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
val1[cnt] = val1[cnt-1][1];
val2[cnt] = val2[cnt-1][1];
val3[cnt] = val3[cnt-1][1];
val4[cnt] = val4[cnt-1][1];
}
}
CC[0] = C;
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
VV[0] = VV[0]+V;
val1[0] = HH[0] + LL[0] + CC[0];
val4[0] = VV[0] * Val1[0]/ 3;
if val1[0] > val1[1] then
val2[0] = val4[0];
else
val2[0] = 0;
if val1[0] < val1[1] then
val3[0] = val4[0];
else
val3[0] = 0;
if CC[Period-1] > 0 Then{
sum1 = 0;
sum2 = 0;
for cnt = 0 to Period-1{
sum1 = sum1+val2[cnt];
sum2 = sum2+val3[cnt];
}
MFIv = 100 - 100 / (1 + (sum1/sum2));
plot1(MFIv);
PlotBaseLine1(20, "하단기준선");
PlotBaseLine2(80, "상단기준선");
}
4-2 분봉이하에 일봉
input : Period(14);
var : cnt(0),sum1(0),sum2(0),MFIv(0);
sum1 = 0;
sum2 = 0;
for cnt = 0 to Period-1{
if (dayhigh(cnt)+daylow(cnt)+DayClose(cnt)) > (dayhigh(cnt+1)+daylow(cnt+1)+DayClose(cnt+1)) Then
sum1 = sum1 + DayVolume(cnt)*(dayhigh(cnt)+daylow(cnt)+DayClose(cnt))/3;
Else
sum1 = sum1+0;
if (dayhigh(cnt)+daylow(cnt)+DayClose(cnt)) < (dayhigh(cnt+1)+daylow(cnt+1)+DayClose(cnt+1)) Then
sum2 = sum2 + DayVolume(cnt)*(dayhigh(cnt)+daylow(cnt)+DayClose(cnt))/3;
Else
sum2 = sum2+0;
}
MFIv = 100 - 100 / (1 + (sum1 / sum2));
plot1(MFIv);
PlotBaseLine1(20, "하단기준선");
PlotBaseLine2(80, "상단기준선");
5
input : n(25);
var1 =(C-C[1])/C[1]*100;
if countif(var1 >= n,20) >= 1 Then
find(1);
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
아래 코딩을 쓰면 컴퓨터에 추세선들이 나와서 리소스를 많이 먹는 것 같더라구요. 여기서 매수 매도에 상관없는 내용들은 다 삭제좀 부탁드립니다.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0),TL(0),
date11(0),date12(0),time11(0),time12(0),TL1(0),
date21(0),date22(0),time21(0),time22(0),TL2(0),
date31(0),date32(0),time31(0),time32(0),TL3(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 새로 생긴 것이니까 전저점에서 전고점까지 추세선을 긋는다.
date11 = date[loBar[1]]; //추세선 시작일. 전저점의 날짜
time11 = stime[loBar[1]]; //추세선 시작시간
Value11 = loVal[1]; //추세선 시작가격
date12 = date[hiBar[1]]; //추세선 종료일. 전고점의 날짜
time12 = stime[hiBar[1]]; //추세선 종료시간
Value12 = hiVal[1]; //추세선 종료가격
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
//TL_New는 신규 추세선을 그려주는 함수
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 추가된 게 아니고 바뀐 것이므로 종료일,종료시간,종료가격만 바꿔준다.
date12 = date[hiBar[1]]; //추세선 종료일
time12 = stime[hiBar[1]];
Value12 = hiVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
//TL_SetEnd는 기존추세선의 종료지점을 변경해주는 추세선 함수이다.
//TL_Delete 함수를 써서 직전의 추세선을 지우고 다시 TL_New로 추세선을 추가해도 된다.
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date11 = date[hiBar[1]]; //전저점이 새로이 생긴 것이므로 시작점은 전고점이 된다.
time11 = stime[hiBar[1]];
Value11 = hiVal[1];
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
}
if trnd == upTr and loVal[2] > loVal[1] then
TL_SetColor(TL1,BLUE);
else if trnd == dnTr and hiVal[2] < hiVal[1] then
TL_SetColor(TL1,RED);
else
TL_SetColor(TL1,BLACK);
TL_SetSize(TL1,2);
TL_SetColor(TL2,RED);
TL_SetColor(TL3,BLUE);
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then{
var1 = 1;
value1 = loval[1];
TL1 = Text_New(sdate[lobar[1]],stime[lobar[1]],value1-PriceScale*2,"●");
TL_SetColor(TL,RED);
TL_SetSize(TL,2);
Text_SetStyle(TL1,2,2);
Text_SetColor(TL1,RED);#텍스트 색상
TL= Text_New(sdate[lobar[1]],stime[lobar[1]],L,"상승");
Text_SetColor(TL,RED);#텍스트 색상
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then{
var1 = -1;
value1 = hival[1];
TL2 = Text_New(sdate[hibar[1]],stime[hibar[1]],value1+PriceScale*2,"●");
TL_SetColor(TL,BLUE);
TL_SetSize(TL,2);
Text_SetStyle(TL2,2,2);#텍스트 좌우 상하 정렬
Text_SetColor(TL2,BLUE);#텍스트 색상
TL= Text_New(sdate[hibar[1]],stime[hibar[1]],H,"하락");
Text_SetColor(TL,BLUE);#텍스트 색상
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2. 기타
-타주기 이격도
-분봉에서 일봉 이격도 코딩 부탁드립니다.
3. 시스템
-참조데이터 종가가 볼린저밴드 상단 위에 위치
-본 데이터 종가도 볼린저밴드 상단 위에 위치
-본 데이터 타주기 봉도 볼린저밴드 상단 이에 위치하면 매수
-위 조건 중 하나라도 무너지면 매도
4. 기타
-타주기 MFI
-분봉에서 일봉 MFI
5. 종목검색
최근 20거래일간 상승률 n%를 기록했던 종목
예스스탁 예스스탁 답변
2017-12-06 11:09:00
안녕하세요
예스스탁입니다.
input : Atime1(3),P(20);
var : cnt(0),sum1(0),mav1(0),S1(0),D1(0),TM(0),TF1(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[P] > 0 then{
sum1 = 0;
for cnt = 0 to P-1{
sum1 = sum1+C1[cnt];
}
mav1 = sum1/P;
plot1(c/mav1*100);
}
}
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : Re : Re : 문의드립니다.
> 코딩 감사합니다. 다만 2번의 타주기 분봉 이격도 이건 없는 것 같아서 재 문의 드립니다.
2. 기타
-타주기 이격도
-분봉에서 일봉 이격도 코딩 부탁드립니다.
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의드립니다.
>
안녕하세요
예스스탁입니다.
1.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
}
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then
{
var1 = 1;
value1 = loval[1];
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then
{
var1 = -1;
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2
input : P(20);
var : cnt(0),sum(0),mav(0),dpt(0);
sum = 0;
for cnt = 0 to P-1{
sum = sum+DayClose(cnt);
}
mav = sum / P;
dpt = C/mav*100;
plot1(dpt);
PlotBaseLine1(100);
3
input : 타주기분(30),P(20),Dv(2);
var : S1(0,data1),D1(0,data1),TM(0,data1),TF(0,data1);
var : cnt(0,data1),SumSqrt(0,data1),Stdv(0,data1);
var : sum(0,data1),BBmd1(0,data1),Bbup1(0,data1),BBdn1(0,data1);
var : TBBmd(0,data1),TBBup(0,data1),TBBdn(0,data1);
var : BBmd2(0,data1),Bbup2(0,data1),BBdn2(0,data1);
Array : CC[100](0,data1);
bbup1 = data1(BollBandUp(P,dv));
bbdn1 = data1(BollBandDown(P,dv));
bbup2 = data2(BollBandUp(P,dv));
bbdn2 = data2(BollBandDown(P,dv));
if data1(Bdate != Bdate[1]) Then{
S1 = data1(TimeToMinutes(stime));
D1 = data1(sdate);
}
if D1 > 0 then{
if data1(sdate == D1) Then
TM = data1(TimeToMinutes(stime)-S1);
Else
TM = data1(TimeToMinutes(stime)+1440-S1);
TF = TM%타주기분;
if data1(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] = data1(C);
if CC[P] > 0 then{
sum = 0;
for cnt = 0 to P-1{
sum = sum + CC[cnt];
}
TBBmd = sum/P;
SumSqrt = 0;
For cnt = 0 To P - 1 {
SumSqrt = SumSqrt + (CC[cnt] - TBBmd)^2;
}
Stdv = SquareRoot(SumSqrt / P);
TBBup = TBBmd + (Dv * Stdv);
TBBdn = TBBmd - (Dv * Stdv);
if data1(C > BBup1) and data1(C > TBBup) and data2(C>BBup2) Then
buy();
if MarketPosition == 1 and (data1(C<BBup1) or data1(C<TBBup) or data2(C<BBup2)) Then
exitlong();
}
}
4-1 분봉에서 타분봉
Input :Atime(10),Period(14);
var : TF(0),MFIv(0),cnt(0),sum1(0),sum2(0);
Array : HH[100](0),LL[100](0),CC[100](0),Vv[100](0);
Array : val1[100](0),val2[100](0),val3[100](0),val4[100](0);
TF = TimeToMinutes(stime)%Atime;
if dayindex() == 0 or (TF < TF[1] and stime > stime[1]) or stime >= 151500 Then{
HH[0] = H;
LL[0] = L;
VV[0] = 0;
for cnt = 1 to 99{
HH[cnt] = HH[cnt-1][1];
LL[cnt] = LL[cnt-1][1];
CC[cnt] = CC[cnt-1][1];
val1[cnt] = val1[cnt-1][1];
val2[cnt] = val2[cnt-1][1];
val3[cnt] = val3[cnt-1][1];
val4[cnt] = val4[cnt-1][1];
}
}
CC[0] = C;
if H > HH[0] Then
HH[0] = H;
if L < LL[0] Then
LL[0] = L;
VV[0] = VV[0]+V;
val1[0] = HH[0] + LL[0] + CC[0];
val4[0] = VV[0] * Val1[0]/ 3;
if val1[0] > val1[1] then
val2[0] = val4[0];
else
val2[0] = 0;
if val1[0] < val1[1] then
val3[0] = val4[0];
else
val3[0] = 0;
if CC[Period-1] > 0 Then{
sum1 = 0;
sum2 = 0;
for cnt = 0 to Period-1{
sum1 = sum1+val2[cnt];
sum2 = sum2+val3[cnt];
}
MFIv = 100 - 100 / (1 + (sum1/sum2));
plot1(MFIv);
PlotBaseLine1(20, "하단기준선");
PlotBaseLine2(80, "상단기준선");
}
4-2 분봉이하에 일봉
input : Period(14);
var : cnt(0),sum1(0),sum2(0),MFIv(0);
sum1 = 0;
sum2 = 0;
for cnt = 0 to Period-1{
if (dayhigh(cnt)+daylow(cnt)+DayClose(cnt)) > (dayhigh(cnt+1)+daylow(cnt+1)+DayClose(cnt+1)) Then
sum1 = sum1 + DayVolume(cnt)*(dayhigh(cnt)+daylow(cnt)+DayClose(cnt))/3;
Else
sum1 = sum1+0;
if (dayhigh(cnt)+daylow(cnt)+DayClose(cnt)) < (dayhigh(cnt+1)+daylow(cnt+1)+DayClose(cnt+1)) Then
sum2 = sum2 + DayVolume(cnt)*(dayhigh(cnt)+daylow(cnt)+DayClose(cnt))/3;
Else
sum2 = sum2+0;
}
MFIv = 100 - 100 / (1 + (sum1 / sum2));
plot1(MFIv);
PlotBaseLine1(20, "하단기준선");
PlotBaseLine2(80, "상단기준선");
5
input : n(25);
var1 =(C-C[1])/C[1]*100;
if countif(var1 >= n,20) >= 1 Then
find(1);
즐거운 하루되세요
> 잡다백수 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 도움주시는 덕분에 도전하고 있습니다. 매번 감사합니다.
1. 시스템
아래 코딩을 쓰면 컴퓨터에 추세선들이 나와서 리소스를 많이 먹는 것 같더라구요. 여기서 매수 매도에 상관없는 내용들은 다 삭제좀 부탁드립니다.
Input:chRate(0.2); //전환율 또는 변동률
Var:j(0),upTr(100),dnTr(-100),upRate(0),dnRate(0),trnd(0),TL(0),
date11(0),date12(0),time11(0),time12(0),TL1(0),
date21(0),date22(0),time21(0),time22(0),TL2(0),
date31(0),date32(0),time31(0),time32(0),TL3(0);
Array:hiVal[10](0),loVal[10](0),hiBar[10](0),loBar[10](0);
//hiVal[1]은 전고점, hiVal[2]는 전전고점, hiVal[3]은 전전전고점
//hiVal[0]은 변곡점 이후 현재봉까지의 고점. 현재 고점은 진행중이므로 계속 바뀐다.
//loVal[0]은 반대 개념
upRate = 1 + (chRate/100); //상승률
dnRate = 1 - (chRate/100); //하락률
for j = 1 to 9 { //전고,전저점을 9개까지 보관
loBar[j] = loBar[j] + 1; //전저점의 위치. 현재 봉으로부터 떨어져 있는 거리
hiBar[j] = hiBar[j] + 1; //전고점의 위치
}
if hiVal[0] <= H or hiVal[0] == 0 then { //전고,전저점 이후 현재까지의 고점
hiVal[0] = H; //0을 체크한 이유는 초기에 값이 없는 구간이 생기기 때문
hiBar[0] = 0; //현재 고점의 위치가 0이란 것은 현재봉의 고가가 구간 고점이라는 의미
}
else {
hiBar[0] = hiBar[0] + 1; //현재 고점의 위치
}
if loVal[0] >= L or loVal[0] == 0 then { //전고,전저점 이후 현재까지 저점
loVal[0] = L;
loBar[0] = 0;
}
else {
loBar[0] = loBar[0] + 1; //현재 구간 저점의 위치
}
if trnd != dnTr && hiVal[0] > H && hiVal[0] * dnRate > L then trnd = dnTr;
//저가가 고가 대비 변동률보다 밑으로 떨어지면 하락추세로 설정
//단, 현재봉의 고가가 변곡점 이후 최고가이면 상승 추세가 진행중이라고 본다.
//그래서 현재봉의 고가가 hiVal[0]보다 작다는 조건이 추가되었다.
else if trnd != upTr && loVal[0] < L && loVal[0] * upRate < H then trnd = upTr;
//고가가 저가 대비 변동률보다 높으면 상승추세로 설정
if trnd[1] == upTr and trnd == dnTr then { //상승추세였다가 하락추세로 바뀌었다면
for j = 8 downto 1 { //새로운 전고점이 생기는 것이므로
hiVal[j+1] = hiVal[j]; //전고점을 하나씩 뒤로 보낸다.
hiBar[j+1] = hiBar[j]; //전고점은 전전고점이 되고, 전전고점은 전전전고점이 된다.
}
hiVal[1] = hiVal[0]; //새로운 전고점에 현재 고점을 대입
hiBar[1] = hiBar[0];
hiVal[0] = H; //전고점이 확정되었으므로 전고점 이후 최고가는 현재봉의 고가
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 새로 생긴 것이니까 전저점에서 전고점까지 추세선을 긋는다.
date11 = date[loBar[1]]; //추세선 시작일. 전저점의 날짜
time11 = stime[loBar[1]]; //추세선 시작시간
Value11 = loVal[1]; //추세선 시작가격
date12 = date[hiBar[1]]; //추세선 종료일. 전고점의 날짜
time12 = stime[hiBar[1]]; //추세선 종료시간
Value12 = hiVal[1]; //추세선 종료가격
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
//TL_New는 신규 추세선을 그려주는 함수
}
if trnd[1] == dnTr and trnd == dnTr and //추세는 하락 상태에서 바뀌지 않았는데
hiVal[1] < hiVal[0] and //전고점보다 더 높은 고점이 출현했다면
hiVal[0] * dnRate > L then {
hiVal[1] = hiVal[0]; //전고점을 현재의 고점으로 바꿔준다.
hiBar[1] = hiBar[0];
hiVal[0] = H;
hiBar[0] = 0;
loVal[0] = L;
loBar[0] = 0;
//전고점이 추가된 게 아니고 바뀐 것이므로 종료일,종료시간,종료가격만 바꿔준다.
date12 = date[hiBar[1]]; //추세선 종료일
time12 = stime[hiBar[1]];
Value12 = hiVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
//TL_SetEnd는 기존추세선의 종료지점을 변경해주는 추세선 함수이다.
//TL_Delete 함수를 써서 직전의 추세선을 지우고 다시 TL_New로 추세선을 추가해도 된다.
}
if trnd[1] == dnTr and trnd == upTr then { //추세가 하락에서 상승으로 바뀌었을 경우
for j = 8 downto 1 {
//이전저점은 전전저점으로, 전전저점은 전전전저점으로 번호를 부여
loVal[j+1] = loVal[j];
loBar[j+1] = loBar[j];
}
loVal[1] = loVal[0];
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date11 = date[hiBar[1]]; //전저점이 새로이 생긴 것이므로 시작점은 전고점이 된다.
time11 = stime[hiBar[1]];
Value11 = hiVal[1];
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL1 = TL_New(date11,time11,Value11,date12,time12,Value12);
}
if trnd[1] == upTr and trnd == upTr and //추세는 상승을 유지하고 있는데
loVal[1] > loVal[0] and //전저점보다 낮은 저가가 출현했다면
loVal[0] * upRate < H then {
loVal[1] = loVal[0]; //직전의 전저점만 바꿔준다.
loBar[1] = loBar[0];
loVal[0] = L;
loBar[0] = 0;
hiVal[0] = H;
hiBar[0] = 0;
date12 = date[loBar[1]];
time12 = stime[loBar[1]];
Value12 = loVal[1];
TL_SetEnd(TL1, date12,time12,Value12);
}
if trnd == upTr and loVal[2] > loVal[1] then
TL_SetColor(TL1,BLUE);
else if trnd == dnTr and hiVal[2] < hiVal[1] then
TL_SetColor(TL1,RED);
else
TL_SetColor(TL1,BLACK);
TL_SetSize(TL1,2);
TL_SetColor(TL2,RED);
TL_SetColor(TL3,BLUE);
if var1 <= 0 and Trnd == uptr and Trnd != Trnd[1] Then{
var1 = 1;
value1 = loval[1];
TL1 = Text_New(sdate[lobar[1]],stime[lobar[1]],value1-PriceScale*2,"●");
TL_SetColor(TL,RED);
TL_SetSize(TL,2);
Text_SetStyle(TL1,2,2);
Text_SetColor(TL1,RED);#텍스트 색상
TL= Text_New(sdate[lobar[1]],stime[lobar[1]],L,"상승");
Text_SetColor(TL,RED);#텍스트 색상
}
if var1 >= 0 and Trnd == dntr and Trnd != Trnd[1] then{
var1 = -1;
value1 = hival[1];
TL2 = Text_New(sdate[hibar[1]],stime[hibar[1]],value1+PriceScale*2,"●");
TL_SetColor(TL,BLUE);
TL_SetSize(TL,2);
Text_SetStyle(TL2,2,2);#텍스트 좌우 상하 정렬
Text_SetColor(TL2,BLUE);#텍스트 색상
TL= Text_New(sdate[hibar[1]],stime[hibar[1]],H,"하락");
Text_SetColor(TL,BLUE);#텍스트 색상
}
input : P(10);
var : MM(0),T(0);
MM = (highest(H,P)+lowest(L,P))/2;
if T == 0 and C > MM Then
T = 1;
if T == 0 and C < MM Then
T = -1;
if T == 1 and CrossDown(C,lowest(L,P)[1]) Then
T = 0;
if T == -1 and CrossUp(C,highest(H,P)[1]) Then
T = 0;
if T == 1 and var1 == 1 Then
buy();
if T == -1 and var1 == -1 Then
sell();
2. 기타
-타주기 이격도
-분봉에서 일봉 이격도 코딩 부탁드립니다.
3. 시스템
-참조데이터 종가가 볼린저밴드 상단 위에 위치
-본 데이터 종가도 볼린저밴드 상단 위에 위치
-본 데이터 타주기 봉도 볼린저밴드 상단 이에 위치하면 매수
-위 조건 중 하나라도 무너지면 매도
4. 기타
-타주기 MFI
-분봉에서 일봉 MFI
5. 종목검색
최근 20거래일간 상승률 n%를 기록했던 종목