커뮤니티

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

프로필 이미지
종풍화성
2016-03-18 11:37:32
80
글번호 96378
답변완료
안녕하세요.. # 1차매도1,1차매도2는 가격이 상승해서 1차매도 가격을 터치한 것인지 시가가 갭으로 1차매도가격 이상에서 바로 시작해서 신호가 발생한것인지 구분하기 위해서 1차매도를 2개의 함수로 작성한 것입니다. # 시가가 지정한 가격보다 아래에서 시작하여 상승해서 지정한 가격 터치시 매도(1차매도1) # 시가가 지정한 가격보다 이상에서 바로 시작하면 시가에 바로 매도(1차매도2)로 하였습니다. # 2차매도1, 2차매도2도 마찬가지로 작성하였는데 신호가 제대로 잡히질 않네요.. # 추가질문으로 1차매도2의 경우 시가에 바로 매도하지 않고 시가의 1호가 아래에서 매도하는 수식도 부탁드립니다. 검토부탁드립니다. 전체 시스템식은 다음과 같습니다. -------------------------------------------------------------------------- ## 일봉상 일목균형표의 120일 기준선을 참조하여 3분봉에서 매매함. ## 2분할매수, 2분할매도 시스템식 ## 외부변수 설정 ## input : 전략시작일자(20160105), 전략시작시간(090000), 전략매수금액(1000); input : 매수위치1차(2), 매수위치2차(3); input : 매도위치1차(1.5), 매도위치2차(2); input : 매수비중1차(50), 매수비중2차(50); input : 매도비중1차(50), 매도비중2차(50); input : 전략진입횟수(1); input : 최종손절위치(10),최종익절위치(1); input : Period(26); ## 내부변수 설정 ## var : CL(0),V0.5(0),V1(0),V2(0),V3(0); var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(0); var : diff(0),TF(0),cnt(0),value(0); var : entrycond1(false),entrycond2(false),entrycond3(false); # Period 전기간 최고가의 값이 있으면 if dayhigh(Period) > 0 Then { var1 = dayhigh(0); # 당일최고가 (Period 기간동안 최고가를 계산하기 위한 초기값) var2 = daylow(0); # 당일최저가 (Period 기간동안 최고가를 계산하기 위한 초기값) var11 = dayhigh(1); # 전일최고가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값) var12 = daylow(1); # 전일최저가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값) # 0일부터 Period전일까지 최고가와 최저가를 불러와 # Period 기간동안 최고가/최저가를 계산 # 전일기준은 0을 제외하고 Period 기간이므로 +1 for cnt = 0 to Period-1 { if DayHigh(cnt) > var1 Then var1 = DayHigh(cnt); if dayhigh(cnt+1) > var11 Then var11 = dayhigh(cnt+1); if daylow(cnt) < var2 Then var2 = daylow(cnt); if daylow(cnt+1) < var21 Then var21 = daylow(cnt+1); } # Period기간동안 최고가가 전일보다 상승하면 # CL에 당일 중간값 저장 if var11 < var1 Then CL = (var1+var2)/2; V0.5 = var1-((var1-CL)/5)*1; V1 = var1-((var1-CL)/5)*2; ## "빨"타점-1타점 V2 = var1-((var1-CL)/5)*3; ## "주"타점-2타점 V3 = var1-((var1-CL)/5)*4; ## "노"타점-3타점 mid = (var1+var2)/2; ## 중간선 V4 = var1-((var1-CL)/5)*5; ## "초"타점-4타점 V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점 V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점 V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점 V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점 V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점 value = abs(var1-V0.5); ####################################################### if sdate >= 전략시작일자 and # 지정일 이후 TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전 MarketPosition == 0 and # 현재 무포지션 stime >= 전략시작시간 and # 지정시간 이후 EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨) DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건 # (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지 # 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지 # 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다. # 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1) # 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2) if stime <= 145500 Then { if NextBarOpen > var1-value*(매수위치1차+1) Then buy("1차매수1",atlimit,var1-value*(매수위치1차+1),Floor((전략매수금액*10000*(매수비중1차/100))/C)); Else buy("1차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C)); } if stime == 150000 Then { if L <= var1[1]-value[1]*(매수위치1차+1) Then buy("1차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C)); } } # 매수진입이후 if MarketPosition == 1 then { # 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화 if CurrentContracts > CurrentContracts[1] Then Condition1 = false; # 매수시점의 var1와 V0.5의 차이값을 diff에 저장 diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]); if MaxEntries == 1 and # 최대진입횟수가1이고(첫진입 한번만 발생한 상황) L >= var1-value*(매수위치2차+1) and # 저가가 2차매수가격 이상이고 EntryCond2 == false Then { # EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨) # 다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수) # 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1) # 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2) if stime <= 145500 or stime == 150000 Then { if NextBarOpen > var1-value*(매수위치2차+1) Then buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C)); Else buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C)); } if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C)); } # Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수 # 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then Condition1 = true; # 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then Condition2 = true; # Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태) # 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산 if Condition1 == false then { if stime <= 145500 Then { if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1); Else exitlong("1차매도2",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1); } if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1); } if Condition1 == true and CurrentContracts < MaxContracts then { if stime <= 145500 Then exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치); if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then exitlong("최종익절2",AtMarket); } # Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태) # 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산 if Condition2 == false then { if stime <= 145500 Then { if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치2차 Then exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차); Else exitlong("2차매도2",AtMarket); } if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then exitlong("2차매도3",AtMarket); } # 당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산 # 3분봉에서 정규장마지막봉 전봉까지만 만족했을때 신호발생 if stime < 145700 Then exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1)); # 정규장 마지막봉에서 조건만족하면 다음봉(다음날)시가에 청산 if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then exitlong("최종손절2",AtMarket); } Else { # 매수포지션이 아니면 모두 false로 초기화 Condition1 = false; Condition2 = false; } } # 매수진입 후 1차매수1이나 1차매수2, 1차매수3 진입신호가 발생하면 true if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then entrycond1 = true; # 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then entrycond2 = true; # 무포지션이면 flase로 초기화 if MarketPosition == 0 Then { entrycond1 = false; entrycond2 = false; }
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2016-03-18 16:25:59

