커뮤니티

질문 있습니다.

프로필 이미지
스오어스
2025-11-10 20:55:09
62
글번호 227863
답변완료

질문 요점: 청산 후 NetProfit 체크 방식으로도 진입 차단 문제 발생
안녕하세요. 이전 질문에 대한 답변 감사합니다. (글번호 227784) "매 틱마다 체크하지 말고 청산 후에만 체크하라"는 조언을 참고하여 코드를 수정했는데, 여전히 같은 문제가 발생합니다.ㅜㅜ
=========================================== 구현하려는 기능 =========================================== 주간 손실 제한 시스템: - 지난주 수익: 금요일 종가 까지 +200틱 벌었고 - 이번주 월요일 시작하면서 최대 손실 허용: -200틱 입력 합니다. - 이번주 월~금 중에 누적 손실이 -200 도달 시: 강제 청산 + 이번 주 매매 종료
예시: 월요일 NetProfit: 200 → 210 → 160 → 90 수요일 NetProfit: 90 → 0 → WeeklyProfit = 0 - 200 = -200 → 강제 청산 + 이번 주 매매 종료
=========================================== 문제 상황 =========================================== UseWeeklyStop=0: 정상 작동 되지만... UseWeeklyStop=1: 차트 신호 전부 사라집니다. ㅠㅠ 차트에 아무것도 없습니다.
=========================================== 핵심 코드 =========================================== // === Input === Input : UseWeeklyStop(0); // 0=OFF, 1=ON Input : WeekStartProfit(0); // 이번 주 시작 수익 (틱) Input : MaxWeekLoss(-200); // 최대 허용 손실 (틱, 음수) // === 변수 === Var : WeeklyProfit(0); // 이번 주 누적 수익 Var : WeekStopTriggered(0); // 주간 손실 도달 플래그 // === 진입 조건 (기존 조건 + WeekStopTriggered 체크) === if MarketPosition == 0 and InWaitPeriod == 0 and (기타 진입 조건들...) and WeekStopTriggered == 0 Then { Buy("L", OnClose, Def, 1); // 진입 후 초기화... } // === 청산 후 주간 손실 체크 (손절 예시) === if MarketPosition == 1 Then { // 손절 조건 if C <= StopPrice Then { ExitLong("U-"); LastExitDate = sDate; LastExitTime = CurrentTime; WaitMinutes = 1200; InWaitPeriod = 1; // 청산 직후 주간 손실 체크 if UseWeeklyStop == 1 and WeekStopTriggered == 0 Then { WeeklyProfit = NetProfit - WeekStartProfit; if WeeklyProfit <= MaxWeekLoss Then { WeekStopTriggered = 1; InWaitPeriod = 1; WaitMinutes = 99999; // 긴 대기시간으로 차단 } } } // 익절 조건 if H >= UpperBand Then { ExitLong("U+"); LastExitDate = sDate; LastExitTime = CurrentTime; WaitMinutes = 300; InWaitPeriod = 1; // 청산 직후 주간 손실 체크 if UseWeeklyStop == 1 and WeekStopTriggered == 0 Then { WeeklyProfit = NetProfit - WeekStartProfit; if WeeklyProfit <= MaxWeekLoss Then { WeekStopTriggered = 1; InWaitPeriod = 1; WaitMinutes = 99999; } } } } // 매도 포지션도 동일한 방식으로 구현
=========================================== 디버깅 시도 =========================================== 1. UseWeeklyStop=0으로 설정 했는데 정상 작동이 됩니다. 2. UseWeeklyStop=1, WeekStartProfit=0, MaxWeekLoss=-200 로 했더니 백테스트 시작부터 차트에 진입 신호 없고 아무것도 없습니다. 3. 백테스트 초기 상태는 아래와 같습니다. - NetProfit = 0 - WeekStartProfit = 0 - MaxWeekLoss = -200 - WeekStopTriggered = 0 - WeeklyProfit = 0 - 0 = 0 - 0 <= -200? → False (정상) 이론상 문제없어 보이는데 실제로는 진입 안됨 4. WeekStopTriggered 관련 코드 전부 주석 처리 하니 정상 작동 됨 → WeekStopTriggered 변수 자체에 문제일가요?
=========================================== 질문 =========================================== 1. 청산 후에만 NetProfit를 체크하는데도 백테스트 초기에 진입이 차단되는 이유가 뭘까요?
2. WeekStopTriggered 초기값이 0인데 진입 조건에서 WeekStopTriggered == 0 체크만으로 진입이 안 되는 이유가 있을까요?
3. 변수 초기화 시점이나 스코프 문제일까요? - Var : WeekStopTriggered(0); 선언만으로 충분한가요? - 추가 초기화가 필요한가요?
4. 이런 방식 대신 다른 방법을 사용해야 하나요? - NetProfit 대신 다른 함수? - 플래그 변수 대신 다른 방식?
=========================================== 도움 요청 =========================================== 주간 손실 제한 기능을 올바르게 구현하는 방법을 알려주시면 감사하겠습니다! - 청산 후 NetProfit 체크 방식이 맞나요? - 변수 초기화나 사용 방법에 문제가 있을까요? - 다른 접근 방법이 필요할까요?
ㅜㅜ
감사합니다!

시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-11-11 15:26:52

안녕하세요 예스스탁입니다. 1 NetProfit은 청산완료 후에 값이 변경이 됩니다. if 조건 then exitlong(); 위 내용은 봉완성시(다음봉시가수신) 조건이 만족하면 종가에 청산신호이지만 NetProfit은 그 다음봉 시가부터 변경되게 됩니다. 그 완성봉에서 변경된 값을 사용할 수 없습니다. 2 NetProfit은 차트신호상 손익입니다. WeekStartProfit가 input변수로 선언이 되어 있는데 직접 지정하신값과 차트상 총손익을 비교하는게 맞는지 모르겠습니다. 매일 차트를 조회하면 최근 N봉만 조회가 되므로 오늘 차트초반에 조회된 데이터는 다음날에 조회되지 않아 NetProfit이 매일 변동이 생기게 됩니다. 3 올리신 내용에서 확인안되는 내용이 많아 수정해 드리긴 어렵습니다. 아래식 참고하셔서 변경해 보시기 바랍니다. 청산후 주간 손익이 일정값 이상이면 진입을 막는 내용입니다. WeekStartProfit에 특정값을 지정하신다면 해당값 포함 감안해서 MaxWeekLoss의 값을 지정해 주시면 됩니다. Input : MaxWeekLoss(-200);//0이면 주간손실 체크안함 var : NP(0),NP1(0),Trade(False),WeeklyProfit(0); NP = NetProfit; if DayOfWeek(Bdate)<= DayOfWeek(Bdate[1]) Then { //전주 마지막 NetProfit NP1 = NP[1]; //Trade는 true Trade = true; } //이번주손익 WeeklyProfit = NetProfit - NP1; //청산발생 if TotalTrades > TotalTrades[1] Then { //MaxWeekLoss는 0이 아니고 주간손익이 MaxWeekLoss보다 작으면 //Trade는 False if MaxWeekLoss != 0 and WeeklyProfit <= MaxWeekLoss Then Trade = False; } if MarketPosition == 0 and (기타 진입 조건들...) and Trade == true Then { Buy("L", OnClose, Def, 1); } if MarketPosition == 1 Then { // 손절 조건 if C <= StopPrice Then { ExitLong("U-"); } // 익절 조건 if H >= UpperBand Then { ExitLong("U+"); } } 즐거운 하루되세요