커뮤니티

수식 문의

프로필 이미지
흑수돌
2019-02-12 08:36:12
185
글번호 126070
답변완료
아래 수식을 osc 지표로 만들고 싶습니다. --- 아래 --- input:인타발(15); var:arr(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; } 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; base = dayopen() + tick * 149; 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; } } ttm = TimeToMinutes(stime); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l <= price_u[arr] and price_u[arr] <= h 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 <= price_m[arr] and price_m[arr] <= h 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 <= price_d[arr] and price_d[arr] <= h 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 { var2 = 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])); var3 = 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 var2 > var3 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } else if var2 < var3 then { cal_tpo = cal_tpo + var3; range_d = range_d + 1; } else if var2 == var3 and var2 > 0 and var3 > 0 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then k = 150; } up_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_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])); } dn_tpo = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; 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)); } ---------------------------- macd는 장기이평을 0으로 긋고 장기이평(0선)과 단기이평의 이격을 확인하는 지표라고 할 수 있겠습니다. 이와 같은 원리로, 위 수식에서 plot1을 수평선 0값으로 만들고 plot2~7을 plot1과의 비율에 맞추어 (plot1에 대한 이격만큼) 지표에 뿌려줍니다. data1 과 data1에 대한 지수이평값도 마찬가지로 plot1의 이격만큼 뿌려줍니다. 항상친절한 답변 감사드립니다.
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2019-02-12 11:49:58

안녕하세요 예스스탁입니다. input:인타발(15),P(20); var:arr(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; } 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; base = dayopen() + tick * 149; 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; } } ttm = TimeToMinutes(stime); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l <= price_u[arr] and price_u[arr] <= h 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 <= price_m[arr] and price_m[arr] <= h 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 <= price_d[arr] and price_d[arr] <= h 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 { var2 = 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])); var3 = 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 var2 > var3 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } else if var2 < var3 then { cal_tpo = cal_tpo + var3; range_d = range_d + 1; } else if var2 == var3 and var2 > 0 and var3 > 0 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then k = 150; } up_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_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])); } dn_tpo = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; 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; } var1 = mdl_prc; var2 = base-(range_u*tick); var3 = base-(range_d*tick); if up_tail_u <= up_tail_d then { var4 = base-(up_tail_u*tick); var5 = base-(up_tail_d*tick); } if dn_tail_u <= dn_tail_d then { var6 = base-(dn_tail_u*tick); var7 = base-(dn_tail_d*tick); } plot1(var2-var1); plot2(var3-var1); plot3(var4-var1); plot4(var5-var1); plot5(var6-var1); plot6(var7-var1); plot7(ema(c,P)-var1); PlotBaseLine1(0); 즐거운 하루되세요 > 흑수돌 님이 쓴 글입니다. > 제목 : 수식 문의 > 아래 수식을 osc 지표로 만들고 싶습니다. --- 아래 --- input:인타발(15); var:arr(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; } 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; base = dayopen() + tick * 149; 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; } } ttm = TimeToMinutes(stime); t_val = int((ttm-540)/인타발) + 1; for arr = 0 to 99 { if l <= price_u[arr] and price_u[arr] <= h 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 <= price_m[arr] and price_m[arr] <= h 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 <= price_d[arr] and price_d[arr] <= h 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 { var2 = 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])); var3 = 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 var2 > var3 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } else if var2 < var3 then { cal_tpo = cal_tpo + var3; range_d = range_d + 1; } else if var2 == var3 and var2 > 0 and var3 > 0 then { cal_tpo = cal_tpo + var2; range_u = range_u - 1; } if cal_tpo >= tot_tpo * 0.7 or var2 + var3 == 0 then k = 150; } up_tpo = 0; if tpo_u[0] == 1 then up_tail_u = 0; else up_tail_u = 299; up_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])); } dn_tpo = 0; dn_tail_u = 299; if tpo_d[99] == 1 then dn_tail_d = 299; else dn_tail_d = 0; 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)); } ---------------------------- macd는 장기이평을 0으로 긋고 장기이평(0선)과 단기이평의 이격을 확인하는 지표라고 할 수 있겠습니다. 이와 같은 원리로, 위 수식에서 plot1을 수평선 0값으로 만들고 plot2~7을 plot1과의 비율에 맞추어 (plot1에 대한 이격만큼) 지표에 뿌려줍니다. data1 과 data1에 대한 지수이평값도 마찬가지로 plot1의 이격만큼 뿌려줍니다. 항상친절한 답변 감사드립니다.