커뮤니티

수식 문의

프로필 이미지
부똘이
2019-12-07 00:54:08
271
글번호 134208
답변완료
아래는 본 게시판에 수식지왕님이 공개해 주신 지표 입니다. 질문 : ㄱ. 매일매일 만들어지는 plot 1,2,3을 당일만 뿌리지 말고, n봉이상으로 쭉 늘려서 뿌려주고 싶습니다. n봉의 값에 따라, 4일전 만들어진 plot1,2,3도 오늘 차트에 뿌려지고, 3일전 만들어진 polt1,2,3도 오늘 차트에 뿌려지고... 뭐 그런 식으로 되겠죠.. ㄴ. ㄱ. 지표를 data2 에 적용할 수 있도록 수정하고 싶습니다. ############################## input:n(1), 인타발(15); var:arr(0),j(0),k(0),tick(0),chk_cnt(0),ttm(0),t_val(0),max_tpo(0),tot_tpo(0), sum(0),acc(0),mdl_prc(0),mdl_arr(0),range_u(0),range_d(0),base(0), cal_tpo(0),up_tpo(0),dn_tpo(0),up_tail_u(0),up_tail_d(0),dn_tail_u(0),dn_tail_d(0); array:price_u[100](0),price_m[100](0),price_d[100](0), status_u[100](0),status_m[100](0),status_d[100](0), tpo_u[100](0),tpo_m[100](0),tpo_d[100](0); if CodeCategoryEX() == 11 then //Kospi 주식 { if C >= 500000 then tick = 1000; else if C >= 100000 then tick = 500; else if C >= 50000 then tick = 100; else if C >= 10000 then tick = 50; else if C >= 5000 then tick = 10; else tick = 5; } if CodeCategoryEX() == 12 then //Kosdaq 주식 { if C >= 50000 then tick = 100; else if C >= 10000 then tick = 50; else if C >= 5000 then tick = 10; else tick = 5; } if CodeCategoryEX() == 21 then //Kospi200 선물 tick = 0.05; if CodeCategoryEX() == 31 or CodeCategoryEX() == 32 then //Kospi200 콜옵션,풋옵션 { if C >= 3.0 then tick = 0.05; else tick = 0.01; } var1 = dayindex(); //전일 데이터를 이용하는 로직이므로 과거참조가 들어가는데 dayindex()의 경우 //dayindex()[n]으로 사용할 수 없어 dayindex()값을 일반변수에 move하여 사용하여야 합니다. //예전에도 이런 경험을 했었는데 기억력이 나쁘다보니 요번에도 여기서 좀 헤맸습니다. if dayindex()==0 then //당일 첫번째 봉에서만 계산 { for arr = 0 to 99 { price_u[arr] = 0; price_m[arr] = 0; price_d[arr] = 0; status_u[arr] = 0; status_m[arr] = 0; status_d[arr] = 0; tpo_u[arr] = 0; tpo_m[arr] = 0; tpo_d[arr] = 0; } max_tpo = 0; tot_tpo = 0; sum = 0; acc = 0; mdl_prc = 0; mdl_arr = 0; range_u = 0; range_d = 0; //n일 동안의 봉의 개수를 계산하여 계산할 첫번째 봉의 위치를 찾음 if n > 0 then { var2 = 0; for j = 1 to index { if var1[j] == 0 then var2 = var2 + 1; //dayindex()가 0 즉, 09시인 봉을 n번 찾음 if var2 == n then { var3 = j; j = index; } } } base = dayopen(n) + tick * 149; //n일전 시초가를 기준으로 가격대중 가장 상위의 가격 계산 price_u[0] = base; //지수 배열 상단 for arr = 1 to 99 { price_u[arr] = price_u[arr-1] - tick; } price_m[0] = price_u[99] - tick; //지수 배열 중단 for arr = 1 to 99 { price_m[arr] = price_m[arr-1] - tick; } price_d[0] = price_m[99] - tick; //지수 배열 하단 for arr = 1 to 99 { price_d[arr] = price_d[arr-1] - tick; } for j = var3 downto 1 { //n일전 시초봉에서부터 현재봉 1봉 이전 봉까지 순차적으로 계산 //이후 내용은 당일 지표식과 동일하므로 윗글 참조 ttm = TimeToMinutes(stime[j]); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l[j] <= price_u[arr] and price_u[arr] <= h[j] then { if status_u[arr] < t_val then { status_u[arr] = t_val; tpo_u[arr] = tpo_u[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_u[arr] then { max_tpo = tpo_u[arr]; sum = 0; acc = 0; } if max_tpo == tpo_u[arr] then { sum = sum + price_u[arr]; acc = acc + 1; } } } if l[j] <= price_m[arr] and price_m[arr] <= h[j] then { if status_m[arr] < t_val then { status_m[arr] = t_val; tpo_m[arr] = tpo_m[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_m[arr] then { max_tpo = tpo_m[arr]; sum = 0; acc = 0; } if max_tpo == tpo_m[arr] then { sum = sum + price_m[arr]; acc = acc + 1; } } } if l[j] <= price_d[arr] and price_d[arr] <= h[j] then { if status_d[arr] < t_val then { status_d[arr] = t_val; tpo_d[arr] = tpo_d[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_d[arr] then { max_tpo = tpo_d[arr]; sum = 0; acc = 0; } if max_tpo == tpo_d[arr] then { sum = sum + price_d[arr]; acc = acc + 1; } } } } } mdl_prc = round(sum/acc/tick,0)*tick; mdl_arr = int((base-mdl_prc)/tick); range_u = mdl_arr; range_d = mdl_arr; cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200])); for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 var4 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); var5 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if var4 > var5 then { cal_tpo = cal_tpo + var4; range_u = range_u - 1; } else if var4 < var5 then { cal_tpo = cal_tpo + var5; range_d = range_d + 1; } else if var4 == var5 and var4 > 0 and var5 > 0 then { cal_tpo = cal_tpo + var4; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var4 + var5 == 0 then k = 150; } up_tpo = 0; dn_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_tail_d = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; for arr = 0 to mdl_arr-1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then up_tail_u = arr + 1; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and up_tail_d == 0 then up_tail_d = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); } for arr = 299 downto mdl_arr+1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and dn_tail_u == 299 then dn_tail_u = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then dn_tail_d = arr - 1; } } plot1(mdl_prc,"중심가격"); plot2(base-(range_u*tick),"가치영역(상)"); plot3(base-(range_d*tick),"가치영역(하)"); if up_tail_u <= up_tail_d then { plot4(base-(up_tail_u*tick),"윗꼬리상단"); plot5(base-(up_tail_d*tick),"윗꼬리하단"); } if dn_tail_u <= dn_tail_d then { plot6(base-(dn_tail_u*tick),"아랫꼬리상단"); plot7(base-(dn_tail_d*tick),"아랫꼬리하단"); }
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-12-09 15:20:08

