커뮤니티

[오픈소스] PnF차트 저항선 돌파종목 검색식

프로필 이미지
수식지왕
2005-12-22 00:57:18
1301
글번호 9001

첨부 이미지

본 내용은 http://cafe.empas.com/systrader에 게시된 내용입니다. P&F 차트 검색식에 대한 요구가 있었던 것으로 기억됩니다. 많은 시행착오 끝에 만든거다보니 이글을 읽는 분들께 작은 도움이라도 되었으면 하는 바램입니다. 저도 설명드리기 난해합니다만 이런 방법도 있구나 하면서 그냥 읽어봐 주시기 바랍니다. 종목을 검색후 P&F 차트로 보면 일부 종목은 돌파전인 것으로 나오는데 예스트레이더 어플리케이션에서 P&F 차트를 그려주는 소스와 예스편집기에서 지원하는 랭귀지가 상이하므로 100% 동일하게 맞추는데 한계가 있어 오차가 발생할 수 있습니다. /*작성자:수식지왕*/ input:bar_cnt(200); //검색식 최대 봉수가 200이므로 200을 주었음. //검색기간에서 봉수를 달리 줄 경우 입력변수도 수정해줘야 함 var:j(0),g(0),r(0),k(0),n(0),point(0),figure(3),u(1),d(-1),type(0), 저항기울기(0),저항선(0),저항표준오차(0), 지지기울기(0),지지선(0),지지표준오차(0); array:기준가[10](0),Hi[100](0),Lo[100](0),방향[100](0); #=====================================================# # main #=====================================================# n = bar_cnt - 1; //봉의 개수는 200이지만 index는 0부터 시작하므로 -1 //마지막봉 위치에서 첫번째 봉은 c[199]가 됨 if i == n then { point = (highest(c,bar_cnt)-lowest(c,bar_cnt))/50; //예스트레이더에서 여러 종목에 걸쳐 테스트해서 얻은 결과값임 //point값을 어떻게 주느냐에 따라 차트의 모양이 천차만별이므로 가급적 //예스차트에서 제공하는 모양에 가깝게 구현하고자 함 //기간값과 봉의 개수가 동일하므로 마지막봉에서만 계산이 가능함 //여타의 검색식의 로직은 첫번째 봉부터 마지막 봉까지 시간의 흐름에 따라 //계산을 하지만 이 검색식은 마지막봉에서 point를 계산하고 //거꾸로 과거의 데이터를 계산함. 기준가[0] = c[n]; //n 봉전, 즉 첫번째 봉의 종가 k = 0; 방향[0] = 0; Hi[0] = int(h[n]/point); //첫번째 봉의 고가를 point로 나눈값 Lo[0] = int(l[n]/point); //첫번째 봉의 저가를 point로 나눈값 for g = n - 1 downto 0 { //c[198] ~ c[0]의 수순으로 계산 for r = 9 downto 1 { //기준가를 일반변수로 사용하게되면 1봉전의 값을 기준가[r] = 기준가[r-1]; //기준가[1]로 표현할 수 있겠으나 본 로직에서는 } //마지막 봉에서 모든 계산을 해야 하므로 //기준가를 배열변수로 선언하여 사용함 //99번 글의 지표식과 비교해 보시면 이해가 빠를 것임 //이후 로직은 기존 지표식 로직과 동일 if 방향[0] == 0 then { if 기준가[0] + (point * figure) <= c[g] then { 기준가[0] = c[g]; 방향[0] = u; Hi[0] = max(Hi[0],int(h[g]/point)); Lo[0] = min(Lo[0],int(l[g]/point)); } else if 기준가[0] - (point * figure) >= c[g] then { 기준가[0] = c[g]; 방향[0] = d; Hi[0] = max(Hi[0],int(h[g]/point)); Lo[0] = min(Lo[0],int(l[g]/point)); } else { Hi[0] = max(Hi[0],int(h[g]/point)); Lo[0] = min(Lo[0],int(l[g]/point)); } } else if 방향[0] == d then { if 기준가[0] + (point * figure) <= c[g] then { k = k + 1; for j = min(k,99) downto 1 { Hi[j] = Hi[j-1]; Lo[j] = Lo[j-1]; 방향[j] = 방향[j-1]; } 기준가[0] = c[g]; 방향[0] = u; Hi[0] = int(h[g]/point); Lo[0] = int(기준가[1]/point); } else { 기준가[0] = min(기준가[1],c[g]); Hi[0] = max(Hi[0],int(h[g]/point)); Lo[0] = min(Lo[0],int(l[g]/point)); } } else if 방향[0] == u then { if 기준가[0] - (point * figure) >= c[g] then { k = k + 1; for j = min(k,99) downto 1 { Hi[j] = Hi[j-1]; Lo[j] = Lo[j-1]; 방향[j] = 방향[j-1]; } 기준가[0] = c[g]; 방향[0] = d; Hi[0] = int(기준가[1]/point); Lo[0] = int(l[g]/point); } else { 기준가[0] = max(기준가[1],c[g]); Hi[0] = max(Hi[0],int(h[g]/point)); Lo[0] = min(Lo[0],int(l[g]/point)); } } } /* 저항선,지지선을 회귀선 공식으로 구하면 n∑xy - (∑x)(∑y) ∑y ∑x 기울기 a = --------------------- 절편 b = ----- - aㆍ------ n∑x²- (∑x)² n n Y = a*(X - ∑x/n) + ∑y/n ∑xy = 0*Lo[3] + 1*Lo[2] + 2*Lo[1] + 3*Lo[0] ∑x = 0 + 1 + 2 + 3 = 6 ∑y = Lo[3] + Lo[2] + Lo[1] + Lo[0] ∑x²= 0 + 1 + 4 + 9 = 14 n∑x²- (∑x)²= 4*14 - 6²= 20 표준오차를 구해서 회귀선이 유효한지 점검 _______________________________________________________ / 1 [n∑xy - (∑x)(∑y)]² Sxy = / [ ------- ][n∑y²- (∑y)²- ----------------------- ] √ n(n-2) n∑x²- (∑x)² */ if 방향[0]==u then { type = 0; 저항기울기 = (4*(Hi[3] + 2*Hi[2] + 3*Hi[1]) - 6*(Hi[4]+Hi[3]+Hi[2]+Hi[1]))/20; 저항선 = 저항기울기*2.5 + (Hi[4]+Hi[3]+Hi[2]+Hi[1])/4; 저항표준오차 = sqrt(0.125 * ((4*(Hi[4]^2 + Hi[3]^2 + Hi[2]^2 + Hi[1]^2)) - ((Hi[4]+Hi[3]+Hi[2]+Hi[1])^2) - (4*(Hi[3] + 2*Hi[2] + 3*Hi[1]) - 6*(Hi[4]+Hi[3]+Hi[2]+Hi[1]))^2 /20)); 지지기울기 = (4*(Lo[2] + 2*Lo[1] + 3*Lo[0]) - 6*(Lo[3]+Lo[2]+Lo[1]+Lo[0]))/20; 지지선 = 지지기울기*1.5 + (Lo[3]+Lo[2]+Lo[1]+Lo[0])/4; 지지표준오차 = sqrt(0.125 * ((4*(Lo[3]^2 + Lo[2]^2 + Lo[1]^2 + Lo[0]^2)) - ((Lo[3]+Lo[2]+Lo[1]+Lo[0])^2) - (4*(Lo[2] + 2*Lo[1] + 3*Lo[0]) - 6*(Lo[3]+Lo[2]+Lo[1]+Lo[0]))^2 /20)); if -0.7 < 저항기울기 and 저항기울기 < 0.7 and max(Hi[4],Hi[2]) < Hi[0] then { if 저항표준오차 < 1.3 then { if 지지표준오차 < 1.3 then { if 0.7 <= 지지기울기 then type = 11; else if 지지기울기 <= -0.7 then type = 12; else type = 13; } else type = 14; } else { if 지지표준오차 < 1.3 then { if 0.7 <= 지지기울기 then type = 21; else if 지지기울기 <= -0.7 then type = 22; else type = 23; } else type = 24; } } else if 저항기울기 <= -0.7 and 저항선 < Hi[0] and 저항표준오차 < 1.3 then { if 지지표준오차 < 1.3 then { if 지지기울기 <= -0.7 then type = 31; else if 0.7 <= 지지기울기 then type = 32; else type = 33; } else type = 34; } } } /* 11 12 13 14 x x x x x o x o x x o x o x x x x x x x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o o x o x x o x o x x o x o x x o x x o x x x o x x o o x o x x x o 21 22 23 24 x x x x x x x x x x x x x x x x x x x x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o o x o x x o x o x x o x o x x o x x o x x x o x x o o x o x x x o 31 32 33 34 x x x x x o x o x o x o x o x x x o x x x o x x x o x x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x x o x o x o x o x x o x o x o x o x x o x o x x o x x o x x o x o x o x x o x x o x x x */ #=====================================================# # 검색식 #=====================================================# Find(type);
검색
답변 0