커뮤니티

시스템식 수정 부탁드립니다.

프로필 이미지
종풍화성
2015-10-28 20:51:51
196
글번호 91843
답변완료
안녕하세요.. 어제 오후 44748번글에 답변해 주신 내용입니다. ----------------------------------------------------------------- 안녕하세요 예스스탁입니다. 120일 이평만 체크하는 식이었습니다. 2개조건이 동시만족하면 시장보정계수를 적용하고 아니면 적용하지 않게 수정했습니다. 2개조건 중 하나만 만족해도 시장보정계수를 적용하고자 하시면 if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{ 로 변경하시면 됩니다. ------------------------------------------------------------------ 보내주신 시스템식과 답변내용을 참고해서 최종적으로... 2개조건 중 하나만 만족해도 시장보정계수를 적용하여 if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{ 로 해서 아래 시스템식과 같이 변경했습니다. 그러나 이식에서는 "갭하락(5)" 또는 "일봉이평기간(120)"과 관련해서 "시장보정계수(5)"를 동일하게 같이 적용했는데요, "갭하락(5)"에 관련해서는 "시장보정계수(5)"를 적용하고 "일봉이평기간(120)"과 관련해서는 "이평보정계수(5)"를 새롭게 변수설정해서 적용하고 싶습니다. 정리하자면 1) 시장상황이 좋지 않아 5% 이상 시가가 갭하락하면 "시장보정계수"를 적용해 원래 매수하려던 1차매수의 자리에서 보정계수만큼 낮게 매수함. 2) 일봉상 120일 이동평균선이 우하향하면 "이평보정계수"를 적용해 원래 매수하려던 1차매수의 자리에서 보정계수만큼 낮게 매수함. 3) 기존에는 갭하락과, 이동평균선의 조건에 따라 하나의 보정계수를 동일하게 적용했으나, 수정될 시스템식에는 각 조건에 따라 보정계수를 독립적으로 다르게 적용함. [질문] 수정된 시스템식에서 120일 이동평균선이 우하향하는 종목이 시가가 -5%이상 갭하락하면 즉, 보정계수를 적용해야 하는 경우가 동시에 2개가 발생하면 보정계수가 어떻게 적용되나요? 이경우 두개의 보정계수를 모두 적용하고 싶습니다. 즉, "시장보정계수(5)+이평보정계수(5)" 로 계산해서 전체보정계수 "10"의 효과를 보고 싶습니다. ------------------------------------------------------------------------------------ input : 전략식시작일자(20151028), 전략식시작시간(090000), 전략총매수금액(5000); input : 전략식종료일자(20151231); input : 갭하락(5), 시장보정계수(5), 일봉이평기간(120); input : P(10), 매수위치1차(10), 매수위치2차(7), 매수위치3차(14); input : 매수위치보정(1); input : 매도위치1차(7), 매도위치2차(14); input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35); input : 매도비중1차(50), 매도비중2차(50); input : 전략식진입횟수(100); input : 타점보유일수(5); var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0); var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0); var : Period(0),매수1차(0); var : cum1(0),cum2(0),ma1(0),ma2(0); # 일자수 계산 if date != date[1] Then Didx = Didx+1; # 일봉 120이평 계산(전일기준,전전일기준) cum1 = 0; cum2 = 0; for cnt = 1 to 일봉이평기간{ cum1 = cum1+DayClose(cnt); cum2 = cum2+DayClose(cnt+1); } # 전일기준 일봉 120일이평 ma1 = cum1/일봉이평기간; # 전전일기준 일봉 120일이평 ma2 = cum2/일봉이평기간; # 전일기준 120일이평이 전전일기준 120일이평보다 작거나 또는 갭하락이면 # 엔벨로프 기간은 P+시장보정계수 # 엔벨로프 Percent수치는 매수위치1차+시장보정계수 if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{ Period = P+시장보정계수; 매수1차 = 매수위치1차+시장보정계수; } else{ ##전일기준 120일이평이 전전일기준 120일이평 이상이거나 갭하락이 아니면 Period = P; 매수1차 = 매수위치1차; } #당일포함 일봉 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 < 전략식진입횟수 Then buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100))); #첫매수이후 if MarketPosition == 1 Then{ #최근 진입시점의 일자수 저장 if CurrentContracts > CurrentContracts[1] Then{ LatestEntryDidx = Didx; LatestEntrylow = L; } #1차매수 발생 후 매수위치2차에 도달하면 매수 if MaxEntries == 1 Then buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100))); #1차매수 발생 후 매수위치3차에 도달하면 매수 if MaxEntries == 2 Then buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100))); #1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true if LatestExitName(0) == "1차매도" then Xcond1 = true; #2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true if LatestExitName(0) == "2차매도" then Xcond2 = true; #Xcond1이 false일때 #진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); #Xcond2가 false일 #진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산 if Xcond2 == false Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100)); #최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가) if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{ #최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산 if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{ Loss = daylow(1); for cnt = 1 to 타점보유일수{ if daylow(cnt) < Loss Then Loss = daylow(cnt); } } #Loss값 이하로 가격하락하면 전량 청산 exitlong("손절",AtStop,Loss); } #최종 매수일 포함 3일경과되면 다음날 시가에 매도 if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{ exitlong("익절2",AtMarket); } # 1차매도가 발생한 상황 # 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산 # if L < LatestEntrylow and Xcond1 == false Then # LatestEntrylow = L; # if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{ # exitlong("익절1",AtStop,LatestEntrylow); # } } else{ #매수포지션이 아니면 false로 초기화 Xcond1 = false; Xcond2 = false; } }
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2015-10-29 10:02:28