안녕하세요 예스스탁입니다. 매도함수(sell,exitlong)에서 atlimit은 지정한 가격까지 상승하면 신호가 발생합니다. 작성하신식은 시가가 지정한 가격보다 크면 시가에 매수 시가가 지정한 가격보다 작으면 시가에 매수입니다. if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1); Else exitlong("1차매도2",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1); 시가가 지정한 가격보다 크면 지정한 가격이상의 시세가 발생하면 매수청산하는데 이미 시가가 지정한 가격보다 크므로 시가에 바로 매도됩니다. 부등호가 반대가 되어야 합니다. if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치1차 Then 2차매도1과 2도 마찬가지로 if문의 부등호가 반대가 되어야 합니다. 위 내용과 추가하신 내용 포함한 식입니다. ## 일봉상 일목균형표의 120일 기준선을 참조하여 3분봉에서 매매함. ## 2분할매수, 2분할매도 시스템식 ## 외부변수 설정 ## input : 전략시작일자(20160105), 전략시작시간(090000), 전략매수금액(1000); input : 매수위치1차(2), 매수위치2차(3); input : 매도위치1차(1.5), 매도위치2차(2); input : 매수비중1차(50), 매수비중2차(50); input : 매도비중1차(50), 매도비중2차(50); input : 전략진입횟수(1); input : 최종손절위치(10),최종익절위치(1); input : Period(26); ## 내부변수 설정 ## var : CL(0),V0.5(0),V1(0),V2(0),V3(0); var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(0); var : diff(0),TF(0),cnt(0),value(0); var : entrycond1(false),entrycond2(false),entrycond3(false); # Period 전기간 최고가의 값이 있으면 if dayhigh(Period) > 0 Then { var1 = dayhigh(0); # 당일최고가 (Period 기간동안 최고가를 계산하기 위한 초기값) var2 = daylow(0); # 당일최저가 (Period 기간동안 최고가를 계산하기 위한 초기값) var11 = dayhigh(1); # 전일최고가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값) var12 = daylow(1); # 전일최저가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값) # 0일부터 Period전일까지 최고가와 최저가를 불러와 # Period 기간동안 최고가/최저가를 계산 # 전일기준은 0을 제외하고 Period 기간이므로 +1 for cnt = 0 to Period-1 { if DayHigh(cnt) > var1 Then var1 = DayHigh(cnt); if dayhigh(cnt+1) > var11 Then var11 = dayhigh(cnt+1); if daylow(cnt) < var2 Then var2 = daylow(cnt); if daylow(cnt+1) < var21 Then var21 = daylow(cnt+1); } # Period기간동안 최고가가 전일보다 상승하면 # CL에 당일 중간값 저장 if var11 < var1 Then CL = (var1+var2)/2; V0.5 = var1-((var1-CL)/5)*1; V1 = var1-((var1-CL)/5)*2; ## "빨"타점-1타점 V2 = var1-((var1-CL)/5)*3; ## "주"타점-2타점 V3 = var1-((var1-CL)/5)*4; ## "노"타점-3타점 mid = (var1+var2)/2; ## 중간선 V4 = var1-((var1-CL)/5)*5; ## "초"타점-4타점 V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점 V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점 V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점 V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점 V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점 value = abs(var1-V0.5); ####################################################### if sdate >= 전략시작일자 and # 지정일 이후 TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전 MarketPosition == 0 and # 현재 무포지션 stime >= 전략시작시간 and # 지정시간 이후 EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨) DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건 # (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지 # 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지 # 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다. # 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1) # 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2) if stime <= 145500 Then { if NextBarOpen > var1-value*(매수위치1차+1) Then buy("1차매수1",atlimit,var1-value*(매수위치1차+1),Floor((전략매수금액*10000*(매수비중1차/100))/C)); Else buy("1차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C)); } if stime == 150000 Then { if L <= var1[1]-value[1]*(매수위치1차+1) Then buy("1차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C)); } } # 매수진입이후 if MarketPosition == 1 then { # 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화 if CurrentContracts > CurrentContracts[1] Then Condition1 = false; # 매수시점의 var1와 V0.5의 차이값을 diff에 저장 diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]); if MaxEntries == 1 and # 최대진입횟수가1이고(첫진입 한번만 발생한 상황) L >= var1-value*(매수위치2차+1) and # 저가가 2차매수가격 이상이고 EntryCond2 == false Then { # EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨) # 다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수) # 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1) # 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2) if stime <= 145500 or stime == 150000 Then { if NextBarOpen > var1-value*(매수위치2차+1) Then buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C)); Else buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C)); } if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C)); } # Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수 # 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then Condition1 = true; # 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then Condition2 = true; # Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태) # 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산 if Condition1 == false then { if stime <= 145500 Then { if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1); Else exitlong("1차매도2",AtStop,NextBarOpen-PriceScale*1,def,"",Floor(MaxContracts*(매도비중1차/100)),1); } if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1); } if Condition1 == true and CurrentContracts < MaxContracts then { if stime <= 145500 Then exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치); if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then exitlong("최종익절2",AtMarket); } # Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태) # 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산 if Condition2 == false then { if stime <= 145500 Then { if NextBarOpen < lowest(L,BarsSinceEntry)+diff*매도위치2차 Then exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차); Else exitlong("2차매도2",AtMarket); } if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then exitlong("2차매도3",AtMarket); } # 당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산 # 3분봉에서 정규장마지막봉 전봉까지만 만족했을때 신호발생 if stime < 145700 Then exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1)); # 정규장 마지막봉에서 조건만족하면 다음봉(다음날)시가에 청산 if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then exitlong("최종손절2",AtMarket); } Else { # 매수포지션이 아니면 모두 false로 초기화 Condition1 = false; Condition2 = false; } } # 매수진입 후 1차매수1이나 1차매수2, 1차매수3 진입신호가 발생하면 true if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then entrycond1 = true; # 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then entrycond2 = true; # 무포지션이면 false로 초기화 if MarketPosition == 0 Then { entrycond1 = false; entrycond2 = false; } 즐거운 하루되세요 > 종풍화성 님이 쓴 글입니다. > 제목 : 시스템식 검토 부탁드립니다. > 안녕하세요.. # 1차매도1,1차매도2는 가격이 상승해서 1차매도 가격을 터치한 것인지 시가가 갭으로 1차매도가격 이상에서 바로 시작해서 신호가 발생한것인지 구분하기 위해서 1차매도를 2개의 함수로 작성한 것입니다. # 시가가 지정한 가격보다 아래에서 시작하여 상승해서 지정한 가격 터치시 매도(1차매도1) # 시가가 지정한 가격보다 이상에서 바로 시작하면 시가에 바로 매도(1차매도2)로 하였습니다. # 2차매도1, 2차매도2도 마찬가지로 작성하였는데 신호가 제대로 잡히질 않네요.. # 추가질문으로 1차매도2의 경우 시가에 바로 매도하지 않고 시가의 1호가 아래에서 매도하는 수식도 부탁드립니다. 검토부탁드립니다. 전체 시스템식은 다음과 같습니다. -------------------------------------------------------------------------- ## 일봉상 일목균형표의 120일 기준선을 참조하여 3분봉에서 매매함. ## 2분할매수, 2분할매도 시스템식 ## 외부변수 설정 ## input : 전략시작일자(20160105), 전략시작시간(090000), 전략매수금액(1000); input : 매수위치1차(2), 매수위치2차(3); input : 매도위치1차(1.5), 매도위치2차(2); input : 매수비중1차(50), 매수비중2차(50); input : 매도비중1차(50), 매도비중2차(50); input : 전략진입횟수(1); input : 최종손절위치(10),최종익절위치(1); input : Period(26); ## 내부변수 설정 ## var : CL(0),V0.5(0),V1(0),V2(0),V3(0); var : mid(0),V4(0),V5(0),V6(0),V7(0),V8(0),V9(0); var : diff(0),TF(0),cnt(0),value(0); var : entrycond1(false),entrycond2(false),entrycond3(false); # Period 전기간 최고가의 값이 있으면 if dayhigh(Period) > 0 Then { var1 = dayhigh(0); # 당일최고가 (Period 기간동안 최고가를 계산하기 위한 초기값) var2 = daylow(0); # 당일최저가 (Period 기간동안 최고가를 계산하기 위한 초기값) var11 = dayhigh(1); # 전일최고가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값) var12 = daylow(1); # 전일최저가 (전일기준 Period 기간동안 최고가를 계산하기 위한 초기값) # 0일부터 Period전일까지 최고가와 최저가를 불러와 # Period 기간동안 최고가/최저가를 계산 # 전일기준은 0을 제외하고 Period 기간이므로 +1 for cnt = 0 to Period-1 { if DayHigh(cnt) > var1 Then var1 = DayHigh(cnt); if dayhigh(cnt+1) > var11 Then var11 = dayhigh(cnt+1); if daylow(cnt) < var2 Then var2 = daylow(cnt); if daylow(cnt+1) < var21 Then var21 = daylow(cnt+1); } # Period기간동안 최고가가 전일보다 상승하면 # CL에 당일 중간값 저장 if var11 < var1 Then CL = (var1+var2)/2; V0.5 = var1-((var1-CL)/5)*1; V1 = var1-((var1-CL)/5)*2; ## "빨"타점-1타점 V2 = var1-((var1-CL)/5)*3; ## "주"타점-2타점 V3 = var1-((var1-CL)/5)*4; ## "노"타점-3타점 mid = (var1+var2)/2; ## 중간선 V4 = var1-((var1-CL)/5)*5; ## "초"타점-4타점 V5 = var1-((var1-CL)/5)*6; ## "파"타점-5타점 V6 = var1-((var1-CL)/5)*7; ## "남"타점-6타점 V7 = var1-((var1-CL)/5)*8; ## "보"타점-7타점 V8 = var1-((var1-CL)/5)*9; ## "점"타점-8타점 V9 = var1-((var1-CL)/5)*9; ## "검"타점-9타점 value = abs(var1-V0.5); ####################################################### if sdate >= 전략시작일자 and # 지정일 이후 TotalTrades < 전략진입횟수 and # 최대 진입횟수 이전 MarketPosition == 0 and # 현재 무포지션 stime >= 전략시작시간 and # 지정시간 이후 EntryCond1 == false and # EntryCond1은 false일때(첫진입이 발생하면 true로 변경되어 한번만 진입하게 됨) DayHigh(0) < var1 Then { # 당일고가가 period신고가를 돌파하지 않을 경우만 매수하기 위한 조건 # (1차매수1),(1차매수2)은 가격이 하락해서 1차매수가격을 터치한 것인지 # 시가가 갭으로 1차매수가격 이하에서 바로 시작해서 신호가 발생한것인지 # 구분하기 위해서 1차매수를 2개의 함수로 작성한 것입니다. # 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(1차매수1) # 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(1차매수2) if stime <= 145500 Then { if NextBarOpen > var1-value*(매수위치1차+1) Then buy("1차매수1",atlimit,var1-value*(매수위치1차+1),Floor((전략매수금액*10000*(매수비중1차/100))/C)); Else buy("1차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C)); } if stime == 150000 Then { if L <= var1[1]-value[1]*(매수위치1차+1) Then buy("1차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중1차/100))/C)); } } # 매수진입이후 if MarketPosition == 1 then { # 추가진입이 발생하면 1차매도가 다시 발생할수 있도록 false로 초기화 if CurrentContracts > CurrentContracts[1] Then Condition1 = false; # 매수시점의 var1와 V0.5의 차이값을 diff에 저장 diff = abs(var1[BarsSinceEntry]-V0.5[BarsSinceEntry]); if MaxEntries == 1 and # 최대진입횟수가1이고(첫진입 한번만 발생한 상황) L >= var1-value*(매수위치2차+1) and # 저가가 2차매수가격 이상이고 EntryCond2 == false Then { # EntryCond2은 false일때(2차매수가 발생하면 true로 변경되어 한번만 진입하게 됨) # 다음봉에서 2차매수가격을 터치하면 신호발생(즉 가격이 하락해서 첫 터치가 발생하면 매수) # 시가가 지정한 가격보다 위에서 시작하면 하락해서 지정한 가격 터치시 매수(2차매수1) # 시가가 지정한 가격보다 이하에서 바로 시작하면 시가에 바로 매수(2차매수2) if stime <= 145500 or stime == 150000 Then { if NextBarOpen > var1-value*(매수위치2차+1) Then buy("2차매수1",atlimit,var1-value*(매수위치2차+1),Floor((전략매수금액*10000*(매수비중2차/100))/C)); Else buy("2차매수2",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C)); } if stime == 150000 and L <= var1[1]-value[1]*(매수위치2차+1) Then buy("2차매수3",AtMarket,def,Floor((전략매수금액*10000*(매수비중2차/100))/C)); } # Condition1과 Condition2는 각 매도의 횟수를 1번으로 제한하게 위한 변수 # 포지션 진행 중 1차매도란 이름의 청산이 발생하면 Condition1은 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "1차매도1" or LatestExitName(0) == "1차매도2" or LatestExitName(0) == "1차매도3") Then Condition1 = true; # 포지션 진행 중 2차매도란 이름의 청산이 발생하면 Condition2는 true if CurrentContracts < CurrentContracts[1] and (LatestExitName(0) == "2차매도1" or LatestExitName(0) == "2차매도2" or LatestExitName(0) == "2차매도3") Then Condition2 = true; # Condition1이 false일때(첫진입후 아직 1차매도는 발생하지 않은 상태) # 당일 최저가에서 diff*매도위치1차만큼 상승하면 매도1차비중만큼 청산 if Condition1 == false then { if stime <= 145500 Then { if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치1차 Then exitlong("1차매도1",atlimit,lowest(L,BarsSinceEntry)+diff*매도위치1차,"",Floor(MaxContracts*(매도비중1차/100)),1); Else exitlong("1차매도2",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1); } if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치1차 Then exitlong("1차매도3",AtMarket,def,"",Floor(MaxContracts*(매도비중1차/100)),1); } if Condition1 == true and CurrentContracts < MaxContracts then { if stime <= 145500 Then exitlong("최종익절1",AtStop,LatestExitPrice(0)-diff*최종익절위치); if stime == 150000 and L <= LatestExitPrice(0)-diff*최종익절위치 Then exitlong("최종익절2",AtMarket); } # Condition2는 false일때(첫진입후 아직 2차매도는 발생하지 않은 상태) # 당일 최저가에서 diff*매도위치2차만큼 상승하면 매도2차비중만큼 청산 if Condition2 == false then { if stime <= 145500 Then { if NextBarOpen > lowest(L,BarsSinceEntry)+diff*매도위치2차 Then exitlong("2차매도1",AtLimit,lowest(L,BarsSinceEntry)+diff*매도위치2차); Else exitlong("2차매도2",AtMarket); } if stime == 150000 and H >= lowest(L,BarsSinceEntry)[1]+diff[1]*매도위치2차 Then exitlong("2차매도3",AtMarket); } # 당일최고가에서 value*(최종손절위치+1)만큰 하락하면 전량청산 # 3분봉에서 정규장마지막봉 전봉까지만 만족했을때 신호발생 if stime < 145700 Then exitlong("최종손절1",AtStop,var1-value*(최종손절위치+1)); # 정규장 마지막봉에서 조건만족하면 다음봉(다음날)시가에 청산 if stime == 150000 and L <= var1[1]-value[1]*(최종손절위치+1) Then exitlong("최종손절2",AtMarket); } Else { # 매수포지션이 아니면 모두 false로 초기화 Condition1 = false; Condition2 = false; } } # 매수진입 후 1차매수1이나 1차매수2, 1차매수3 진입신호가 발생하면 true if MarketPosition == 1 and (LatestEntryName(0) == "1차매수1" or LatestEntryName(0) == "1차매수2" or LatestEntryName(0) == "1차매수3") Then entrycond1 = true; # 매수진입 후 2차매수1이나 2차매수2, 2차매수3 진입신호가 발생하면 true if MarketPosition == 1 and (LatestEntryName(0) == "2차매수1" or LatestEntryName(0) == "2차매수2" or LatestEntryName(0) == "2차매수3") Then entrycond2 = true; # 무포지션이면 flase로 초기화 if MarketPosition == 0 Then { entrycond1 = false; entrycond2 = false; }