커뮤니티

수식수정문의

프로필 이미지
렉쳐
2018-06-17 20:02:54
125
글번호 119797
답변완료
아랫수식은 매수진입으로 하는데 매도진입 매수청산으로선물에서 사용할 수 있게 수정 부탁드리겠습니다. 터틀입니다. --- // 작성자 : 수식지왕 Input: 원계정(100000000) , S1HiPeriod(20) , S1LoPeriod(10) , S2HiPeriod(55) , S2LoPeriod(20) , AtrPeriod(20) , S2비율(50) , N배수(2) ; Var: 명목계정(0), 계정배분완료(False), S1Hi(0), S1Lo(0), S2Hi(0), S2Lo(0), j(0), SumTr(0), DayAtr(0), Unit(0), 진입구분(0), 진입횟수(0), N(0), 추가진입가격(0), 단기돌파무시(False), sumV0(0), sumV1(0), maV0(0), maV1(0), DeadCnt(0), 휩소여부(False); Array : 손절가격[5](0), 진입가격[5](0), 계정크기[5](0), 계정체크[5](0); /*=============================================*/ /* 계정관리 */ /*=============================================*/ If 계정배분완료 == False Then //최초 한번만 실행 { 계정체크[0] = 원계정 * 0.9; //10% 손실나면 계정크기[0] = 원계정 * 0.8; //명목계정은 20% 감소 시켜서 운용 For j = 0 To 3 { 계정체크[j+1] = 계정크기[j] * 0.9; 계정크기[j+1] = 계정크기[j] * 0.8; } 계정배분완료 = True; } If NetProfit() >= 0 Then { 명목계정 = 원계정; } Else { For j = 0 To 4 { If 원계정 + NetProfit() < 계정체크[j] Then //10% 손실나면 { 명목계정 = 계정크기[j]; //명목계정은 20% 감소시켜서 운용 } } } /*=============================================*/ /* 변동성 계산 */ /*=============================================*/ // 분봉에서 일봉의 ATR계산, 전일의 ATR이 산출됨 SumTr = 0; For j = 1 To AtrPeriod { SumTr = SumTr + Max(DayHigh(j)-DayLow(j),Abs(DayClose(j+1)-DayHigh(j)),Abs(DayClose(j+1)-DayLow(j))); } DayAtr = SumTr/AtrPeriod; /*=============================================*/ /* 채널 계산 */ /*=============================================*/ // 분봉에서 일봉의 고,저점 계산, 전일의 고,저점임 S1Hi = 0; S1Lo = 0; S2Hi = 0; S2Lo = 0; For j = 1 To S2HiPeriod { If j <= S1LoPeriod && (S1Lo == 0 || S1Lo > DayLow(j)) Then S1Lo = DayLow(j); If j <= S2LoPeriod && (S2Lo == 0 || S2Lo > DayLow(j)) Then S2Lo = DayLow(j); If j <= S1HiPeriod && S1Hi < DayHigh(j) Then S1Hi = DayHigh(j); If S2Hi < DayHigh(j) Then S2Hi = DayHigh(j); } /*=============================================*/ /* 휩소 판단 */ /*=============================================*/ //이평선 데드카운트가 일정 수 이상일 때 휩소로 판단 sumV0 = 0; sumV1 = 0; For j = 0 To S1HiPeriod - 1 { sumV0 = sumV0 + DayClose(j); sumV1 = sumV1 + DayClose(j+1); } maV0 = sumV0 / S1HiPeriod; maV1 = sumV1 / S1HiPeriod; DeadCnt = 0; For j = 0 To S1HiPeriod - 1 { if maV1 <= DayClose(j+1) && maV0 > DayClose(j) then DeadCnt = DeadCnt + 1; } ############## # 진입식 # ############## /*=============================================*/ /* 시스템 1(S1) : 20일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S1Hi) && 단기돌파무시 == False Then { 진입구분 = 1; N = DayAtr; Unit = int((명목계정 * 0.01)/N); //거래단위 계산 추가진입가격 = S1Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; If DeadCnt >= 4 Then //이평 데드크로스 횟수를 4회 이상일 경우 휩소로 봄 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S1매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S1 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 1 Then { If 진입횟수 == 1 && //CurrentEntries()함수를 써도 되나 단계를 체크하기 위해 별도 변수 사용 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S1매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S1매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S1매수4",OnClose,DEF,int(Unit/4)); } } /*=============================================*/ /* 시스템 2(S2) : 55일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S2Hi) Then { 진입구분 = 2; N = DayAtr; Unit = (명목계정 * 0.01)/N; //거래단위 계산 Unit = int(Unit * S2비율 * 0.01); //S2거래비중 조정 추가진입가격 = S2Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; 단기돌파무시 = False; //단기돌파무시가 True로 설정되었다면 초기화 If DeadCnt >= 4 Then 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S2매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S2 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 2 Then { If 진입횟수 == 1 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S2매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S2매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S2매수4",OnClose,DEF,int(Unit/4)); } } ############## # 청산식 # ############## /*=============================================*/ /* S1 단기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 1 Then { If C < S1Lo Then { If OpenPositionProfit() < 0 Then //이익이 발생했다면 다음번 단기돌파시 진입 무시 { 단기돌파무시 = False; } Else { 단기돌파무시 = True; } 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S1추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; //추가 진입을 막기 위해 초기화 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; 단기돌파무시 = False; //손절포인트를 돌파했다면 다음번 단기돌파 때 진입 ExitLong("S1손절4",OnClose,DEF,"S1매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; //4번 다 진입하지 못하고 손절포인트 만날 수 있으므로 진입횟수 = 2; //각 청산식마다 초기화 손절가격[3] = 0; 진입가격[3] = 0; 단기돌파무시 = False; ExitLong("S1손절3",OnClose,DEF,"S1매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; 단기돌파무시 = False; ExitLong("S1손절2",OnClose,DEF,"S1매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; 단기돌파무시 = False; ExitLong("S1손절1",OnClose,DEF,"S1매수1",DEF); } } /*=============================================*/ /* S2 장기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 2 Then { If C < S2Lo Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S2추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; ExitLong("S2손절4",OnClose,DEF,"S2매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; 진입횟수 = 2; 손절가격[3] = 0; 진입가격[3] = 0; ExitLong("S2손절3",OnClose,DEF,"S2매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; ExitLong("S2손절2",OnClose,DEF,"S2매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; ExitLong("S2손절1",OnClose,DEF,"S2매수1",DEF); } } If DayAtr >= 명목계정 * 0.01 * N배수 Then { ExitLong(); }
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2018-06-18 15:34:50