안녕하세요 예스스탁입니다. input : 전략식시작일자(20151028), 전략식시작시간(090000), 전략총매수금액(5000); input : 전략식종료일자(20151231); input : 갭하락(5), 시장보정계수(5),일봉이평기간(120),이평보정계수(5); input : P(10), 매수위치1차(10), 매수위치2차(7), 매수위치3차(14); input : 매수위치보정(1); input : 매도위치1차(7), 매도위치2차(14); input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35); input : 매도비중1차(50), 매도비중2차(50); input : 전략식진입횟수(100); input : 타점보유일수(5); var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0); var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0); var : Period(0),매수1차(0); var : cum1(0),cum2(0),ma1(0),ma2(0); # 일자수 계산 if date != date[1] Then Didx = Didx+1; # 일봉 120이평 계산(전일기준,전전일기준) cum1 = 0; cum2 = 0; for cnt = 1 to 일봉이평기간{ cum1 = cum1+DayClose(cnt); cum2 = cum2+DayClose(cnt+1); } # 전일기준 일봉 120일이평 ma1 = cum1/일봉이평기간; # 전전일기준 일봉 120일이평 ma2 = cum2/일봉이평기간; #기본값은 기간은 P, %는 매수위치1차 Period = P; 매수1차 = 매수위치1차; #갭하락이면 #기간은 기존Period값+시장보정계수 #%는 기존 매수1차값에 + 시장보정계수 if dayopen < DayClose(1)*(1-갭하락) Then{ Period = Period + 시장보정계수; 매수1차 = 매수1차 + 시장보정계수; } #이평하락이면 #기간은 기존Period값+이평보정계수 #%는 기존 매수1차값에 + 이평보정계수 if ma1 < ma2 Then{ Period = Period + 이평보정계수; 매수1차 = 매수1차 + 이평보정계수; } #당일포함 일봉 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 < 전략식진입횟수 Then buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100))); #첫매수이후 if MarketPosition == 1 Then{ #최근 진입시점의 일자수 저장 if CurrentContracts > CurrentContracts[1] Then{ LatestEntryDidx = Didx; LatestEntrylow = L; } #1차매수 발생 후 매수위치2차에 도달하면 매수 if MaxEntries == 1 Then buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100))); #1차매수 발생 후 매수위치3차에 도달하면 매수 if MaxEntries == 2 Then buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100))); #1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true if LatestExitName(0) == "1차매도" then Xcond1 = true; #2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true if LatestExitName(0) == "2차매도" then Xcond2 = true; #Xcond1이 false일때 #진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); #Xcond2가 false일 #진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산 if Xcond2 == false Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100)); #최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가) if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{ #최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산 if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{ Loss = daylow(1); for cnt = 1 to 타점보유일수 { if daylow(cnt) < Loss Then Loss = daylow(cnt); } } #Loss값 이하로 가격하락하면 전량 청산 exitlong("손절",AtStop,Loss); } #최종 매수일 포함 3일경과되면 다음날 시가에 매도 if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{ exitlong("익절2",AtMarket); } # 1차매도가 발생한 상황 # 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산 # if L < LatestEntrylow and Xcond1 == false Then # LatestEntrylow = L; # if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{ # exitlong("익절1",AtStop,LatestEntrylow); # } } else{ #매수포지션이 아니면 false로 초기화 Xcond1 = false; Xcond2 = false; } } 즐거운 하루되세요 > 종풍화성 님이 쓴 글입니다. > 제목 : 시스템식 수정 부탁드립니다. > 안녕하세요.. 어제 오후 44748번글에 답변해 주신 내용입니다. ----------------------------------------------------------------- 안녕하세요 예스스탁입니다. 120일 이평만 체크하는 식이었습니다. 2개조건이 동시만족하면 시장보정계수를 적용하고 아니면 적용하지 않게 수정했습니다. 2개조건 중 하나만 만족해도 시장보정계수를 적용하고자 하시면 if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{ 로 변경하시면 됩니다. ------------------------------------------------------------------ 보내주신 시스템식과 답변내용을 참고해서 최종적으로... 2개조건 중 하나만 만족해도 시장보정계수를 적용하여 if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{ 로 해서 아래 시스템식과 같이 변경했습니다. 그러나 이식에서는 "갭하락(5)" 또는 "일봉이평기간(120)"과 관련해서 "시장보정계수(5)"를 동일하게 같이 적용했는데요, "갭하락(5)"에 관련해서는 "시장보정계수(5)"를 적용하고 "일봉이평기간(120)"과 관련해서는 "이평보정계수(5)"를 새롭게 변수설정해서 적용하고 싶습니다. 정리하자면 1) 시장상황이 좋지 않아 5% 이상 시가가 갭하락하면 "시장보정계수"를 적용해 원래 매수하려던 1차매수의 자리에서 보정계수만큼 낮게 매수함. 2) 일봉상 120일 이동평균선이 우하향하면 "이평보정계수"를 적용해 원래 매수하려던 1차매수의 자리에서 보정계수만큼 낮게 매수함. 3) 기존에는 갭하락과, 이동평균선의 조건에 따라 하나의 보정계수를 동일하게 적용했으나, 수정될 시스템식에는 각 조건에 따라 보정계수를 독립적으로 다르게 적용함. [질문] 수정된 시스템식에서 120일 이동평균선이 우하향하는 종목이 시가가 -5%이상 갭하락하면 즉, 보정계수를 적용해야 하는 경우가 동시에 2개가 발생하면 보정계수가 어떻게 적용되나요? 이경우 두개의 보정계수를 모두 적용하고 싶습니다. 즉, "시장보정계수(5)+이평보정계수(5)" 로 계산해서 전체보정계수 "10"의 효과를 보고 싶습니다. ------------------------------------------------------------------------------------ input : 전략식시작일자(20151028), 전략식시작시간(090000), 전략총매수금액(5000); input : 전략식종료일자(20151231); input : 갭하락(5), 시장보정계수(5), 일봉이평기간(120); input : P(10), 매수위치1차(10), 매수위치2차(7), 매수위치3차(14); input : 매수위치보정(1); input : 매도위치1차(7), 매도위치2차(14); input : 매수비중1차(30), 매수비중2차(35), 매수비중3차(35); input : 매도비중1차(50), 매도비중2차(50); input : 전략식진입횟수(100); input : 타점보유일수(5); var : sum(0),mav(0),cnt(0),eup(0),edn(0),Didx(0),LatestEntryDidx(0),Ecnt(0); var : TimeCond(false),Xcond1(false),Xcond2(false),Loss(0),LatestEntrylow(0); var : Period(0),매수1차(0); var : cum1(0),cum2(0),ma1(0),ma2(0); # 일자수 계산 if date != date[1] Then Didx = Didx+1; # 일봉 120이평 계산(전일기준,전전일기준) cum1 = 0; cum2 = 0; for cnt = 1 to 일봉이평기간{ cum1 = cum1+DayClose(cnt); cum2 = cum2+DayClose(cnt+1); } # 전일기준 일봉 120일이평 ma1 = cum1/일봉이평기간; # 전전일기준 일봉 120일이평 ma2 = cum2/일봉이평기간; # 전일기준 120일이평이 전전일기준 120일이평보다 작거나 또는 갭하락이면 # 엔벨로프 기간은 P+시장보정계수 # 엔벨로프 Percent수치는 매수위치1차+시장보정계수 if ma1 < ma2 or dayopen < DayClose(1)*(1-갭하락) Then{ Period = P+시장보정계수; 매수1차 = 매수위치1차+시장보정계수; } else{ ##전일기준 120일이평이 전전일기준 120일이평 이상이거나 갭하락이 아니면 Period = P; 매수1차 = 매수위치1차; } #당일포함 일봉 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 < 전략식진입횟수 Then buy("1차매수",atlimit,Edn*(1+매수위치보정/100),Floor((전략총매수금액*10000/c)*(매수비중1차/100))); #첫매수이후 if MarketPosition == 1 Then{ #최근 진입시점의 일자수 저장 if CurrentContracts > CurrentContracts[1] Then{ LatestEntryDidx = Didx; LatestEntrylow = L; } #1차매수 발생 후 매수위치2차에 도달하면 매수 if MaxEntries == 1 Then buy("2차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치2차/100),Floor((전략총매수금액*10000/c)*(매수비중2차/100))); #1차매수 발생 후 매수위치3차에 도달하면 매수 if MaxEntries == 2 Then buy("3차매수",atlimit,Edn[BarsSinceEntry]*(1-매수위치3차/100),Floor((전략총매수금액*10000/c)*(매수비중3차/100))); #1차매도가 한번 발생하면 더이상 발생못하도록 Xcond1은 true if LatestExitName(0) == "1차매도" then Xcond1 = true; #2차매도가 한번 발생하면 더이상 발생못하도록 Xcond2는 true if LatestExitName(0) == "2차매도" then Xcond2 = true; #Xcond1이 false일때 #진입이후 최저가에서 매도위치1차 만큼 상승하면 일부 청산 if Xcond1 == false Then exitlong("1차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치1차/100),"",Floor(MaxContracts*(매도비중1차/100)),1); #Xcond2가 false일 #진입이후 최저가에서 매도위치2차 만큼 상승하면 전량청산 if Xcond2 == false Then exitlong("2차매도",Atlimit,lowest(L,BarsSinceEntry)*(1+매도위치2차/100)); #최근 진입후 3일이상 경과(현재 일자수가 최근진입시점의 일자수보다 3이상증가) if Didx >= LatestEntryDidx+타점보유일수 and Xcond1 == false and CurrentContracts == CurrentContracts[1] Then{ #최근 진입이후 3일되었을때의 최근진입일 포함3일 최저가 계산 if date != date[1] and Didx == LatestEntryDidx[BarsSinceEntry]+3 Then{ Loss = daylow(1); for cnt = 1 to 타점보유일수{ if daylow(cnt) < Loss Then Loss = daylow(cnt); } } #Loss값 이하로 가격하락하면 전량 청산 exitlong("손절",AtStop,Loss); } #최종 매수일 포함 3일경과되면 다음날 시가에 매도 if Didx == LatestEntryDidx+(타점보유일수-1) and stime == 150000 Then{ exitlong("익절2",AtMarket); } # 1차매도가 발생한 상황 # 가장 최근 진입일의 당일최저가보다 낮은 시세 발생하면 전량청산 # if L < LatestEntrylow and Xcond1 == false Then # LatestEntrylow = L; # if Xcond1 == true and CurrentContracts == CurrentContracts[1] Then{ # exitlong("익절1",AtStop,LatestEntrylow); # } } else{ #매수포지션이 아니면 false로 초기화 Xcond1 = false; Xcond2 = false; } }