커뮤니티

시스템식 검토 부탁드립니다.

프로필 이미지
종풍화성
2015-12-02 09:38:29
142
글번호 92970
답변완료
안녕하세요.. 전체 시스템식에서 15일이평선이 120일이평선 아래에 있을때, 즉 역배열인 경우에 아래와 같은 식을 추가하여 당초 매도위치에서 목표수익률을 낮춰 매도하기 위해 0.5를 곱하여 적용해 보았는데, 잘되지를 않습니다. ### 역배열시 매도를 위한 보정 시작 ### 매도1차 = 매도위치1차; 매도2차 = 매도위치2차; # 15일이평선이 120일이평선 아래 있으면 즉, 역배열이면 # 원래 매도위치에서 절반(0.5) 보정하여 매도함. if ma2 < ma1 and DayClose(120+1) > 0 Then { 매도1차 = 매도1차 * 0.5; 매도2차 = 매도2차 * 0.5; } ### 역배열시 매도를 위한 보정 끝 ### 확인해 주시고 검토 부탁드립니다. ------- 전체 시스템식입니다. ------------------------------------------------------- ## 지수데이타를 참조하여, 매수위치를 달리함. ## 하향추세 판단을 15일선과 120일선의 위치를 비교하여 판단함. ## 시간제한 있음. ## 외부변수 설정 ## input : 전략시작일자(20151116), 전략시작시간(090000), 전략매수금액(1500); input : 전략종료일자(20161230); input : 악재시갭하락(5), 악재보정계수(5), 이평보정계수(1), 전일대비하락(-3), 지수보정계수(1); input : 매수위치보정(1), 매수기준엔벨(7); input : 매수위치1차(7), 매수위치2차(7), 매수위치3차(14); input : 매도위치1차(7), 매도위치2차(14); input : 전략진입횟수(100); input : 타점보유일수(5); input : 매수비중1차(35), 매수비중2차(30), 매수비중3차(35); input : 매도비중1차(50), 매도비중2차(50); ## 내부변수 설정 ## var : sum(0,data1),mav(0,data1),cnt(0,data1),eup(0,data1),edn(0,data1); var : Didx(0,data1),LatestEntryDidx(0,data1),Ecnt(0,data1); var : TimeCond(false,data1),Xcond1(false,data1),Xcond2(false,data1),Loss(0,data1),LatestEntrylow(0,data1); var : Period(0,data1),매수1차(0,data1),매도1차(0,data1),매도2차(0,data1); var : cum1(0,data1),cum2(0,data1),ma1(0,data1),ma2(0,data1),ma3(0,data1); var : D2rate(0,data2); # 일자수 계산 if date != date[1] Then Didx = Didx+1; # 일봉 120이평 계산 cum1 = 0; for cnt = 1 to 119 { cum1 = cum1+DayClose(cnt); } ma1 = cum1/120; # 일봉 15이평 계산 cum2 = 0; for cnt = 0 to 14 { cum2 = cum2+DayClose(cnt); } ma2 = cum2/15; ### 매수를 위한 각 보정계수를 설정 시작 ### # 기본값은 기간은 P, %는 매수위치1차 Period = 매수기준엔벨; 매수1차 = 매수위치1차; # 악재가 발생하여 갭하락하면 # 기간은 기존 Period값 + 악재보정계수 # %는 기존 매수1차값에 + 악재보정계수 if dayopen < DayClose(1)*(1-악재시갭하락/100) Then { Period = Period + 악재보정계수; 매수1차 = 매수1차 + 악재보정계수; } # 15일 이평이 120이평 아래에 있으면 (또한 지정한 기간의 일봉데이타가 있으면) # 기간은 기존 Period값+이평보정계수 # %는 기존 매수1차값에 + 이평보정계수 if ma2 < ma1 and DayClose(120+1) > 0 Then { Period = Period + 이평보정계수; 매수1차 = 매수1차 + 이평보정계수; } # data2의 1일전 대비 등락율 D2rate = data2((C-CloseD(1))/CloseD(1)*100); # 지수가 전일대비 크게 하락하면 # 기간은 기존 Period값 + 지수보정계수 # %는 기존 매수1차값에 + 지수보정계수 if D2rate <= 전일대비하락 Then { Period = Period + 지수보정계수; 매수1차 = 매수1차 + 지수보정계수; } ### 매수를 위한 각 보정계수 설정 끝 ### ### 역배열시 매도를 위한 보정 시작 ### 매도1차 = 매도위치1차; 매도2차 = 매도위치2차; # 15일이평선이 120일이평선 아래 있으면 즉, 역배열이면 # 원래 매도위치에서 절반(0.5) 보정하여 매도함. if ma2 < ma1 and DayClose(120+1) > 0 Then { 매도1차 = 매도1차 * 0.5; 매도2차 = 매도2차 * 0.5; } ### 역배열시 매도를 위한 보정 끝 ### # 당일포함 일봉 Period개의 종가를 누적 sum = 0; for cnt = 0 to Period-1 { sum = sum+DayClose(cnt); } # 누적값을 Period로 나누어 평균값 산출 mav = sum/Period; # 엔벨로프 상단 계산 Eup = mav+mav*(매수1차/100); # 엔벨로프 하단 계산 Edn = mav-mav*(매수1차/100); # 지정일 지정시간이 되면 TimeCond는 True(그전에는 false) if sdate == 전략시작일자 and (stime == 전략시작시간 or (stime > 전략시작시간 and stime[1] < 전략시작시간 )) then TimeCond = true; if sdate > 전략종료일자 Then TimeCond = false; ########################################################################################################################### ### TimeCond가 True가 된 후 ### if TimeCond == true then { if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then Ecnt = Ecnt+1; # 무포지션 상태에서 매수위치1차에 도달하면 매수 if MarketPosition == 0 and Ecnt < 전략진입횟수 and stime < 144200 Then buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중1차/100))); ## 첫매수이후 ## if MarketPosition == 1 Then { # 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화 if CurrentContracts > CurrentContracts[1] Then Xcond1 = false; # 최근 진입시점의 일자수 저장 if CurrentContracts > CurrentContracts[1] Then { LatestEntryDidx = Didx; LatestEntrylow = L; } # 1차매수 발생 후 매수위치2차에 도달하면 매수 if MaxEntries == 1 and stime < 144200 Then buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략매수금액*10000/c)*(매수비중2차/100))); # 1차매수 발생 후 매수위치3차에 도달하면 매수 if MaxEntries == 2 and stime < 144200 Then buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100))); # 1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도") then Xcond1 = true; # 2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도") then Xcond2 = true; # Xcond1이 false일때 # 진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false and stime < 144200 Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); # Xcond2가 false일때 # 진입이후 최저가에서 매도위치2차 만큼 상승하면 전량 청산 if Xcond2 == false and stime < 144200 Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100)); # 최근 진입후 보유일수 이상 경과(현재 일자수가 최근 진입시점의 일자수보다 보유일수 이상 증가) if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then { # 최근 진입이후 보유일수가 되었을때의 최근진입일 포함 보유일수동안 최저가 계산 if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then { Loss = daylow(1); for cnt = 1 to (타점보유일수-1) { if daylow(cnt) < Loss Then Loss = daylow(cnt); } } # Loss값 이하로 가격하락하면 전량 청산 exitlong("손절",AtStop,Loss); } # 최종 매수일 포함 5일경과되면 다음날 시가에 매도 if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then { exitlong("익절1",AtMarket); } # 1차매도가 발생한 상황 # 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산 # if L < LatestEntrylow and Xcond1 == false Then # LatestEntrylow = L; # if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then { # exitlong("익절2",AtStop,LatestEntrylow); # "익절2"는 상황에 따라 적용유무를 달리함. # } } # 105번행 # 첫매수이후 if MarketPosition == 1 Then { 의 괄호를 닫아 줌. ## 매수포지션이 아니면 false로 초기화 ## else { Xcond1 = false; Xcond2 = false; } } # 96번행 # TimeCond가 True가 된 후 if TimeCond == true then { 의 괄호를 닫아 줌.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-12-02 16:12:43

