예스스탁
예스스탁 답변
2009-11-23 16:15:38
안녕하세요
예스스탁입니다.
변수최적화는 수치형변수에 대해서만 최적화를 수행합니다.
외부변수에 논리형변수가 있으면 해당 에러 메세지가 출력됩니다.
아래와 같이 식을 작성하시면 true와 false값에 대해서도
최적화를 하실 수 있습니다.
true는 1,false는 1이 아닌값을 넣어주시면 됩니다.
input:n(4),미완성(0),RaffReg(1),SDeviation(0),StdEr(0);
Var:j(0),k(0),X(0),num(0),승수(2),
sumXY(0),sumX(0),sumY(0),sumX²(0),sumY²(0),
기울기(0),절편(0),선형회귀선(0),회귀채널폭(0),표준편차(0),표준오차(0),
라프회귀상(0),라프회귀하(0),표준편차상(0),표준편차하(0),미완성사용(False),
표준오차상(0),표준오차하(0),RaffRegression(false),StdDeviation(False),StdError(False);
Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0);
if 미완성 == 1 Then
미완성사용 = true;
Else
미완성사용 = false;
if RaffReg == 1 Then
RaffRegression = True;
Else
RaffRegression = false;
if SDeviation == 1 Then
StdDeviation = True;
Else
StdDeviation = false;
if StdEr == 1 Then
StdError = True;
Else
StdError = false;
#=========================================================#
# 초기처리 (Initialize Routine)
#=========================================================#
# index()와 마찬가지로 1봉이 바뀔 때마다 1씩 증가
#---------------------------------------------------------#
for j = 1 to 19 {
고Bar[j] = 고Bar[j] + 1;
저Bar[j] = 저Bar[j]+ 1;
}
X = Index;
#=========================================================#
# 주처리 (Main Routine) 파동계산
#=========================================================#
# 전고점(peak) 계산
#---------------------------------------------------------#
//Highest(H,2)[3] <= H[2] and H[2] > Highest(H,2)
if Highest(H,n)[n+1] <= H[n] and H[n] > Highest(H,n) then {
if 미완성사용 == true then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
고[1] = H[n];
고Bar[1] = n;
if 저Bar[1] > 고Bar[2] then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
k = n + 1;
for j = n + 2 to 고Bar[2]-1 {
if L[k] > L[j] then k = j;
}
저[1] = L[k];
저Bar[1] = k;
}
}
if 미완성사용 == False then {
if 고Bar[1] > 저Bar[1] then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
}
if 고Bar[1] > 저Bar[1] or 고[1] <= h[n] then {
고[1] = h[n];
고Bar[1] = n;
}
}
}
#---------------------------------------------------------#
# 전저점(Trough) 계산
#---------------------------------------------------------#
//Lowest(L,2)[3] >= L[2] and L[2] < Lowest(L,2)
if Lowest(L,n)[n+1] >= L[n] and L[n] < Lowest(L,n) then {
if 미완성사용 == true then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
저[1] = L[n];
저Bar[1] = n;
if 고Bar[1] > 저Bar[2] then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
k = n + 1;
for j = n + 2 to 저Bar[2]-1 {
if H[k] < H[j] then k = j;
}
고[1] = H[k];
고Bar[1] = k;
}
}
if 미완성사용 == False then {
if 저Bar[1] > 고Bar[1] then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
}
저[1] = L[n];
저Bar[1] = n;
}
}
if 저Bar[1] == n or 고Bar[1] == n then {
#==========================================================================#
# 선형회귀방정식 #
#==========================================================================#
# 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) #
#==========================================================================#
if 저Bar[1] == n then num = 저Bar[2] - 저Bar[1] + 1;
if 고Bar[1] == n then num = 고Bar[2] - 고Bar[1] + 1;
sumXY = AccumN(X[n]*C[n],num);
sumX = AccumN(X[n],num);
sumY = AccumN(C[n],num);
sumX²= AccumN(X[n]^2,num);
sumY²= AccumN(C[n]^2,num);
기울기 = ((num * sumXY) - (sumX * sumY)) / (num * sumX²- sumX^2);
절편 = ((sumY * sumX²) - (sumX * sumXY)) / (num * sumX²- sumX^2);
회귀채널폭 = 0;
for j = 0 to num - 1 {
var1 = max(H[n+j]-(기울기*x[n+j]+절편),(기울기*x[n+j]+절편)-L[n+j]);
if 회귀채널폭 < var1 then
회귀채널폭 = var1;
}
#==========================================================================#
# 표준편차 공식 #
#==========================================================================#
# _________________ #
# / nΣx²- (Σx)² #
# STD = / ---------------- #
# √ n(n-1) #
# #
# sqrt((n*sum(x^2)-sum(x)^2)/n*(n-1)) #
#==========================================================================#
표준편차 = sqrt((num*sumY² - sumY^2)/(num*(num-1)));
#==========================================================================#
# 표준오차 공식 #
#==========================================================================#
# _______________________________________________________ #
# / 1 [nΣxy - (Σx)(Σy)]² #
# Sxy = / [ ------- ][nΣy²- (Σy)²- ----------------------- ] #
# √ n(n-2) nΣx²- (Σx)² #
# #
# sqrt(1/(n*(n-2)))*(n*sum(y^2)-sum(y)^2-((n*sum(xy)-sum(x)*sum(y))^2/ #
# (n*sum(x^2)-sum(x)^2))) #
#==========================================================================#
표준오차 = sqrt((1/(num*(num-2)))*(num*sumY²-sumY^2-
((num*sumXY-sumX*sumY)^2)/(num*sumX²-sumX^2)));
}
선형회귀선 = 기울기 * x + 절편;
라프회귀상 = 선형회귀선 + 회귀채널폭;
라프회귀하 = 선형회귀선 - 회귀채널폭;
표준편차상 = 선형회귀선 + (표준편차 * 승수);
표준편차하 = 선형회귀선 - (표준편차 * 승수);
표준오차상 = 선형회귀선 + (표준오차 * 승수);
표준오차하 = 선형회귀선 - (표준오차 * 승수);
#=========================================================#
# 시스템식
#=========================================================#
if RaffRegression == True and 라프회귀상 > 0 and
CrossUp(C,라프회귀상) then
Buy("라프회귀상돌파");
if StdDeviation == True and 표준편차상 > 0 and
CrossUp(C,표준편차상) then
Buy("표준편차상돌파");
if StdError == True and 표준오차상 > 0 and
CrossUp(C,표준오차상) then
Buy("표준오차상돌파");
if RaffRegression == True and 라프회귀하 > 0 and
CrossDown(C,라프회귀하) then
Sell("라프회귀하돌파");
if StdDeviation == True and 표준편차하 > 0 and
CrossDown(C,표준편차하) then
Sell("표준편차하돌파");
if StdError == True and 표준오차하 > 0 and
CrossDown(C,표준오차하) then
Sell("표준오차하돌파");
즐거운 하루되세요
> HI_lee3428 님이 쓴 글입니다.
> 제목 : 부탁드립니다
> 추세식 매매인데 저꾸 오류가 나네요
부탁드립니다
(시뮬레이션에서 오류:논리값이나 논리표현식이 와야합니다)
input:n(4),미완성사용(False),RaffRegression(True),StdDeviation(False),StdError(False);
Var:j(0),k(0),X(0),num(0),승수(2),
sumXY(0),sumX(0),sumY(0),sumX²(0),sumY²(0),
기울기(0),절편(0),선형회귀선(0),회귀채널폭(0),표준편차(0),표준오차(0),
라프회귀상(0),라프회귀하(0),표준편차상(0),표준편차하(0),
표준오차상(0),표준오차하(0);
Array:고[20](0),저[20](0),고Bar[20](0),저Bar[20](0);
#=========================================================#
# 초기처리 (Initialize Routine)
#=========================================================#
# index()와 마찬가지로 1봉이 바뀔 때마다 1씩 증가
#---------------------------------------------------------#
for j = 1 to 19 {
고Bar[j] = 고Bar[j] + 1;
저Bar[j] = 저Bar[j]+ 1;
}
X = Index;
#=========================================================#
# 주처리 (Main Routine) 파동계산
#=========================================================#
# 전고점(peak) 계산
#---------------------------------------------------------#
//Highest(H,2)[3] <= H[2] and H[2] > Highest(H,2)
if Highest(H,n)[n+1] <= H[n] and H[n] > Highest(H,n) then {
if 미완성사용 == true then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
고[1] = H[n];
고Bar[1] = n;
if 저Bar[1] > 고Bar[2] then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
k = n + 1;
for j = n + 2 to 고Bar[2]-1 {
if L[k] > L[j] then k = j;
}
저[1] = L[k];
저Bar[1] = k;
}
}
if 미완성사용 == False then {
if 고Bar[1] > 저Bar[1] then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
}
if 고Bar[1] > 저Bar[1] or 고[1] <= h[n] then {
고[1] = h[n];
고Bar[1] = n;
}
}
}
#---------------------------------------------------------#
# 전저점(Trough) 계산
#---------------------------------------------------------#
//Lowest(L,2)[3] >= L[2] and L[2] < Lowest(L,2)
if Lowest(L,n)[n+1] >= L[n] and L[n] < Lowest(L,n) then {
if 미완성사용 == true then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
저[1] = L[n];
저Bar[1] = n;
if 고Bar[1] > 저Bar[2] then {
for j = 18 downto 1 {
고[j+1] = 고[j];
고Bar[j+1] = 고Bar[j];
}
k = n + 1;
for j = n + 2 to 저Bar[2]-1 {
if H[k] < H[j] then k = j;
}
고[1] = H[k];
고Bar[1] = k;
}
}
if 미완성사용 == False then {
if 저Bar[1] > 고Bar[1] then {
for j = 18 downto 1 {
저[j+1] = 저[j];
저Bar[j+1] = 저Bar[j];
}
}
저[1] = L[n];
저Bar[1] = n;
}
}
if 저Bar[1] == n or 고Bar[1] == n then {
#==========================================================================#
# 선형회귀방정식 #
#==========================================================================#
# 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) #
#==========================================================================#
if 저Bar[1] == n then num = 저Bar[2] - 저Bar[1] + 1;
if 고Bar[1] == n then num = 고Bar[2] - 고Bar[1] + 1;
sumXY = AccumN(X[n]*C[n],num);
sumX = AccumN(X[n],num);
sumY = AccumN(C[n],num);
sumX²= AccumN(X[n]^2,num);
sumY²= AccumN(C[n]^2,num);
기울기 = ((num * sumXY) - (sumX * sumY)) / (num * sumX²- sumX^2);
절편 = ((sumY * sumX²) - (sumX * sumXY)) / (num * sumX²- sumX^2);
회귀채널폭 = 0;
for j = 0 to num - 1 {
var1 = max(H[n+j]-(기울기*x[n+j]+절편),(기울기*x[n+j]+절편)-L[n+j]);
if 회귀채널폭 < var1 then
회귀채널폭 = var1;
}
#==========================================================================#
# 표준편차 공식 #
#==========================================================================#
# _________________ #
# / nΣx²- (Σx)² #
# STD = / ---------------- #
# √ n(n-1) #
# #
# sqrt((n*sum(x^2)-sum(x)^2)/n*(n-1)) #
#==========================================================================#
표준편차 = sqrt((num*sumY² - sumY^2)/(num*(num-1)));
#==========================================================================#
# 표준오차 공식 #
#==========================================================================#
# _______________________________________________________ #
# / 1 [nΣxy - (Σx)(Σy)]² #
# Sxy = / [ ------- ][nΣy²- (Σy)²- ----------------------- ] #
# √ n(n-2) nΣx²- (Σx)² #
# #
# sqrt(1/(n*(n-2)))*(n*sum(y^2)-sum(y)^2-((n*sum(xy)-sum(x)*sum(y))^2/ #
# (n*sum(x^2)-sum(x)^2))) #
#==========================================================================#
표준오차 = sqrt((1/(num*(num-2)))*(num*sumY²-sumY^2-
((num*sumXY-sumX*sumY)^2)/(num*sumX²-sumX^2)));
}
선형회귀선 = 기울기 * x + 절편;
라프회귀상 = 선형회귀선 + 회귀채널폭;
라프회귀하 = 선형회귀선 - 회귀채널폭;
표준편차상 = 선형회귀선 + (표준편차 * 승수);
표준편차하 = 선형회귀선 - (표준편차 * 승수);
표준오차상 = 선형회귀선 + (표준오차 * 승수);
표준오차하 = 선형회귀선 - (표준오차 * 승수);
#=========================================================#
# 시스템식
#=========================================================#
if RaffRegression == True and 라프회귀상 > 0 and
CrossUp(C,라프회귀상) then
Buy("라프회귀상돌파");
if StdDeviation == True and 표준편차상 > 0 and
CrossUp(C,표준편차상) then
Buy("표준편차상돌파");
if StdError == True and 표준오차상 > 0 and
CrossUp(C,표준오차상) then
Buy("표준오차상돌파");
if RaffRegression == True and 라프회귀하 > 0 and
CrossDown(C,라프회귀하) then
Sell("라프회귀하돌파");
if StdDeviation == True and 표준편차하 > 0 and
CrossDown(C,표준편차하) then
Sell("표준편차하돌파");
if StdError == True and 표준오차하 > 0 and
CrossDown(C,표준오차하) then
Sell("표준오차하돌파");