커뮤니티

수식 검증 부탁드립니다.

프로필 이미지
자아준
2011-02-20 21:32:05
1002
글번호 35909
답변완료
수고하십니다. 밑의 수식을 시물레이션 하니 오류 메세지 가 나오는데 검정 및 수정 부탁드립니다. Input:n(5),r(1.025),지표사용(False); Var:j(0),k(0),q(0),기간최저(0),고점상태(0),저점상태(0),고점기울기(0),고점절편(0), 저점기울기(0),저점절편(0),고점Bar(0),저점Bar(0),패턴번호(0),기울기(0), 저항선(0),지지선(0),상승(100),하락(-100),평행(1), 평균기울기(0), 평균대비하락각(0),평균대비상승각(0); Var:macdVal(0),macdSig(0),stoK(0),stoD(0); Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0),고Idx[20](0),저Idx[20](0), 고LRS[20](0),저LRS[20](0),sumXY[20](0),sumX[20](0),sumY[20](0),sumX²[20](0), sumY²[20](0),고점상관계수[20](0),저점상관계수[20](0); #---------------------------------------------------------# # index()와 마찬가지로 1봉이 바뀔 때마다 1씩 증가 #---------------------------------------------------------# for j = 1 to 19 { 고Bar[j] = 고Bar[j] + 1; 저Bar[j] = 저Bar[j] + 1; 고Idx[j] = Index - 고Bar[j]; 저Idx[j] = Index - 저Bar[j]; } 고점Bar = 고점Bar + 1; 저점Bar = 저점Bar + 1; #=========================================================# # 파동선 계산 #=========================================================# # 전고점(Peak) 계산 #---------------------------------------------------------# if Highest(H,n)[n+1] <= H[n] and H[n] > Highest(H,n) then { if 고Bar[1] > 저Bar[1] then { for j = 18 downto 1 { 고[j+1] = 고[j]; 고Bar[j+1] = 고Bar[j]; 고Idx[j+1] = 고Idx[j]; 고LRS[j+1] = 고LRS[j]; } } if 고Bar[1] > 저Bar[1] or 고[1] <= H[n] then { 고[1] = H[n]; 고Bar[1] = n; 고Idx[1] = Index - 고Bar[1]; sumXY[1] = 고Idx[3]*고[3] + 고Idx[2]*고[2] + 고Idx[1]*고[1]; sumX[1] = 고Idx[3] + 고Idx[2] + 고Idx[1]; sumY[1] = 고[3] + 고[2] + 고[1]; sumX²[1] = 고Idx[3]^2 + 고Idx[2]^2 + 고Idx[1]^2; 고LRS[1] = (3*sumXY[1] - sumX[1]*sumY[1])/(3*sumX²[1] - sumX[1]^2); } } #---------------------------------------------------------# # 전저점(Trough) 계산 #---------------------------------------------------------# if Lowest(L,n)[n+1] >= L[n] and L[n] < Lowest(L,n) then { if 저Bar[1] > 고Bar[1] then { for j = 18 downto 1 { 저[j+1] = 저[j]; 저Bar[j+1] = 저Bar[j]; 저Idx[j+1] = 저Idx[j]; 저LRS[j+1] = 저LRS[j]; } } if 저Bar[1] > 고Bar[1] or 저[1] >= L[n] then { 저[1] = L[n]; 저Bar[1] = n; 저Idx[1] = Index - 저Bar[1]; sumXY[1] = 저Idx[3]*저[3] + 저Idx[2]*저[2] + 저Idx[1]*저[1]; sumX[1] = 저Idx[3] + 저Idx[2] + 저Idx[1]; sumY[1] = 저[3] + 저[2] + 저[1]; sumX²[1] = 저Idx[3]^2 + 저Idx[2]^2 + 저Idx[1]^2; 저LRS[1] = (3*sumXY[1] - sumX[1]*sumY[1])/(3*sumX²[1] - sumX[1]^2); } } #----------------------------------------------------------------------------# # 선형회귀방정식 # #----------------------------------------------------------------------------# # nΣxy - (Σx)(Σy) # # 기울기 a = --------------------- # # nΣx²- (Σx)² # # # # = (n*sum(xy) - sum(x) * sum(y)) / (n*sum(x^2)-sum(x)^2) # # # # (Σy)(Σx²)-(Σx)(Σxy) # # 절편 b = --------------------------- # # nΣx²- (Σx)² # # # # = (sum(y)*sum(x^2) - sum(x)*sum(xy)) / (n*sum(x^2) - sum(x)^2) # #----------------------------------------------------------------------------# # 상관도 공식 # #----------------------------------------------------------------------------# # n(Σxy) - (Σx)(Σy) # r = ------------------------------------- # # √[nΣx²- (Σx)²][nΣy²- (Σy)²] # # # # =(n*sum(xy)-sum(x)*sum(y))/sqrt((n*sum(x^2)-sum(x)^2)(n*sum(y^2)-sum(y)^2))# #----------------------------------------------------------------------------# #=========================================================# # 파동분석 #=========================================================# 기간최저 = Lowest(L,n*20); if 저[1][1] != 저[1] or 저Bar[1][1] + 1 != 저Bar[1] then { //저점 변동이 있을 경우 #---------------------------------------------------------# # 고점 추세선 분석 #---------------------------------------------------------# k = 0; for j = 1 to 19 { sumXY[j] = sumXY[j-1] + 고Idx[j]*고[j]; sumX[j] = sumX[j-1] + 고Idx[j]; sumY[j] = sumY[j-1] + 고[j]; sumX²[j] = sumX²[j-1] + 고Idx[j]^2; sumY²[j] = sumY²[j-1] + 고[j]^2; #---------------------------------------------------------# # 상관도가 가장 높은 선형회귀선 검색 #---------------------------------------------------------# 고점상관계수[j] = ((j*sumXY[j] - sumX[j]*sumY[j])/ Sqrt((j*sumX²[j] - sumX[j]^2)*(j*sumY²[j] - sumY[j]^2))); if j >= 3 and Abs(고점상관계수[k]) < Abs(고점상관계수[j]) then k = j; } 고점기울기 = (k*sumXY[k] - sumX[k]*sumY[k])/(k*sumX²[k] - sumX[k]^2); #---------------------------------------------------------# # 가장 외곽을 지나는 추세선 검색 #---------------------------------------------------------# q = 1; for j = 2 to k { if 고점기울기*고Bar[q]+고[q] < 고점기울기*고Bar[j]+고[j] then q = j; } 고점절편 = 고[q]; 고점Bar = 고Bar[q]; #---------------------------------------------------------# # 기울기 분석 #---------------------------------------------------------# 기울기 = 고점기울기/ma(C,n*4)*10000; if 기울기 > 2 then 고점상태 = 상승; else if 기울기 < -2 then 고점상태 = 하락; else 고점상태 = 평행; #---------------------------------------------------------# # 저점 추세선 분석 #---------------------------------------------------------# k = 0; for j = 1 to 19 { sumXY[j] = sumXY[j-1] + 저Idx[j]*저[j]; sumX[j] = sumX[j-1] + 저Idx[j]; sumY[j] = sumY[j-1] + 저[j]; sumX²[j] = sumX²[j-1] + 저Idx[j]^2; sumY²[j] = sumY²[j-1] + 저[j]^2; #---------------------------------------------------------# # 상관도가 가장 높은 선형회귀선 검색 #---------------------------------------------------------# 저점상관계수[j] = ((j*sumXY[j] - sumX[j]*sumY[j])/ Sqrt((j*sumX²[j] - sumX[j]^2)*(j*sumY²[j] - sumY[j]^2))); if j >= 3 and Abs(저점상관계수[k]) < Abs(저점상관계수[j]) then k = j; } 저점기울기 = (k*sumXY[k] - sumX[k]*sumY[k])/(k*sumX²[k] - sumX[k]^2); #---------------------------------------------------------# # 가장 외곽을 지나는 추세선 검색 #---------------------------------------------------------# q = 1; for j = 2 to k { if 저점기울기*저Bar[q]+저[q] > 저점기울기*저Bar[j]+저[j] then q = j; } 저점절편 = 저[q]; 저점Bar = 저Bar[q]; #---------------------------------------------------------# # 기울기 분석 #---------------------------------------------------------# 기울기 = 저점기울기/ma(C,n*4)*10000; if 기울기 > 2 then 저점상태 = 상승; else if 기울기 < -2 then 저점상태 = 하락; else 저점상태 = 평행; #---------------------------------------------------------# # 고점과 저점 추세를 비교하여 패턴판별 #---------------------------------------------------------# 패턴번호 = 0; if 고점상태 == 평행 and 저점상태 == 평행 then 패턴번호 = 1; if 고점상태 == 평행 and 저점상태 == 상승 then 패턴번호 = 2; if 고점상태 == 하락 and 저점상태 == 평행 then 패턴번호 = 3; if 고점상태 == 하락 and 저점상태 == 상승 then 패턴번호 = 4; if 고점상태 == 하락 and 저점상태 == 하락 and 고점기울기 < 저점기울기 then 패턴번호 = 5; #---------------------------------------------------------# #원형바닥,삼봉바닥 #---------------------------------------------------------# if 패턴번호 == 0 and 고LRS[4] < 고LRS[3] and 고LRS[3] < 고LRS[2] and 고LRS[2] < 고LRS[1] and 고LRS[4] < 0 and 고LRS[1] > 0 and 저LRS[4] < 저LRS[3] and 저LRS[3] < 저LRS[2] and 저LRS[2] < 저LRS[1] and 저LRS[4] < 0 and 저LRS[1] > 0 and 기간최저== min(저[6],저[5],저[4],저[3]) and max(고[9],고[8],고[7],고[6],고[5]) > 고[2] then 패턴번호 = 6; #---------------------------------------------------------# # 바닥 V자 모형 #---------------------------------------------------------# if 패턴번호 == 0 then { for j = 1 to 3 { 기울기 = (고[j]-저[j])/abs(고Bar[j]-저Bar[j])+ (고[j]-저[j+1])/abs(고Bar[j]-저Bar[j+1]); } 기울기 = 기울기/6; 평균기울기 = ema(기울기,n*10); 평균대비하락각 = Atan((고[1]-저[1])/abs(고Bar[1]-저Bar[1])/평균기울기)*180/pie(); 평균대비상승각 = Atan((H-저[1])/저Bar[1]/평균기울기)*180/pie(); if 고bar[1]-저bar[1]>= n*3 and //장기하락, V자형 나오기 쉬움 평균대비하락각 >= 60 and 평균대비상승각 >= 60 then //각도가 60도이상 패턴번호 = 7; } if 패턴번호 > 5 then { 고점기울기 = 0; 고점절편 = 고[1]; 고점Bar = 고Bar[1]; } } #---------------------------------------------------------# # 저항선, 지지선 계산 #---------------------------------------------------------# 저항선 = 고점기울기 * 고점Bar + 고점절편; 지지선 = 저점기울기 * 저점Bar + 저점절편; #=========================================================# # 시스템식 #=========================================================# macdVal = MACD(12,26); macdSig = ema(macdVal,9); stoK = StochasticsK(5,3); stoD = StochasticsD(5,3,3); if 패턴번호 > 0 and (저Bar[1]==n or C[1] <= 저항선[1]) and C > 저항선 and iff(지표사용,(macdVal > macdSig and macdVal > 0) or (stoK > stoD and stoK > 50),1) then { if 패턴번호 == 1 then Buy("직사각"); if 패턴번호 == 2 then Buy("상향직각삼각"); if 패턴번호 == 3 then Buy("하향직각삼각"); if 패턴번호 == 4 then Buy("대칭삼각"); if 패턴번호 == 5 then Buy("하락쐐기"); if 패턴번호 == 6 then Buy("원형바닥"); if 패턴번호 == 7 then Buy("바닥V자"); } if 지표사용 and 패턴번호 > 0 and 저항선 > 0 and C > 저항선 then { if CrossUp(macdVal,macdSig) and macdVal > 0 then Buy("MACD골드크로스"); if CrossUp(stoK,stoD) and stoK > 50 and (C > ma(c,5) or C > ma(C,20)) then Buy("스토K골드크로스"); } if 지표사용 then { if CrossDown(macdVal,macdSig) and macdVal < 0 then ExitLong("macd데드크로스"); if CrossDown(stoK,stoD) and stoK < 50 and (C < ma(c,5) or C < ma(C,20)) then ExitLong("스토K데드크로스"); } if CrossDown(C,저[1]) then ExitLong("추세종료");
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2011-02-21 16:39:15