안녕하세요 예스스탁입니다. 이평에 따른 값을 변수에 저장하고 해당 변수를 사용하지 않으셨습니다. input : 매도위치1차(7), 매도위치2차(14); ### 역배열시 매도를 위한 보정 시작 ### 매도1차 = 매도위치1차; 매도2차 = 매도위치2차; # 15일이평선이 120일이평선 아래 있으면 즉, 역배열이면 # 원래 매도위치에서 절반(0.5) 보정하여 매도함. if ma2 < ma1 and DayClose(120+1) > 0 Then { 매도1차 = 매도1차 * 0.5; 매도2차 = 매도2차 * 0.5; } ~~~~~~ # Xcond1이 false일때 # 진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false and stime < 144200 Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); # Xcond2가 false일때 # 진입이후 최저가에서 매도위치2차 만큼 상승하면 전량 청산 if Xcond2 == false and stime < 144200 Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100)); 위 내용을 보시면 매도1차와 매도2차는 기본값은 매도위치1차(7),매도위치1차(14)인대 이평이 역배열이면 절반값으로 변경이 됩니다. 하지만 매도식에서는 input으로 선언된 매도위치1차(7),매도위치2(14)차 값을 사용하고 있습니다. 변수에 계산한 값이 있으므로 매도1차,매도2차를 변수를 매도식에 사용하셔야 합니다. # Xcond1이 false일때 # 진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false and stime < 144200 Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); # Xcond2가 false일때 # 진입이후 최저가에서 매도위치2차 만큼 상승하면 전량 청산 if Xcond2 == false and stime < 144200 Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도2차/100)); 즐거운 하루되세요 > 종풍화성 님이 쓴 글입니다. > 제목 : 시스템식 검토 부탁드립니다. > 안녕하세요.. 전체 시스템식에서 15일이평선이 120일이평선 아래에 있을때, 즉 역배열인 경우에 아래와 같은 식을 추가하여 당초 매도위치에서 목표수익률을 낮춰 매도하기 위해 0.5를 곱하여 적용해 보았는데, 잘되지를 않습니다. ### 역배열시 매도를 위한 보정 시작 ### 매도1차 = 매도위치1차; 매도2차 = 매도위치2차; # 15일이평선이 120일이평선 아래 있으면 즉, 역배열이면 # 원래 매도위치에서 절반(0.5) 보정하여 매도함. if ma2 < ma1 and DayClose(120+1) > 0 Then { 매도1차 = 매도1차 * 0.5; 매도2차 = 매도2차 * 0.5; } ### 역배열시 매도를 위한 보정 끝 ### 확인해 주시고 검토 부탁드립니다. ------- 전체 시스템식입니다. ------------------------------------------------------- ## 지수데이타를 참조하여, 매수위치를 달리함. ## 하향추세 판단을 15일선과 120일선의 위치를 비교하여 판단함. ## 시간제한 있음. ## 외부변수 설정 ## input : 전략시작일자(20151116), 전략시작시간(090000), 전략매수금액(1500); input : 전략종료일자(20161230); input : 악재시갭하락(5), 악재보정계수(5), 이평보정계수(1), 전일대비하락(-3), 지수보정계수(1); input : 매수위치보정(1), 매수기준엔벨(7); input : 매수위치1차(7), 매수위치2차(7), 매수위치3차(14); input : 매도위치1차(7), 매도위치2차(14); input : 전략진입횟수(100); input : 타점보유일수(5); input : 매수비중1차(35), 매수비중2차(30), 매수비중3차(35); input : 매도비중1차(50), 매도비중2차(50); ## 내부변수 설정 ## var : sum(0,data1),mav(0,data1),cnt(0,data1),eup(0,data1),edn(0,data1); var : Didx(0,data1),LatestEntryDidx(0,data1),Ecnt(0,data1); var : TimeCond(false,data1),Xcond1(false,data1),Xcond2(false,data1),Loss(0,data1),LatestEntrylow(0,data1); var : Period(0,data1),매수1차(0,data1),매도1차(0,data1),매도2차(0,data1); var : cum1(0,data1),cum2(0,data1),ma1(0,data1),ma2(0,data1),ma3(0,data1); var : D2rate(0,data2); # 일자수 계산 if date != date[1] Then Didx = Didx+1; # 일봉 120이평 계산 cum1 = 0; for cnt = 1 to 119 { cum1 = cum1+DayClose(cnt); } ma1 = cum1/120; # 일봉 15이평 계산 cum2 = 0; for cnt = 0 to 14 { cum2 = cum2+DayClose(cnt); } ma2 = cum2/15; ### 매수를 위한 각 보정계수를 설정 시작 ### # 기본값은 기간은 P, %는 매수위치1차 Period = 매수기준엔벨; 매수1차 = 매수위치1차; # 악재가 발생하여 갭하락하면 # 기간은 기존 Period값 + 악재보정계수 # %는 기존 매수1차값에 + 악재보정계수 if dayopen < DayClose(1)*(1-악재시갭하락/100) Then { Period = Period + 악재보정계수; 매수1차 = 매수1차 + 악재보정계수; } # 15일 이평이 120이평 아래에 있으면 (또한 지정한 기간의 일봉데이타가 있으면) # 기간은 기존 Period값+이평보정계수 # %는 기존 매수1차값에 + 이평보정계수 if ma2 < ma1 and DayClose(120+1) > 0 Then { Period = Period + 이평보정계수; 매수1차 = 매수1차 + 이평보정계수; } # data2의 1일전 대비 등락율 D2rate = data2((C-CloseD(1))/CloseD(1)*100); # 지수가 전일대비 크게 하락하면 # 기간은 기존 Period값 + 지수보정계수 # %는 기존 매수1차값에 + 지수보정계수 if D2rate <= 전일대비하락 Then { Period = Period + 지수보정계수; 매수1차 = 매수1차 + 지수보정계수; } ### 매수를 위한 각 보정계수 설정 끝 ### ### 역배열시 매도를 위한 보정 시작 ### 매도1차 = 매도위치1차; 매도2차 = 매도위치2차; # 15일이평선이 120일이평선 아래 있으면 즉, 역배열이면 # 원래 매도위치에서 절반(0.5) 보정하여 매도함. if ma2 < ma1 and DayClose(120+1) > 0 Then { 매도1차 = 매도1차 * 0.5; 매도2차 = 매도2차 * 0.5; } ### 역배열시 매도를 위한 보정 끝 ### # 당일포함 일봉 Period개의 종가를 누적 sum = 0; for cnt = 0 to Period-1 { sum = sum+DayClose(cnt); } # 누적값을 Period로 나누어 평균값 산출 mav = sum/Period; # 엔벨로프 상단 계산 Eup = mav+mav*(매수1차/100); # 엔벨로프 하단 계산 Edn = mav-mav*(매수1차/100); # 지정일 지정시간이 되면 TimeCond는 True(그전에는 false) if sdate == 전략시작일자 and (stime == 전략시작시간 or (stime > 전략시작시간 and stime[1] < 전략시작시간 )) then TimeCond = true; if sdate > 전략종료일자 Then TimeCond = false; ########################################################################################################################### ### TimeCond가 True가 된 후 ### if TimeCond == true then { if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "1차매수" Then Ecnt = Ecnt+1; # 무포지션 상태에서 매수위치1차에 도달하면 매수 if MarketPosition == 0 and Ecnt < 전략진입횟수 and stime < 144200 Then buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략매수금액*10000/c)*(매수비중1차/100))); ## 첫매수이후 ## if MarketPosition == 1 Then { # 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화 if CurrentContracts > CurrentContracts[1] Then Xcond1 = false; # 최근 진입시점의 일자수 저장 if CurrentContracts > CurrentContracts[1] Then { LatestEntryDidx = Didx; LatestEntrylow = L; } # 1차매수 발생 후 매수위치2차에 도달하면 매수 if MaxEntries == 1 and stime < 144200 Then buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략매수금액*10000/c)*(매수비중2차/100))); # 1차매수 발생 후 매수위치3차에 도달하면 매수 if MaxEntries == 2 and stime < 144200 Then buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략매수금액*10000/c)*(매수비중3차/100))); # 1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도") then Xcond1 = true; # 2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도") then Xcond2 = true; # Xcond1이 false일때 # 진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false and stime < 144200 Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); # Xcond2가 false일때 # 진입이후 최저가에서 매도위치2차 만큼 상승하면 전량 청산 if Xcond2 == false and stime < 144200 Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100)); # 최근 진입후 보유일수 이상 경과(현재 일자수가 최근 진입시점의 일자수보다 보유일수 이상 증가) if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then { # 최근 진입이후 보유일수가 되었을때의 최근진입일 포함 보유일수동안 최저가 계산 if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then { Loss = daylow(1); for cnt = 1 to (타점보유일수-1) { if daylow(cnt) < Loss Then Loss = daylow(cnt); } } # Loss값 이하로 가격하락하면 전량 청산 exitlong("손절",AtStop,Loss); } # 최종 매수일 포함 5일경과되면 다음날 시가에 매도 if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then { exitlong("익절1",AtMarket); } # 1차매도가 발생한 상황 # 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산 # if L < LatestEntrylow and Xcond1 == false Then # LatestEntrylow = L; # if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then { # exitlong("익절2",AtStop,LatestEntrylow); # "익절2"는 상황에 따라 적용유무를 달리함. # } } # 105번행 # 첫매수이후 if MarketPosition == 1 Then { 의 괄호를 닫아 줌. ## 매수포지션이 아니면 false로 초기화 ## else { Xcond1 = false; Xcond2 = false; } } # 96번행 # TimeCond가 True가 된 후 if TimeCond == true then { 의 괄호를 닫아 줌.