커뮤니티

청산 관련

프로필 이미지
gap
2018-08-19 23:00:08
144
글번호 121442
답변완료
안녕하세요. 글번호 58847번의 연장입니다. (지난 8월 1일 문의함) 항셍과 같이 당일 진입 당일 청산을 하는 종목은 아래와 같이 장 마감 전 모든 포지션을 강제청산하는게 용이합니다. Var: MP(0); MP = MarketPosition; If (MP <> 0) then SetStopEndofday(051430); 문제는 당일 진입 후 익일 청산하는 종목들(CME 거래소 종목)에서는 위와 같은 강제청산 로직을 쓰면 당일 진입을 못하고 익일 자정 이후부터 포지션이 잡힌다는 겁니다. 그래서 지난 번 알려주신 로직을 아래와 같이 잘 쓰고 있습니다. Inputs: SSTIME(200000), EETIME(050000), XXTIME(051430); //--------- 써머타임 체크 ---------// Vars: ST(0), ET(0), Year(0); Year = Floor(sDate / 10000); Var18 = DayofWeek( (10000 * Year) + (100 * 3) + 1 ); If Var18 == 0 Then Value98 = 8; Else Value98 = 15 - Var18; // 3월 두번째 일요일 날짜 Var20 = DayofWeek( (10000 * Year) + (100 * 11) + 1 ); If Var20 == 0 Then Value99 = 1; Else Value99 = 8 - Var20; // 11월 첫번째 일요일 날짜 If sDate > (10000 * Year) + (100 * 3) + Value98 And sDate < ( 10000 * Year) + (100 * 11) + Value99 Then Begin ST = 070000; // 써머타임 적용 시, 장 시작 시간 ET = 060000; // 써머타임 적용 시, 장 종료 시간 End Else Begin ST = 080000; // 장 시작 시간 ET = 070000; // 장 종료 시간 End; CONDITION1 = ( IntPortion(Time / 10000) > IntPortion(ET / 10000) And IntPortion(Time[1] / 10000) <= IntPortion(ET / 10000) ) Or ST <> ST[1]; //------- 매매 시간대 -------// Vars: MP(0), TimeCond(False); MP = MarketPosition; If (sDate != sDate[1] and sTime >= SSTIME) or (sDate == sDate[1] and sTime >= SSTIME and sTime[1] < SSTIME) Then Begin TimeCond = True; End; If (sDate != sDate[1] and sTime >= EETIME) or (sDate == sDate[1] and sTime >= EETIME and sTime[1] < EETIME) Then Begin TimeCond = False; End; If (sDate != sDate[1] and sTime >= XXTIME) or (sDate == sDate[1] and sTime >= XXTIME and sTime[1] < XXTIME) Then Begin If MP == 1 Then ExitLong("Exit Buy"); If MP == -1 Then ExitShort("Exit Sell"); End; //--------- 진입 로직 ---------// If TimeCond Then Begin ~~~~~~~~~~~ 중략 ~~~~~~~~~~~~ End; 여기까지는 좋은데 문제는 '시스템 매매 설정'에서 주문 시작 신호를 진입 신호로 안쓰고 모든 신호로 잘못해서 설정할 경우에는 Exitlong 함수에서 매도로 진입하고, Exitshort에서 매수로 진입하는 경우가 있습니다. 이렇게 되면 뒤에 연이어 다른 진입신호가 떴을 때 한번 더 진입을 하게 되어 총 2개의 포지션을 갖게 됩니다. 다음에 나올 청산 로직에서는 진입 포지션을 한 개로만 인식하고 하나만 청산합니다. 그럼 나머지 하나의 포지션은 장 마감 이후에도 포지션이 정리가 안되어 남아 있습니다. 이런 경우를 대비해 SetStopEndofday() 함수를 이용해 남아 있는 당일 모든 포지션을 강제 청산하려는 것인데 CME 거래소 종목에서는 의도하는 시간대부터 진입이 안되는 문제가 있어서 강제청산함수를 못쓰고 있습니다. 이를 대체할 수 있는 청산 로직을 가이드 해주시면 감사하겠습니다.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2018-08-20 15:25:52