안녕하세요 예스스탁입니다. 수식 검증상에는 문제가 없습니다. 다만 외부변수 중에 true나 false로 사용하는 변수가 있어 해당 외부변수는 최적화가 가능하지 않아 초기 적용시 에러가 납니다. 해당 변수를 숫자형으로 변경했습니다. 지표사용을 하시려면 1, 아니면 0으로 넣으시면 됩니다. Input:n(5),r(1.025),지표사용(1); Var:j(0),k(0),q(0),기간최저(0),고점상태(0),저점상태(0),고점기울기(0),고점절편(0), 저점기울기(0),저점절편(0),고점Bar(0),저점Bar(0),패턴번호(0),기울기(0), 저항선(0),지지선(0),상승(100),하락(-100),평행(1), 평균기울기(0), 평균대비하락각(0),평균대비상승각(0); Var:macdVal(0),macdSig(0),stoK(0),stoD(0); Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0),고Idx[20](0),저Idx[20](0), 고LRS[20](0),저LRS[20](0),sumXY[20](0),sumX[20](0),sumY[20](0),sumX²[20](0), sumY²[20](0),고점상관계수[20](0),저점상관계수[20](0); #---------------------------------------------------------# # index()와 마찬가지로 1봉이 바뀔 때마다 1씩 증가 #---------------------------------------------------------# for j = 1 to 19 { 고Bar[j] = 고Bar[j] + 1; 저Bar[j] = 저Bar[j] + 1; 고Idx[j] = Index - 고Bar[j]; 저Idx[j] = Index - 저Bar[j]; } 고점Bar = 고점Bar + 1; 저점Bar = 저점Bar + 1; #=========================================================# # 파동선 계산 #=========================================================# # 전고점(Peak) 계산 #---------------------------------------------------------# if Highest(H,n)[n+1] <= H[n] and H[n] > Highest(H,n) then { if 고Bar[1] > 저Bar[1] then { for j = 18 downto 1 { 고[j+1] = 고[j]; 고Bar[j+1] = 고Bar[j]; 고Idx[j+1] = 고Idx[j]; 고LRS[j+1] = 고LRS[j]; } } if 고Bar[1] > 저Bar[1] or 고[1] <= H[n] then { 고[1] = H[n]; 고Bar[1] = n; 고Idx[1] = Index - 고Bar[1]; sumXY[1] = 고Idx[3]*고[3] + 고Idx[2]*고[2] + 고Idx[1]*고[1]; sumX[1] = 고Idx[3] + 고Idx[2] + 고Idx[1]; sumY[1] = 고[3] + 고[2] + 고[1]; sumX²[1] = 고Idx[3]^2 + 고Idx[2]^2 + 고Idx[1]^2; 고LRS[1] = (3*sumXY[1] - sumX[1]*sumY[1])/(3*sumX²[1] - sumX[1]^2); } } #---------------------------------------------------------# # 전저점(Trough) 계산 #---------------------------------------------------------# if Lowest(L,n)[n+1] >= L[n] and L[n] < Lowest(L,n) then { if 저Bar[1] > 고Bar[1] then { for j = 18 downto 1 { 저[j+1] = 저[j]; 저Bar[j+1] = 저Bar[j]; 저Idx[j+1] = 저Idx[j]; 저LRS[j+1] = 저LRS[j]; } } if 저Bar[1] > 고Bar[1] or 저[1] >= L[n] then { 저[1] = L[n]; 저Bar[1] = n; 저Idx[1] = Index - 저Bar[1]; sumXY[1] = 저Idx[3]*저[3] + 저Idx[2]*저[2] + 저Idx[1]*저[1]; sumX[1] = 저Idx[3] + 저Idx[2] + 저Idx[1]; sumY[1] = 저[3] + 저[2] + 저[1]; sumX²[1] = 저Idx[3]^2 + 저Idx[2]^2 + 저Idx[1]^2; 저LRS[1] = (3*sumXY[1] - sumX[1]*sumY[1])/(3*sumX²[1] - sumX[1]^2); } } #----------------------------------------------------------------------------# # 선형회귀방정식 # #----------------------------------------------------------------------------# # nΣxy - (Σx)(Σy) # # 기울기 a = --------------------- # # nΣx²- (Σx)² # # # # = (n*sum(xy) - sum(x) * sum(y)) / (n*sum(x^2)-sum(x)^2) # # # # (Σy)(Σx²)-(Σx)(Σxy) # # 절편 b = --------------------------- # # nΣx²- (Σx)² # # # # = (sum(y)*sum(x^2) - sum(x)*sum(xy)) / (n*sum(x^2) - sum(x)^2) # #----------------------------------------------------------------------------# # 상관도 공식 # #----------------------------------------------------------------------------# # n(Σxy) - (Σx)(Σy) # r = ------------------------------------- # # √[nΣx²- (Σx)²][nΣy²- (Σy)²] # # # # =(n*sum(xy)-sum(x)*sum(y))/sqrt((n*sum(x^2)-sum(x)^2)(n*sum(y^2)-sum(y)^2))# #----------------------------------------------------------------------------# #=========================================================# # 파동분석 #=========================================================# 기간최저 = Lowest(L,n*20); if 저[1][1] != 저[1] or 저Bar[1][1] + 1 != 저Bar[1] then { //저점 변동이 있을 경우 #---------------------------------------------------------# # 고점 추세선 분석 #---------------------------------------------------------# k = 0; for j = 1 to 19 { sumXY[j] = sumXY[j-1] + 고Idx[j]*고[j]; sumX[j] = sumX[j-1] + 고Idx[j]; sumY[j] = sumY[j-1] + 고[j]; sumX²[j] = sumX²[j-1] + 고Idx[j]^2; sumY²[j] = sumY²[j-1] + 고[j]^2; #---------------------------------------------------------# # 상관도가 가장 높은 선형회귀선 검색 #---------------------------------------------------------# 고점상관계수[j] = ((j*sumXY[j] - sumX[j]*sumY[j])/ Sqrt((j*sumX²[j] - sumX[j]^2)*(j*sumY²[j] - sumY[j]^2))); if j >= 3 and Abs(고점상관계수[k]) < Abs(고점상관계수[j]) then k = j; } 고점기울기 = (k*sumXY[k] - sumX[k]*sumY[k])/(k*sumX²[k] - sumX[k]^2); #---------------------------------------------------------# # 가장 외곽을 지나는 추세선 검색 #---------------------------------------------------------# q = 1; for j = 2 to k { if 고점기울기*고Bar[q]+고[q] < 고점기울기*고Bar[j]+고[j] then q = j; } 고점절편 = 고[q]; 고점Bar = 고Bar[q]; #---------------------------------------------------------# # 기울기 분석 #---------------------------------------------------------# 기울기 = 고점기울기/ma(C,n*4)*10000; if 기울기 > 2 then 고점상태 = 상승; else if 기울기 < -2 then 고점상태 = 하락; else 고점상태 = 평행; #---------------------------------------------------------# # 저점 추세선 분석 #---------------------------------------------------------# k = 0; for j = 1 to 19 { sumXY[j] = sumXY[j-1] + 저Idx[j]*저[j]; sumX[j] = sumX[j-1] + 저Idx[j]; sumY[j] = sumY[j-1] + 저[j]; sumX²[j] = sumX²[j-1] + 저Idx[j]^2; sumY²[j] = sumY²[j-1] + 저[j]^2; #---------------------------------------------------------# # 상관도가 가장 높은 선형회귀선 검색 #---------------------------------------------------------# 저점상관계수[j] = ((j*sumXY[j] - sumX[j]*sumY[j])/ Sqrt((j*sumX²[j] - sumX[j]^2)*(j*sumY²[j] - sumY[j]^2))); if j >= 3 and Abs(저점상관계수[k]) < Abs(저점상관계수[j]) then k = j; } 저점기울기 = (k*sumXY[k] - sumX[k]*sumY[k])/(k*sumX²[k] - sumX[k]^2); #---------------------------------------------------------# # 가장 외곽을 지나는 추세선 검색 #---------------------------------------------------------# q = 1; for j = 2 to k { if 저점기울기*저Bar[q]+저[q] > 저점기울기*저Bar[j]+저[j] then q = j; } 저점절편 = 저[q]; 저점Bar = 저Bar[q]; #---------------------------------------------------------# # 기울기 분석 #---------------------------------------------------------# 기울기 = 저점기울기/ma(C,n*4)*10000; if 기울기 > 2 then 저점상태 = 상승; else if 기울기 < -2 then 저점상태 = 하락; else 저점상태 = 평행; #---------------------------------------------------------# # 고점과 저점 추세를 비교하여 패턴판별 #---------------------------------------------------------# 패턴번호 = 0; if 고점상태 == 평행 and 저점상태 == 평행 then 패턴번호 = 1; if 고점상태 == 평행 and 저점상태 == 상승 then 패턴번호 = 2; if 고점상태 == 하락 and 저점상태 == 평행 then 패턴번호 = 3; if 고점상태 == 하락 and 저점상태 == 상승 then 패턴번호 = 4; if 고점상태 == 하락 and 저점상태 == 하락 and 고점기울기 < 저점기울기 then 패턴번호 = 5; #---------------------------------------------------------# #원형바닥,삼봉바닥 #---------------------------------------------------------# if 패턴번호 == 0 and 고LRS[4] < 고LRS[3] and 고LRS[3] < 고LRS[2] and 고LRS[2] < 고LRS[1] and 고LRS[4] < 0 and 고LRS[1] > 0 and 저LRS[4] < 저LRS[3] and 저LRS[3] < 저LRS[2] and 저LRS[2] < 저LRS[1] and 저LRS[4] < 0 and 저LRS[1] > 0 and 기간최저== min(저[6],저[5],저[4],저[3]) and max(고[9],고[8],고[7],고[6],고[5]) > 고[2] then 패턴번호 = 6; #---------------------------------------------------------# # 바닥 V자 모형 #---------------------------------------------------------# if 패턴번호 == 0 then { for j = 1 to 3 { 기울기 = (고[j]-저[j])/abs(고Bar[j]-저Bar[j])+ (고[j]-저[j+1])/abs(고Bar[j]-저Bar[j+1]); } 기울기 = 기울기/6; 평균기울기 = ema(기울기,n*10); 평균대비하락각 = Atan((고[1]-저[1])/abs(고Bar[1]-저Bar[1])/평균기울기)*180/pie(); 평균대비상승각 = Atan((H-저[1])/저Bar[1]/평균기울기)*180/pie(); if 고bar[1]-저bar[1]>= n*3 and //장기하락, V자형 나오기 쉬움 평균대비하락각 >= 60 and 평균대비상승각 >= 60 then //각도가 60도이상 패턴번호 = 7; } if 패턴번호 > 5 then { 고점기울기 = 0; 고점절편 = 고[1]; 고점Bar = 고Bar[1]; } } #---------------------------------------------------------# # 저항선, 지지선 계산 #---------------------------------------------------------# 저항선 = 고점기울기 * 고점Bar + 고점절편; 지지선 = 저점기울기 * 저점Bar + 저점절편; #=========================================================# # 시스템식 #=========================================================# macdVal = MACD(12,26); macdSig = ema(macdVal,9); stoK = StochasticsK(5,3); stoD = StochasticsD(5,3,3); if 패턴번호 > 0 and (저Bar[1]==n or C[1] <= 저항선[1]) and C > 저항선 and iff(지표사용==1,(macdVal > macdSig and macdVal > 0) or (stoK > stoD and stoK > 50),1) then { if 패턴번호 == 1 then Buy("직사각"); if 패턴번호 == 2 then Buy("상향직각삼각"); if 패턴번호 == 3 then Buy("하향직각삼각"); if 패턴번호 == 4 then Buy("대칭삼각"); if 패턴번호 == 5 then Buy("하락쐐기"); if 패턴번호 == 6 then Buy("원형바닥"); if 패턴번호 == 7 then Buy("바닥V자"); } if 지표사용 == 1 and 패턴번호 > 0 and 저항선 > 0 and C > 저항선 then { if CrossUp(macdVal,macdSig) and macdVal > 0 then Buy("MACD골드크로스"); if CrossUp(stoK,stoD) and stoK > 50 and (C > ma(c,5) or C > ma(C,20)) then Buy("스토K골드크로스"); } if 지표사용 == 1 then { if CrossDown(macdVal,macdSig) and macdVal < 0 then ExitLong("macd데드크로스"); if CrossDown(stoK,stoD) and stoK < 50 and (C < ma(c,5) or C < ma(C,20)) then ExitLong("스토K데드크로스"); } if CrossDown(C,저[1]) then ExitLong("추세종료"); 즐거운 하루되세요 > 자아준 님이 쓴 글입니다. > 제목 : 수식 검증 부탁드립니다. > 수고하십니다. 밑의 수식을 시물레이션 하니 오류 메세지 가 나오는데 검정 및 수정 부탁드립니다. Input:n(5),r(1.025),지표사용(False); Var:j(0),k(0),q(0),기간최저(0),고점상태(0),저점상태(0),고점기울기(0),고점절편(0), 저점기울기(0),저점절편(0),고점Bar(0),저점Bar(0),패턴번호(0),기울기(0), 저항선(0),지지선(0),상승(100),하락(-100),평행(1), 평균기울기(0), 평균대비하락각(0),평균대비상승각(0); Var:macdVal(0),macdSig(0),stoK(0),stoD(0); Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0),고Idx[20](0),저Idx[20](0), 고LRS[20](0),저LRS[20](0),sumXY[20](0),sumX[20](0),sumY[20](0),sumX²[20](0), sumY²[20](0),고점상관계수[20](0),저점상관계수[20](0); #---------------------------------------------------------# # index()와 마찬가지로 1봉이 바뀔 때마다 1씩 증가 #---------------------------------------------------------# for j = 1 to 19 { 고Bar[j] = 고Bar[j] + 1; 저Bar[j] = 저Bar[j] + 1; 고Idx[j] = Index - 고Bar[j]; 저Idx[j] = Index - 저Bar[j]; } 고점Bar = 고점Bar + 1; 저점Bar = 저점Bar + 1; #=========================================================# # 파동선 계산 #=========================================================# # 전고점(Peak) 계산 #---------------------------------------------------------# if Highest(H,n)[n+1] <= H[n] and H[n] > Highest(H,n) then { if 고Bar[1] > 저Bar[1] then { for j = 18 downto 1 { 고[j+1] = 고[j]; 고Bar[j+1] = 고Bar[j]; 고Idx[j+1] = 고Idx[j]; 고LRS[j+1] = 고LRS[j]; } } if 고Bar[1] > 저Bar[1] or 고[1] <= H[n] then { 고[1] = H[n]; 고Bar[1] = n; 고Idx[1] = Index - 고Bar[1]; sumXY[1] = 고Idx[3]*고[3] + 고Idx[2]*고[2] + 고Idx[1]*고[1]; sumX[1] = 고Idx[3] + 고Idx[2] + 고Idx[1]; sumY[1] = 고[3] + 고[2] + 고[1]; sumX²[1] = 고Idx[3]^2 + 고Idx[2]^2 + 고Idx[1]^2; 고LRS[1] = (3*sumXY[1] - sumX[1]*sumY[1])/(3*sumX²[1] - sumX[1]^2); } } #---------------------------------------------------------# # 전저점(Trough) 계산 #---------------------------------------------------------# if Lowest(L,n)[n+1] >= L[n] and L[n] < Lowest(L,n) then { if 저Bar[1] > 고Bar[1] then { for j = 18 downto 1 { 저[j+1] = 저[j]; 저Bar[j+1] = 저Bar[j]; 저Idx[j+1] = 저Idx[j]; 저LRS[j+1] = 저LRS[j]; } } if 저Bar[1] > 고Bar[1] or 저[1] >= L[n] then { 저[1] = L[n]; 저Bar[1] = n; 저Idx[1] = Index - 저Bar[1]; sumXY[1] = 저Idx[3]*저[3] + 저Idx[2]*저[2] + 저Idx[1]*저[1]; sumX[1] = 저Idx[3] + 저Idx[2] + 저Idx[1]; sumY[1] = 저[3] + 저[2] + 저[1]; sumX²[1] = 저Idx[3]^2 + 저Idx[2]^2 + 저Idx[1]^2; 저LRS[1] = (3*sumXY[1] - sumX[1]*sumY[1])/(3*sumX²[1] - sumX[1]^2); } } #----------------------------------------------------------------------------# # 선형회귀방정식 # #----------------------------------------------------------------------------# # nΣxy - (Σx)(Σy) # # 기울기 a = --------------------- # # nΣx²- (Σx)² # # # # = (n*sum(xy) - sum(x) * sum(y)) / (n*sum(x^2)-sum(x)^2) # # # # (Σy)(Σx²)-(Σx)(Σxy) # # 절편 b = --------------------------- # # nΣx²- (Σx)² # # # # = (sum(y)*sum(x^2) - sum(x)*sum(xy)) / (n*sum(x^2) - sum(x)^2) # #----------------------------------------------------------------------------# # 상관도 공식 # #----------------------------------------------------------------------------# # n(Σxy) - (Σx)(Σy) # r = ------------------------------------- # # √[nΣx²- (Σx)²][nΣy²- (Σy)²] # # # # =(n*sum(xy)-sum(x)*sum(y))/sqrt((n*sum(x^2)-sum(x)^2)(n*sum(y^2)-sum(y)^2))# #----------------------------------------------------------------------------# #=========================================================# # 파동분석 #=========================================================# 기간최저 = Lowest(L,n*20); if 저[1][1] != 저[1] or 저Bar[1][1] + 1 != 저Bar[1] then { //저점 변동이 있을 경우 #---------------------------------------------------------# # 고점 추세선 분석 #---------------------------------------------------------# k = 0; for j = 1 to 19 { sumXY[j] = sumXY[j-1] + 고Idx[j]*고[j]; sumX[j] = sumX[j-1] + 고Idx[j]; sumY[j] = sumY[j-1] + 고[j]; sumX²[j] = sumX²[j-1] + 고Idx[j]^2; sumY²[j] = sumY²[j-1] + 고[j]^2; #---------------------------------------------------------# # 상관도가 가장 높은 선형회귀선 검색 #---------------------------------------------------------# 고점상관계수[j] = ((j*sumXY[j] - sumX[j]*sumY[j])/ Sqrt((j*sumX²[j] - sumX[j]^2)*(j*sumY²[j] - sumY[j]^2))); if j >= 3 and Abs(고점상관계수[k]) < Abs(고점상관계수[j]) then k = j; } 고점기울기 = (k*sumXY[k] - sumX[k]*sumY[k])/(k*sumX²[k] - sumX[k]^2); #---------------------------------------------------------# # 가장 외곽을 지나는 추세선 검색 #---------------------------------------------------------# q = 1; for j = 2 to k { if 고점기울기*고Bar[q]+고[q] < 고점기울기*고Bar[j]+고[j] then q = j; } 고점절편 = 고[q]; 고점Bar = 고Bar[q]; #---------------------------------------------------------# # 기울기 분석 #---------------------------------------------------------# 기울기 = 고점기울기/ma(C,n*4)*10000; if 기울기 > 2 then 고점상태 = 상승; else if 기울기 < -2 then 고점상태 = 하락; else 고점상태 = 평행; #---------------------------------------------------------# # 저점 추세선 분석 #---------------------------------------------------------# k = 0; for j = 1 to 19 { sumXY[j] = sumXY[j-1] + 저Idx[j]*저[j]; sumX[j] = sumX[j-1] + 저Idx[j]; sumY[j] = sumY[j-1] + 저[j]; sumX²[j] = sumX²[j-1] + 저Idx[j]^2; sumY²[j] = sumY²[j-1] + 저[j]^2; #---------------------------------------------------------# # 상관도가 가장 높은 선형회귀선 검색 #---------------------------------------------------------# 저점상관계수[j] = ((j*sumXY[j] - sumX[j]*sumY[j])/ Sqrt((j*sumX²[j] - sumX[j]^2)*(j*sumY²[j] - sumY[j]^2))); if j >= 3 and Abs(저점상관계수[k]) < Abs(저점상관계수[j]) then k = j; } 저점기울기 = (k*sumXY[k] - sumX[k]*sumY[k])/(k*sumX²[k] - sumX[k]^2); #---------------------------------------------------------# # 가장 외곽을 지나는 추세선 검색 #---------------------------------------------------------# q = 1; for j = 2 to k { if 저점기울기*저Bar[q]+저[q] > 저점기울기*저Bar[j]+저[j] then q = j; } 저점절편 = 저[q]; 저점Bar = 저Bar[q]; #---------------------------------------------------------# # 기울기 분석 #---------------------------------------------------------# 기울기 = 저점기울기/ma(C,n*4)*10000; if 기울기 > 2 then 저점상태 = 상승; else if 기울기 < -2 then 저점상태 = 하락; else 저점상태 = 평행; #---------------------------------------------------------# # 고점과 저점 추세를 비교하여 패턴판별 #---------------------------------------------------------# 패턴번호 = 0; if 고점상태 == 평행 and 저점상태 == 평행 then 패턴번호 = 1; if 고점상태 == 평행 and 저점상태 == 상승 then 패턴번호 = 2; if 고점상태 == 하락 and 저점상태 == 평행 then 패턴번호 = 3; if 고점상태 == 하락 and 저점상태 == 상승 then 패턴번호 = 4; if 고점상태 == 하락 and 저점상태 == 하락 and 고점기울기 < 저점기울기 then 패턴번호 = 5; #---------------------------------------------------------# #원형바닥,삼봉바닥 #---------------------------------------------------------# if 패턴번호 == 0 and 고LRS[4] < 고LRS[3] and 고LRS[3] < 고LRS[2] and 고LRS[2] < 고LRS[1] and 고LRS[4] < 0 and 고LRS[1] > 0 and 저LRS[4] < 저LRS[3] and 저LRS[3] < 저LRS[2] and 저LRS[2] < 저LRS[1] and 저LRS[4] < 0 and 저LRS[1] > 0 and 기간최저== min(저[6],저[5],저[4],저[3]) and max(고[9],고[8],고[7],고[6],고[5]) > 고[2] then 패턴번호 = 6; #---------------------------------------------------------# # 바닥 V자 모형 #---------------------------------------------------------# if 패턴번호 == 0 then { for j = 1 to 3 { 기울기 = (고[j]-저[j])/abs(고Bar[j]-저Bar[j])+ (고[j]-저[j+1])/abs(고Bar[j]-저Bar[j+1]); } 기울기 = 기울기/6; 평균기울기 = ema(기울기,n*10); 평균대비하락각 = Atan((고[1]-저[1])/abs(고Bar[1]-저Bar[1])/평균기울기)*180/pie(); 평균대비상승각 = Atan((H-저[1])/저Bar[1]/평균기울기)*180/pie(); if 고bar[1]-저bar[1]>= n*3 and //장기하락, V자형 나오기 쉬움 평균대비하락각 >= 60 and 평균대비상승각 >= 60 then //각도가 60도이상 패턴번호 = 7; } if 패턴번호 > 5 then { 고점기울기 = 0; 고점절편 = 고[1]; 고점Bar = 고Bar[1]; } } #---------------------------------------------------------# # 저항선, 지지선 계산 #---------------------------------------------------------# 저항선 = 고점기울기 * 고점Bar + 고점절편; 지지선 = 저점기울기 * 저점Bar + 저점절편; #=========================================================# # 시스템식 #=========================================================# macdVal = MACD(12,26); macdSig = ema(macdVal,9); stoK = StochasticsK(5,3); stoD = StochasticsD(5,3,3); if 패턴번호 > 0 and (저Bar[1]==n or C[1] <= 저항선[1]) and C > 저항선 and iff(지표사용,(macdVal > macdSig and macdVal > 0) or (stoK > stoD and stoK > 50),1) then { if 패턴번호 == 1 then Buy("직사각"); if 패턴번호 == 2 then Buy("상향직각삼각"); if 패턴번호 == 3 then Buy("하향직각삼각"); if 패턴번호 == 4 then Buy("대칭삼각"); if 패턴번호 == 5 then Buy("하락쐐기"); if 패턴번호 == 6 then Buy("원형바닥"); if 패턴번호 == 7 then Buy("바닥V자"); } if 지표사용 and 패턴번호 > 0 and 저항선 > 0 and C > 저항선 then { if CrossUp(macdVal,macdSig) and macdVal > 0 then Buy("MACD골드크로스"); if CrossUp(stoK,stoD) and stoK > 50 and (C > ma(c,5) or C > ma(C,20)) then Buy("스토K골드크로스"); } if 지표사용 then { if CrossDown(macdVal,macdSig) and macdVal < 0 then ExitLong("macd데드크로스"); if CrossDown(stoK,stoD) and stoK < 50 and (C < ma(c,5) or C < ma(C,20)) then ExitLong("스토K데드크로스"); } if CrossDown(C,저[1]) then ExitLong("추세종료");