안녕하세요 예스스탁입니다. 1 input:n(1), 인타발(15),nn(1); var:arr(0),j(0),k(0),tick(0),chk_cnt(0),ttm(0),t_val(0),max_tpo(0),tot_tpo(0), sum(0),acc(0),mdl_prc(0),mdl_arr(0),range_u(0),range_d(0),base(0), cal_tpo(0),up_tpo(0),dn_tpo(0),up_tail_u(0),up_tail_d(0),dn_tail_u(0),dn_tail_d(0),cnt(0); array:price_u[100](0),price_m[100](0),price_d[100](0), status_u[100](0),status_m[100](0),status_d[100](0), tpo_u[100](0),tpo_m[100](0),tpo_d[100](0); Array : MM[100](0),HH[100](0),LL[100](0); if CodeCategoryEX() == 11 then //Kospi 주식 { if C >= 500000 then tick = 1000; else if C >= 100000 then tick = 500; else if C >= 50000 then tick = 100; else if C >= 10000 then tick = 50; else if C >= 5000 then tick = 10; else tick = 5; } if CodeCategoryEX() == 12 then //Kosdaq 주식 { if C >= 50000 then tick = 100; else if C >= 10000 then tick = 50; else if C >= 5000 then tick = 10; else tick = 5; } if CodeCategoryEX() == 21 then //Kospi200 선물 tick = 0.05; if CodeCategoryEX() == 31 or CodeCategoryEX() == 32 then //Kospi200 콜옵션,풋옵션 { if C >= 3.0 then tick = 0.05; else tick = 0.01; } var1 = dayindex(); //전일 데이터를 이용하는 로직이므로 과거참조가 들어가는데 dayindex()의 경우 //dayindex()[n]으로 사용할 수 없어 dayindex()값을 일반변수에 move하여 사용하여야 합니다. //예전에도 이런 경험을 했었는데 기억력이 나쁘다보니 요번에도 여기서 좀 헤맸습니다. if dayindex()==0 then //당일 첫번째 봉에서만 계산 { for arr = 0 to 99 { price_u[arr] = 0; price_m[arr] = 0; price_d[arr] = 0; status_u[arr] = 0; status_m[arr] = 0; status_d[arr] = 0; tpo_u[arr] = 0; tpo_m[arr] = 0; tpo_d[arr] = 0; } max_tpo = 0; tot_tpo = 0; sum = 0; acc = 0; mdl_prc = 0; mdl_arr = 0; range_u = 0; range_d = 0; //n일 동안의 봉의 개수를 계산하여 계산할 첫번째 봉의 위치를 찾음 if n > 0 then { var2 = 0; for j = 1 to index { if var1[j] == 0 then var2 = var2 + 1; //dayindex()가 0 즉, 09시인 봉을 n번 찾음 if var2 == n then { var3 = j; j = index; } } } base = dayopen(n) + tick * 149; //n일전 시초가를 기준으로 가격대중 가장 상위의 가격 계산 price_u[0] = base; //지수 배열 상단 for arr = 1 to 99 { price_u[arr] = price_u[arr-1] - tick; } price_m[0] = price_u[99] - tick; //지수 배열 중단 for arr = 1 to 99 { price_m[arr] = price_m[arr-1] - tick; } price_d[0] = price_m[99] - tick; //지수 배열 하단 for arr = 1 to 99 { price_d[arr] = price_d[arr-1] - tick; } for j = var3 downto 1 { //n일전 시초봉에서부터 현재봉 1봉 이전 봉까지 순차적으로 계산 //이후 내용은 당일 지표식과 동일하므로 윗글 참조 ttm = TimeToMinutes(stime[j]); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l[j] <= price_u[arr] and price_u[arr] <= h[j] then { if status_u[arr] < t_val then { status_u[arr] = t_val; tpo_u[arr] = tpo_u[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_u[arr] then { max_tpo = tpo_u[arr]; sum = 0; acc = 0; } if max_tpo == tpo_u[arr] then { sum = sum + price_u[arr]; acc = acc + 1; } } } if l[j] <= price_m[arr] and price_m[arr] <= h[j] then { if status_m[arr] < t_val then { status_m[arr] = t_val; tpo_m[arr] = tpo_m[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_m[arr] then { max_tpo = tpo_m[arr]; sum = 0; acc = 0; } if max_tpo == tpo_m[arr] then { sum = sum + price_m[arr]; acc = acc + 1; } } } if l[j] <= price_d[arr] and price_d[arr] <= h[j] then { if status_d[arr] < t_val then { status_d[arr] = t_val; tpo_d[arr] = tpo_d[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_d[arr] then { max_tpo = tpo_d[arr]; sum = 0; acc = 0; } if max_tpo == tpo_d[arr] then { sum = sum + price_d[arr]; acc = acc + 1; } } } } } mdl_prc = round(sum/acc/tick,0)*tick; mdl_arr = int((base-mdl_prc)/tick); range_u = mdl_arr; range_d = mdl_arr; cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200])); for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 var4 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); var5 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if var4 > var5 then { cal_tpo = cal_tpo + var4; range_u = range_u - 1; } else if var4 < var5 then { cal_tpo = cal_tpo + var5; range_d = range_d + 1; } else if var4 == var5 and var4 > 0 and var5 > 0 then { cal_tpo = cal_tpo + var4; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var4 + var5 == 0 then k = 150; } up_tpo = 0; dn_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_tail_d = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; for arr = 0 to mdl_arr-1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then up_tail_u = arr + 1; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and up_tail_d == 0 then up_tail_d = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); } for arr = 299 downto mdl_arr+1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and dn_tail_u == 299 then dn_tail_u = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then dn_tail_d = arr - 1; } } if bdate != bdate[1] Then { for cnt = 1 to 99 { MM[cnt] = MM[cnt-1][1]; HH[cnt] = HH[cnt-1][1]; LL[cnt] = LL[cnt-1][1]; } } MM[0] = mdl_prc; HH[0] = base-(range_u*tick); LL[0] = base-(range_d*tick); plot1(MM[0],"중심가격"); plot2(HH[0],"가치영역(상)"); plot3(LL[0],"가치영역(하)"); if up_tail_u <= up_tail_d then { plot4(base-(up_tail_u*tick),"윗꼬리상단"); plot5(base-(up_tail_d*tick),"윗꼬리하단"); } if dn_tail_u <= dn_tail_d then { plot6(base-(dn_tail_u*tick),"아랫꼬리상단"); plot7(base-(dn_tail_d*tick),"아랫꼬리하단"); } plot8(MM[nn],"nn일전 중심가격"); plot9(HH[nn],"nn일전 가치영역(상)"); plot10(LL[nn],"nn일전 가치영역(하)"); 2 input:n(1), 인타발(15),nn(1); var:arr(0,data2),j(0,data2),k(0,data2),tick(0,data2),chk_cnt(0,data2),ttm(0,data2),t_val(0,data2),max_tpo(0,data2),tot_tpo(0,data2), sum(0,data2),acc(0,data2),mdl_prc(0,data2),mdl_arr(0,data2),range_u(0,data2),range_d(0,data2),base(0,data2), cal_tpo(0,data2),up_tpo(0,data2),dn_tpo(0,data2),up_tail_u(0,data2),up_tail_d(0,data2),dn_tail_u(0,data2),dn_tail_d(0,data2),cnt(0,data2); var : v1(0,data2),v2(0,data2),v3(0,data2),v4(0,data2),v5(0,data2); array:price_u[100](0,data2),price_m[100](0,data2),price_d[100](0,data2), status_u[100](0,data2),status_m[100](0,data2),status_d[100](0,data2), tpo_u[100](0,data2),tpo_m[100](0,data2),tpo_d[100](0,data2); Array : MM[100](0,data2),HH[100](0,data2),LL[100](0,data2); if data2(CodeCategoryEX() == 11) then //Kospi 주식 { if data2(C) >= 500000 then tick = 1000; else if data2(C) >= 100000 then tick = 500; else if data2(C) >= 50000 then tick = 100; else if data2(C) >= 10000 then tick = 50; else if data2(C) >= 5000 then tick = 10; else tick = 5; } if data2(CodeCategoryEX() == 12) then //Kosdaq 주식 { if data2(C) >= 50000 then tick = 100; else if data2(C) >= 10000 then tick = 50; else if data2(C) >= 5000 then tick = 10; else tick = 5; } if data2(CodeCategoryEX() == 21) then //Kospi200 선물 tick = 0.05; if data2(CodeCategoryEX() == 31 or CodeCategoryEX() == 32) then //Kospi200 콜옵션,풋옵션 { if data2(C) >= 3.0 then tick = 0.05; else tick = 0.01; } v1 = data2(dayindex()); //전일 데이터를 이용하는 로직이므로 과거참조가 들어가는데 dayindex()의 경우 //dayindex()[n]으로 사용할 수 없어 dayindex()값을 일반변수에 move하여 사용하여야 합니다. //예전에도 이런 경험을 했었는데 기억력이 나쁘다보니 요번에도 여기서 좀 헤맸습니다. if data2(dayindex())==0 then //당일 첫번째 봉에서만 계산 { for arr = 0 to 99 { price_u[arr] = 0; price_m[arr] = 0; price_d[arr] = 0; status_u[arr] = 0; status_m[arr] = 0; status_d[arr] = 0; tpo_u[arr] = 0; tpo_m[arr] = 0; tpo_d[arr] = 0; } max_tpo = 0; tot_tpo = 0; sum = 0; acc = 0; mdl_prc = 0; mdl_arr = 0; range_u = 0; range_d = 0; //n일 동안의 봉의 개수를 계산하여 계산할 첫번째 봉의 위치를 찾음 if n > 0 then { v2 = 0; for j = 1 to index { if v1[j] == 0 then v2 = v2 + 1; //dayindex()가 0 즉, 09시인 봉을 n번 찾음 if v2 == n then { v3 = j; j = index; } } } base = data2(openD(n)) + tick * 149; //n일전 시초가를 기준으로 가격대중 가장 상위의 가격 계산 price_u[0] = base; //지수 배열 상단 for arr = 1 to 99 { price_u[arr] = price_u[arr-1] - tick; } price_m[0] = price_u[99] - tick; //지수 배열 중단 for arr = 1 to 99 { price_m[arr] = price_m[arr-1] - tick; } price_d[0] = price_m[99] - tick; //지수 배열 하단 for arr = 1 to 99 { price_d[arr] = price_d[arr-1] - tick; } for j = v3 downto 1 { //n일전 시초봉에서부터 현재봉 1봉 이전 봉까지 순차적으로 계산 //이후 내용은 당일 지표식과 동일하므로 윗글 참조 ttm = data2(TimeToMinutes(stime[j])); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if data2(l[j]) <= price_u[arr] and price_u[arr] <= data2(h[j]) then { if status_u[arr] < t_val then { status_u[arr] = t_val; tpo_u[arr] = tpo_u[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_u[arr] then { max_tpo = tpo_u[arr]; sum = 0; acc = 0; } if max_tpo == tpo_u[arr] then { sum = sum + price_u[arr]; acc = acc + 1; } } } if data2(l[j]) <= price_m[arr] and price_m[arr] <= data2(h[j]) then { if status_m[arr] < t_val then { status_m[arr] = t_val; tpo_m[arr] = tpo_m[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_m[arr] then { max_tpo = tpo_m[arr]; sum = 0; acc = 0; } if max_tpo == tpo_m[arr] then { sum = sum + price_m[arr]; acc = acc + 1; } } } if data2(l[j]) <= price_d[arr] and price_d[arr] <= data2(h[j]) then { if status_d[arr] < t_val then { status_d[arr] = t_val; tpo_d[arr] = tpo_d[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_d[arr] then { max_tpo = tpo_d[arr]; sum = 0; acc = 0; } if max_tpo == tpo_d[arr] then { sum = sum + price_d[arr]; acc = acc + 1; } } } } } mdl_prc = round(sum/acc/tick,0)*tick; mdl_arr = int((base-mdl_prc)/tick); range_u = mdl_arr; range_d = mdl_arr; cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200])); for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 v4 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); v5 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if v4 > v5 then { cal_tpo = cal_tpo + v4; range_u = range_u - 1; } else if v4 < v5 then { cal_tpo = cal_tpo + v5; range_d = range_d + 1; } else if v4 == v5 and v4 > 0 and v5 > 0 then { cal_tpo = cal_tpo + v4; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or v4 + v5 == 0 then k = 150; } up_tpo = 0; dn_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_tail_d = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; for arr = 0 to mdl_arr-1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then up_tail_u = arr + 1; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and up_tail_d == 0 then up_tail_d = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); } for arr = 299 downto mdl_arr+1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and dn_tail_u == 299 then dn_tail_u = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then dn_tail_d = arr - 1; } } if data2(bdate != bdate[1]) Then { for cnt = 1 to 99 { MM[cnt] = MM[cnt-1][1]; HH[cnt] = HH[cnt-1][1]; LL[cnt] = LL[cnt-1][1]; } } MM[0] = mdl_prc; HH[0] = base-(range_u*tick); LL[0] = base-(range_d*tick); plot1(MM[0],"중심가격"); plot2(HH[0],"가치영역(상)"); plot3(LL[0],"가치영역(하)"); if up_tail_u <= up_tail_d then { plot4(base-(up_tail_u*tick),"윗꼬리상단"); plot5(base-(up_tail_d*tick),"윗꼬리하단"); } if dn_tail_u <= dn_tail_d then { plot6(base-(dn_tail_u*tick),"아랫꼬리상단"); plot7(base-(dn_tail_d*tick),"아랫꼬리하단"); } plot8(MM[nn],"nn일전 중심가격"); plot9(HH[nn],"nn일전 가치영역(상)"); plot10(LL[nn],"nn일전 가치영역(하)"); 즐거운 하루되세요 > 부똘이 님이 쓴 글입니다. > 제목 : 수식 문의 > 아래는 본 게시판에 수식지왕님이 공개해 주신 지표 입니다. 질문 : ㄱ. 매일매일 만들어지는 plot 1,2,3을 당일만 뿌리지 말고, n봉이상으로 쭉 늘려서 뿌려주고 싶습니다. n봉의 값에 따라, 4일전 만들어진 plot1,2,3도 오늘 차트에 뿌려지고, 3일전 만들어진 polt1,2,3도 오늘 차트에 뿌려지고... 뭐 그런 식으로 되겠죠.. ㄴ. ㄱ. 지표를 data2 에 적용할 수 있도록 수정하고 싶습니다. ############################## input:n(1), 인타발(15); var:arr(0),j(0),k(0),tick(0),chk_cnt(0),ttm(0),t_val(0),max_tpo(0),tot_tpo(0), sum(0),acc(0),mdl_prc(0),mdl_arr(0),range_u(0),range_d(0),base(0), cal_tpo(0),up_tpo(0),dn_tpo(0),up_tail_u(0),up_tail_d(0),dn_tail_u(0),dn_tail_d(0); array:price_u[100](0),price_m[100](0),price_d[100](0), status_u[100](0),status_m[100](0),status_d[100](0), tpo_u[100](0),tpo_m[100](0),tpo_d[100](0); if CodeCategoryEX() == 11 then //Kospi 주식 { if C >= 500000 then tick = 1000; else if C >= 100000 then tick = 500; else if C >= 50000 then tick = 100; else if C >= 10000 then tick = 50; else if C >= 5000 then tick = 10; else tick = 5; } if CodeCategoryEX() == 12 then //Kosdaq 주식 { if C >= 50000 then tick = 100; else if C >= 10000 then tick = 50; else if C >= 5000 then tick = 10; else tick = 5; } if CodeCategoryEX() == 21 then //Kospi200 선물 tick = 0.05; if CodeCategoryEX() == 31 or CodeCategoryEX() == 32 then //Kospi200 콜옵션,풋옵션 { if C >= 3.0 then tick = 0.05; else tick = 0.01; } var1 = dayindex(); //전일 데이터를 이용하는 로직이므로 과거참조가 들어가는데 dayindex()의 경우 //dayindex()[n]으로 사용할 수 없어 dayindex()값을 일반변수에 move하여 사용하여야 합니다. //예전에도 이런 경험을 했었는데 기억력이 나쁘다보니 요번에도 여기서 좀 헤맸습니다. if dayindex()==0 then //당일 첫번째 봉에서만 계산 { for arr = 0 to 99 { price_u[arr] = 0; price_m[arr] = 0; price_d[arr] = 0; status_u[arr] = 0; status_m[arr] = 0; status_d[arr] = 0; tpo_u[arr] = 0; tpo_m[arr] = 0; tpo_d[arr] = 0; } max_tpo = 0; tot_tpo = 0; sum = 0; acc = 0; mdl_prc = 0; mdl_arr = 0; range_u = 0; range_d = 0; //n일 동안의 봉의 개수를 계산하여 계산할 첫번째 봉의 위치를 찾음 if n > 0 then { var2 = 0; for j = 1 to index { if var1[j] == 0 then var2 = var2 + 1; //dayindex()가 0 즉, 09시인 봉을 n번 찾음 if var2 == n then { var3 = j; j = index; } } } base = dayopen(n) + tick * 149; //n일전 시초가를 기준으로 가격대중 가장 상위의 가격 계산 price_u[0] = base; //지수 배열 상단 for arr = 1 to 99 { price_u[arr] = price_u[arr-1] - tick; } price_m[0] = price_u[99] - tick; //지수 배열 중단 for arr = 1 to 99 { price_m[arr] = price_m[arr-1] - tick; } price_d[0] = price_m[99] - tick; //지수 배열 하단 for arr = 1 to 99 { price_d[arr] = price_d[arr-1] - tick; } for j = var3 downto 1 { //n일전 시초봉에서부터 현재봉 1봉 이전 봉까지 순차적으로 계산 //이후 내용은 당일 지표식과 동일하므로 윗글 참조 ttm = TimeToMinutes(stime[j]); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l[j] <= price_u[arr] and price_u[arr] <= h[j] then { if status_u[arr] < t_val then { status_u[arr] = t_val; tpo_u[arr] = tpo_u[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_u[arr] then { max_tpo = tpo_u[arr]; sum = 0; acc = 0; } if max_tpo == tpo_u[arr] then { sum = sum + price_u[arr]; acc = acc + 1; } } } if l[j] <= price_m[arr] and price_m[arr] <= h[j] then { if status_m[arr] < t_val then { status_m[arr] = t_val; tpo_m[arr] = tpo_m[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_m[arr] then { max_tpo = tpo_m[arr]; sum = 0; acc = 0; } if max_tpo == tpo_m[arr] then { sum = sum + price_m[arr]; acc = acc + 1; } } } if l[j] <= price_d[arr] and price_d[arr] <= h[j] then { if status_d[arr] < t_val then { status_d[arr] = t_val; tpo_d[arr] = tpo_d[arr] + 1; tot_tpo = tot_tpo + 1; if max_tpo < tpo_d[arr] then { max_tpo = tpo_d[arr]; sum = 0; acc = 0; } if max_tpo == tpo_d[arr] then { sum = sum + price_d[arr]; acc = acc + 1; } } } } } mdl_prc = round(sum/acc/tick,0)*tick; mdl_arr = int((base-mdl_prc)/tick); range_u = mdl_arr; range_d = mdl_arr; cal_tpo = iff(mdl_arr<100,tpo_u[mdl_arr],iff(mdl_arr<200,tpo_m[mdl_arr-100],tpo_d[mdl_arr-200])); for k = 0 to 150 { // range_u는 한단위씩 위로(-1), range_d는 한단위씩 아래로(+1) // TPO가 많은 쪽의 TPO를 먼저 누적한다 var4 = iff(range_u-1<100,tpo_u[range_u-1],iff(range_u-1<200,tpo_m[range_u-1-100],tpo_d[range_u-1-200])); var5 = iff(range_d+1<100,tpo_u[range_d+1],iff(range_d+1<200,tpo_m[range_d+1-100],tpo_d[range_d+1-200])); if var4 > var5 then { cal_tpo = cal_tpo + var4; range_u = range_u - 1; } else if var4 < var5 then { cal_tpo = cal_tpo + var5; range_d = range_d + 1; } else if var4 == var5 and var4 > 0 and var5 > 0 then { cal_tpo = cal_tpo + var4; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var4 + var5 == 0 then k = 150; } up_tpo = 0; dn_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_tail_d = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; for arr = 0 to mdl_arr-1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) == 1 then up_tail_u = arr + 1; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr+1<100,tpo_u[arr+1],iff(arr+1<200,tpo_m[arr-100+1],tpo_d[arr-200+1])) > 1 and up_tail_d == 0 then up_tail_d = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) > 1 then up_tpo = up_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); } for arr = 299 downto mdl_arr+1 { if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_u[arr-100],tpo_d[arr-200])) > 1 then dn_tpo = dn_tpo + iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])); if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 1 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) > 1 and dn_tail_u == 299 then dn_tail_u = arr; if iff(arr<100,tpo_u[arr],iff(arr<200,tpo_m[arr-100],tpo_d[arr-200])) == 0 and iff(arr-1<100,tpo_u[arr-1],iff(arr-1<200,tpo_m[arr-100-1],tpo_d[arr-200-1])) == 1 then dn_tail_d = arr - 1; } } plot1(mdl_prc,"중심가격"); plot2(base-(range_u*tick),"가치영역(상)"); plot3(base-(range_d*tick),"가치영역(하)"); if up_tail_u <= up_tail_d then { plot4(base-(up_tail_u*tick),"윗꼬리상단"); plot5(base-(up_tail_d*tick),"윗꼬리하단"); } if dn_tail_u <= dn_tail_d then { plot6(base-(dn_tail_u*tick),"아랫꼬리상단"); plot7(base-(dn_tail_d*tick),"아랫꼬리하단"); }