안녕하세요 예스스탁입니다. 문의하신 내용은 시스템(신호상) 포지션과 실제 계좌의 포지션이 달라 발생하는 문제로 랭귀지 수식으로는 제어가 되지 않습니다. 시스템의 모든 신호와 포지션은 신호상의 내용으로만 인지를 합니다. 주문시작신호를 잘못지정하신 경우나 차트와 실제계좌의 포지션이 다른경우에는 수동주문등으로 맞춰 주셔야 합니다. 도움을 드리지 못해 죄송합니다. 즐거운 하루되세요 > gap 님이 쓴 글입니다. > 제목 : 청산 관련 > 안녕하세요. 글번호 58847번의 연장입니다. (지난 8월 1일 문의함) 항셍과 같이 당일 진입 당일 청산을 하는 종목은 아래와 같이 장 마감 전 모든 포지션을 강제청산하는게 용이합니다. Var: MP(0); MP = MarketPosition; If (MP <> 0) then SetStopEndofday(051430); 문제는 당일 진입 후 익일 청산하는 종목들(CME 거래소 종목)에서는 위와 같은 강제청산 로직을 쓰면 당일 진입을 못하고 익일 자정 이후부터 포지션이 잡힌다는 겁니다. 그래서 지난 번 알려주신 로직을 아래와 같이 잘 쓰고 있습니다. Inputs: SSTIME(200000), EETIME(050000), XXTIME(051430); //--------- 써머타임 체크 ---------// Vars: ST(0), ET(0), Year(0); Year = Floor(sDate / 10000); Var18 = DayofWeek( (10000 * Year) + (100 * 3) + 1 ); If Var18 == 0 Then Value98 = 8; Else Value98 = 15 - Var18; // 3월 두번째 일요일 날짜 Var20 = DayofWeek( (10000 * Year) + (100 * 11) + 1 ); If Var20 == 0 Then Value99 = 1; Else Value99 = 8 - Var20; // 11월 첫번째 일요일 날짜 If sDate > (10000 * Year) + (100 * 3) + Value98 And sDate < ( 10000 * Year) + (100 * 11) + Value99 Then Begin ST = 070000; // 써머타임 적용 시, 장 시작 시간 ET = 060000; // 써머타임 적용 시, 장 종료 시간 End Else Begin ST = 080000; // 장 시작 시간 ET = 070000; // 장 종료 시간 End; CONDITION1 = ( IntPortion(Time / 10000) > IntPortion(ET / 10000) And IntPortion(Time[1] / 10000) <= IntPortion(ET / 10000) ) Or ST <> ST[1]; //------- 매매 시간대 -------// Vars: MP(0), TimeCond(False); MP = MarketPosition; If (sDate != sDate[1] and sTime >= SSTIME) or (sDate == sDate[1] and sTime >= SSTIME and sTime[1] < SSTIME) Then Begin TimeCond = True; End; If (sDate != sDate[1] and sTime >= EETIME) or (sDate == sDate[1] and sTime >= EETIME and sTime[1] < EETIME) Then Begin TimeCond = False; End; If (sDate != sDate[1] and sTime >= XXTIME) or (sDate == sDate[1] and sTime >= XXTIME and sTime[1] < XXTIME) Then Begin If MP == 1 Then ExitLong("Exit Buy"); If MP == -1 Then ExitShort("Exit Sell"); End; //--------- 진입 로직 ---------// If TimeCond Then Begin ~~~~~~~~~~~ 중략 ~~~~~~~~~~~~ End; 여기까지는 좋은데 문제는 '시스템 매매 설정'에서 주문 시작 신호를 진입 신호로 안쓰고 모든 신호로 잘못해서 설정할 경우에는 Exitlong 함수에서 매도로 진입하고, Exitshort에서 매수로 진입하는 경우가 있습니다. 이렇게 되면 뒤에 연이어 다른 진입신호가 떴을 때 한번 더 진입을 하게 되어 총 2개의 포지션을 갖게 됩니다. 다음에 나올 청산 로직에서는 진입 포지션을 한 개로만 인식하고 하나만 청산합니다. 그럼 나머지 하나의 포지션은 장 마감 이후에도 포지션이 정리가 안되어 남아 있습니다. 이런 경우를 대비해 SetStopEndofday() 함수를 이용해 남아 있는 당일 모든 포지션을 강제 청산하려는 것인데 CME 거래소 종목에서는 의도하는 시간대부터 진입이 안되는 문제가 있어서 강제청산함수를 못쓰고 있습니다. 이를 대체할 수 있는 청산 로직을 가이드 해주시면 감사하겠습니다.