안녕하세요 예스스탁입니다. 수식이 주식을 염두에 두고 작성되어 선물에 적용되는 식일경우 어떤 내용으로 변경해 드려야할지 모르는 내용들이 많습니다. 신호함수만 반대로 변경해 드립니다. 조건내용을 변경이 요구되면 임의로 조건내용까지 변경해 드릴수는 없습니다. 시간상 저희가 해당 내용까지 파악해 수정해 드리기는 어렵습니다. Input: 원계정(100000000) , S1HiPeriod(20) , S1LoPeriod(10) , S2HiPeriod(55) , S2LoPeriod(20) , AtrPeriod(20) , S2비율(50) , N배수(2) ; Var: 명목계정(0), 계정배분완료(False), S1Hi(0), S1Lo(0), S2Hi(0), S2Lo(0), j(0), SumTr(0), DayAtr(0), Unit(0), 진입구분(0), 진입횟수(0), N(0), 추가진입가격(0), 단기돌파무시(False), sumV0(0), sumV1(0), maV0(0), maV1(0), DeadCnt(0), 휩소여부(False); Array : 손절가격[5](0), 진입가격[5](0), 계정크기[5](0), 계정체크[5](0); /*=============================================*/ /* 계정관리 */ /*=============================================*/ If 계정배분완료 == False Then //최초 한번만 실행 { 계정체크[0] = 원계정 * 0.9; //10% 손실나면 계정크기[0] = 원계정 * 0.8; //명목계정은 20% 감소 시켜서 운용 For j = 0 To 3 { 계정체크[j+1] = 계정크기[j] * 0.9; 계정크기[j+1] = 계정크기[j] * 0.8; } 계정배분완료 = True; } If NetProfit() >= 0 Then { 명목계정 = 원계정; } Else { For j = 0 To 4 { If 원계정 + NetProfit() < 계정체크[j] Then //10% 손실나면 { 명목계정 = 계정크기[j]; //명목계정은 20% 감소시켜서 운용 } } } /*=============================================*/ /* 변동성 계산 */ /*=============================================*/ // 분봉에서 일봉의 ATR계산, 전일의 ATR이 산출됨 SumTr = 0; For j = 1 To AtrPeriod { SumTr = SumTr + Max(DayHigh(j)-DayLow(j),Abs(DayClose(j+1)-DayHigh(j)),Abs(DayClose(j+1)-DayLow(j))); } DayAtr = SumTr/AtrPeriod; /*=============================================*/ /* 채널 계산 */ /*=============================================*/ // 분봉에서 일봉의 고,저점 계산, 전일의 고,저점임 S1Hi = 0; S1Lo = 0; S2Hi = 0; S2Lo = 0; For j = 1 To S2HiPeriod { If j <= S1LoPeriod && (S1Lo == 0 || S1Lo > DayLow(j)) Then S1Lo = DayLow(j); If j <= S2LoPeriod && (S2Lo == 0 || S2Lo > DayLow(j)) Then S2Lo = DayLow(j); If j <= S1HiPeriod && S1Hi < DayHigh(j) Then S1Hi = DayHigh(j); If S2Hi < DayHigh(j) Then S2Hi = DayHigh(j); } /*=============================================*/ /* 휩소 판단 */ /*=============================================*/ //이평선 데드카운트가 일정 수 이상일 때 휩소로 판단 sumV0 = 0; sumV1 = 0; For j = 0 To S1HiPeriod - 1 { sumV0 = sumV0 + DayClose(j); sumV1 = sumV1 + DayClose(j+1); } maV0 = sumV0 / S1HiPeriod; maV1 = sumV1 / S1HiPeriod; DeadCnt = 0; For j = 0 To S1HiPeriod - 1 { if maV1 <= DayClose(j+1) && maV0 > DayClose(j) then DeadCnt = DeadCnt + 1; } ############## # 진입식 # ############## /*=============================================*/ /* 시스템 1(S1) : 20일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S1Hi) && 단기돌파무시 == False Then { 진입구분 = 1; N = DayAtr; Unit = int((명목계정 * 0.01)/N); //거래단위 계산 추가진입가격 = S1Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; If DeadCnt >= 4 Then //이평 데드크로스 횟수를 4회 이상일 경우 휩소로 봄 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); sell("S1매도1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S1 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 1 Then { If 진입횟수 == 1 && //CurrentEntries()함수를 써도 되나 단계를 체크하기 위해 별도 변수 사용 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } sell("S1매도2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } sell("S1매도3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } sell("S1매도4",OnClose,DEF,int(Unit/4)); } } /*=============================================*/ /* 시스템 2(S2) : 55일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S2Hi) Then { 진입구분 = 2; N = DayAtr; Unit = (명목계정 * 0.01)/N; //거래단위 계산 Unit = int(Unit * S2비율 * 0.01); //S2거래비중 조정 추가진입가격 = S2Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; 단기돌파무시 = False; //단기돌파무시가 True로 설정되었다면 초기화 If DeadCnt >= 4 Then 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); sell("S2매도1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S2 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 2 Then { If 진입횟수 == 1 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } sell("S2매도2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } sell("S2매도3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Sell("S2매도4",OnClose,DEF,int(Unit/4)); } } ############## # 청산식 # ############## /*=============================================*/ /* S1 단기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 1 Then { If C < S1Lo Then { If OpenPositionProfit() < 0 Then //이익이 발생했다면 다음번 단기돌파시 진입 무시 { 단기돌파무시 = False; } Else { 단기돌파무시 = True; } 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitShort("S1추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; //추가 진입을 막기 위해 초기화 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; 단기돌파무시 = False; //손절포인트를 돌파했다면 다음번 단기돌파 때 진입 ExitShort("S1손절4",OnClose,DEF,"S1매도4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; //4번 다 진입하지 못하고 손절포인트 만날 수 있으므로 진입횟수 = 2; //각 청산식마다 초기화 손절가격[3] = 0; 진입가격[3] = 0; 단기돌파무시 = False; ExitShort("S1손절3",OnClose,DEF,"S1매도3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; 단기돌파무시 = False; ExitShort("S1손절2",OnClose,DEF,"S1매도2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; 단기돌파무시 = False; ExitShort("S1손절1",OnClose,DEF,"S1매도1",DEF); } } /*=============================================*/ /* S2 장기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 2 Then { If C < S2Lo Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitShort("S2추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; ExitShort("S2손절4",OnClose,DEF,"S2매도4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; 진입횟수 = 2; 손절가격[3] = 0; 진입가격[3] = 0; ExitShort("S2손절3",OnClose,DEF,"S2매도3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; ExitShort("S2손절2",OnClose,DEF,"S2매도2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; ExitShort("S2손절1",OnClose,DEF,"S2매도1",DEF); } } If DayAtr >= 명목계정 * 0.01 * N배수 Then { ExitShort(); } 즐거운 하루되세요 > 렉쳐 님이 쓴 글입니다. > 제목 : 수식수정문의 > 아랫수식은 매수진입으로 하는데 매도진입 매수청산으로선물에서 사용할 수 있게 수정 부탁드리겠습니다. 터틀입니다. --- // 작성자 : 수식지왕 Input: 원계정(100000000) , S1HiPeriod(20) , S1LoPeriod(10) , S2HiPeriod(55) , S2LoPeriod(20) , AtrPeriod(20) , S2비율(50) , N배수(2) ; Var: 명목계정(0), 계정배분완료(False), S1Hi(0), S1Lo(0), S2Hi(0), S2Lo(0), j(0), SumTr(0), DayAtr(0), Unit(0), 진입구분(0), 진입횟수(0), N(0), 추가진입가격(0), 단기돌파무시(False), sumV0(0), sumV1(0), maV0(0), maV1(0), DeadCnt(0), 휩소여부(False); Array : 손절가격[5](0), 진입가격[5](0), 계정크기[5](0), 계정체크[5](0); /*=============================================*/ /* 계정관리 */ /*=============================================*/ If 계정배분완료 == False Then //최초 한번만 실행 { 계정체크[0] = 원계정 * 0.9; //10% 손실나면 계정크기[0] = 원계정 * 0.8; //명목계정은 20% 감소 시켜서 운용 For j = 0 To 3 { 계정체크[j+1] = 계정크기[j] * 0.9; 계정크기[j+1] = 계정크기[j] * 0.8; } 계정배분완료 = True; } If NetProfit() >= 0 Then { 명목계정 = 원계정; } Else { For j = 0 To 4 { If 원계정 + NetProfit() < 계정체크[j] Then //10% 손실나면 { 명목계정 = 계정크기[j]; //명목계정은 20% 감소시켜서 운용 } } } /*=============================================*/ /* 변동성 계산 */ /*=============================================*/ // 분봉에서 일봉의 ATR계산, 전일의 ATR이 산출됨 SumTr = 0; For j = 1 To AtrPeriod { SumTr = SumTr + Max(DayHigh(j)-DayLow(j),Abs(DayClose(j+1)-DayHigh(j)),Abs(DayClose(j+1)-DayLow(j))); } DayAtr = SumTr/AtrPeriod; /*=============================================*/ /* 채널 계산 */ /*=============================================*/ // 분봉에서 일봉의 고,저점 계산, 전일의 고,저점임 S1Hi = 0; S1Lo = 0; S2Hi = 0; S2Lo = 0; For j = 1 To S2HiPeriod { If j <= S1LoPeriod && (S1Lo == 0 || S1Lo > DayLow(j)) Then S1Lo = DayLow(j); If j <= S2LoPeriod && (S2Lo == 0 || S2Lo > DayLow(j)) Then S2Lo = DayLow(j); If j <= S1HiPeriod && S1Hi < DayHigh(j) Then S1Hi = DayHigh(j); If S2Hi < DayHigh(j) Then S2Hi = DayHigh(j); } /*=============================================*/ /* 휩소 판단 */ /*=============================================*/ //이평선 데드카운트가 일정 수 이상일 때 휩소로 판단 sumV0 = 0; sumV1 = 0; For j = 0 To S1HiPeriod - 1 { sumV0 = sumV0 + DayClose(j); sumV1 = sumV1 + DayClose(j+1); } maV0 = sumV0 / S1HiPeriod; maV1 = sumV1 / S1HiPeriod; DeadCnt = 0; For j = 0 To S1HiPeriod - 1 { if maV1 <= DayClose(j+1) && maV0 > DayClose(j) then DeadCnt = DeadCnt + 1; } ############## # 진입식 # ############## /*=============================================*/ /* 시스템 1(S1) : 20일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S1Hi) && 단기돌파무시 == False Then { 진입구분 = 1; N = DayAtr; Unit = int((명목계정 * 0.01)/N); //거래단위 계산 추가진입가격 = S1Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; If DeadCnt >= 4 Then //이평 데드크로스 횟수를 4회 이상일 경우 휩소로 봄 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S1매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S1 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 1 Then { If 진입횟수 == 1 && //CurrentEntries()함수를 써도 되나 단계를 체크하기 위해 별도 변수 사용 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S1매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S1매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S1매수4",OnClose,DEF,int(Unit/4)); } } /*=============================================*/ /* 시스템 2(S2) : 55일 최고가 돌파시 매수 진입 */ /*=============================================*/ If 진입구분 == 0 && 진입횟수 == 0 && CrossUp(C,S2Hi) Then { 진입구분 = 2; N = DayAtr; Unit = (명목계정 * 0.01)/N; //거래단위 계산 Unit = int(Unit * S2비율 * 0.01); //S2거래비중 조정 추가진입가격 = S2Hi + (N * N배수 * 0.25); 진입횟수 = 1; 진입가격[1] = C; 단기돌파무시 = False; //단기돌파무시가 True로 설정되었다면 초기화 If DeadCnt >= 4 Then 휩소여부 = True; Else 휩소여부 = False; If 휩소여부 == False Then 손절가격[1] = C - (N * N배수); Else 손절가격[1] = C - (N * N배수 * 0.25); Buy("S2매수1",OnClose,DEF,int(Unit/4)); } /*=============================================*/ /* S2 기준으로 최초 진입 이후 추가 진입 */ /*=============================================*/ If 진입구분 == 2 Then { If 진입횟수 == 1 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 2; 진입가격[2] = C; If 휩소여부 == False Then { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 4); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 3); } Else { 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25); } Buy("S2매수2",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 2 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 3; 진입가격[3] = C; If 휩소여부 == False Then { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 4); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 3); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 2); } Else { 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25); } Buy("S2매수3",OnClose,DEF,int(Unit/4)); } If 진입횟수 == 3 && 추가진입가격 > 0 && CrossUp(C,추가진입가격) Then { 추가진입가격 = 추가진입가격 + (N * N배수 * 0.25); 진입횟수 = 4; 진입가격[4] = C; If 휩소여부 == False Then { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25 * 4); 손절가격[3] = 진입가격[3] - (N * N배수 * 0.25 * 3); 손절가격[2] = 진입가격[2] - (N * N배수 * 0.25 * 2); 손절가격[1] = 진입가격[1] - (N * N배수 * 0.25 * 1); } Else { 손절가격[4] = 진입가격[4] - (N * N배수 * 0.25); } Buy("S2매수4",OnClose,DEF,int(Unit/4)); } } ############## # 청산식 # ############## /*=============================================*/ /* S1 단기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 1 Then { If C < S1Lo Then { If OpenPositionProfit() < 0 Then //이익이 발생했다면 다음번 단기돌파시 진입 무시 { 단기돌파무시 = False; } Else { 단기돌파무시 = True; } 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S1추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; //추가 진입을 막기 위해 초기화 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; 단기돌파무시 = False; //손절포인트를 돌파했다면 다음번 단기돌파 때 진입 ExitLong("S1손절4",OnClose,DEF,"S1매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; //4번 다 진입하지 못하고 손절포인트 만날 수 있으므로 진입횟수 = 2; //각 청산식마다 초기화 손절가격[3] = 0; 진입가격[3] = 0; 단기돌파무시 = False; ExitLong("S1손절3",OnClose,DEF,"S1매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; 단기돌파무시 = False; ExitLong("S1손절2",OnClose,DEF,"S1매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; 단기돌파무시 = False; ExitLong("S1손절1",OnClose,DEF,"S1매수1",DEF); } } /*=============================================*/ /* S2 장기 시스템의 청산 */ /*=============================================*/ If 진입구분 == 2 Then { If C < S2Lo Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; ExitLong("S2추세종료"); } If 진입횟수 == 4 && C < 손절가격[4] Then { 추가진입가격 = 0; 진입횟수 = 3; 손절가격[4] = 0; 진입가격[4] = 0; ExitLong("S2손절4",OnClose,DEF,"S2매수4",DEF); } If 진입횟수 == 3 && C < 손절가격[3] Then { 추가진입가격 = 0; 진입횟수 = 2; 손절가격[3] = 0; 진입가격[3] = 0; ExitLong("S2손절3",OnClose,DEF,"S2매수3",DEF); } If 진입횟수 == 2 && C < 손절가격[2] Then { 추가진입가격 = 0; 진입횟수 = 1; 손절가격[2] = 0; 진입가격[2] = 0; ExitLong("S2손절2",OnClose,DEF,"S2매수2",DEF); } If 진입횟수 == 1 && C < 손절가격[1] Then { 진입구분 = 0; 추가진입가격 = 0; 진입횟수 = 0; 손절가격[1] = 0; 진입가격[1] = 0; ExitLong("S2손절1",OnClose,DEF,"S2매수1",DEF); } } If DayAtr >= 명목계정 * 0.01 * N배수 Then { ExitLong(); }