커뮤니티

안녕하세요. 질문 있습니다.

프로필 이미지
스오어스
2025-09-17 16:40:41.0
68
글번호 194095
답변완료
안녕하세요. 손절 후 쿨다운 기능 구현 관련 질문 입니다. 기존은 조건대로 손절 발생 후 다음 조건대로 계속 진입해서 연속 손절을 하는 문제가 있었습니다. 그래서 조건대로 진입하다가 손절 되면 바로 다음 진입하지 않고 일정 시간 동안 재진입을 막는 쿨다운 기능을 구현하려고 하는데, 제대로 작동하지 않아 문의드립니다. 구현하려는 로직: 손절 발생 시 해당 60분 주기 내에서 설정한 시간(예: 20분) 동안 재진입 차단 60분 주기가 새로 시작되면 쿨다운 리셋하고 처음부터 다시 시작 쿨다운 완료 후 조건 맞으면 재진입, 조건 안 맞으면 다음 60분 주기까지 대기 현재 시도한 코드: var : InCooldown(0); var : CooldownStartTF(0); Input : CooldownMinutes(20); // 손절 감지 시 쿨다운 시작 if MarketPosition[1] == 1 and MarketPosition == 0 and PositionProfit < 0 Then { InCooldown = 1; CooldownStartTF = TF; // 60분 주기 내 시간 저장 TradingAllowed = 0; } // 쿨다운 체크 if InCooldown == 1 Then { if TF >= CooldownStartTF + CooldownMinutes Then { InCooldown = 0; TradingAllowed = 1; } else { TradingAllowed = 0; } } // 진입 조건에 쿨다운 체크 추가 if TF >= RangeMinutes and TF < 55 and InCooldown == 0 and TradingAllowed == 1 Then { // 진입 로직 } 문제점: 손절 후 20분이 지나도 해당 60분 주기 내에서 재진입이 안됨 TF 기준으로 쿨다운을 계산했는데 정확히 작동하지 않음 여러 조건에서 TradingAllowed 변수를 동시에 제어할 때 충돌이 발생하는 것 같음 질문사항: 60분 주기 내에서 TF 기준 쿨다운을 구현하는 정확한 방법이 있나요? 여러 조건에서 TradingAllowed 변수를 동시에 제어할 때 우선순위 설정 방법이 있나요? 60분 주기 시작시 변수 초기화와 쿨다운 로직의 올바른 순서는 무엇인가요? 60분 주기 내 쿨다운 구현 방법에 대한 조언 부탁드립니다. **추가 질문** 변수 초기화 순서 관련: // 60분 주기 시작시 초기화 순서가 중요한지? EntryCount = 0; TradingAllowed = 1; // 이게 쿨다운을 덮어쓰는 건 아닌지? InCooldown = 0; // 이 순서가 맞는지? TF 계산의 정확성: "TF가 0~59분으로 순환할 때, CooldownStartTF = 45이고 CooldownMinutes = 20이면 TF >= 65가 되어야 하는데, 실제로는 TF가 59를 넘지 않아서 계산이 틀어지는 것 같습니다." 디버깅용 질문: "쿨다운 상태를 확인할 수 있는 디버깅 방법이나 Text_New로 현재 상태를 표시하는 방법이 있나요?" 감사합니다.
시스템
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-09-18 10:58:26.0

안녕하세요 예스스탁입니다. 1 MarketPosition[1] == 1 and MarketPosition == 0 and PositionProfit < 0 현재 모포지션인데 현재 포지션의 손익이 0보다 작을 수 없습니다. 청산이 발생하고 현재 무포지션이므로 직전거래의 손익을 지정하셔야 합니다. 2 하나의 if문에서 실행문들의 위아래 위치는 관계없습니다. 3 올리신 내용에 TF가 어떤 로직인지 알수 없습니다. 아래식 참고하시기 바랍니다. input : 분주기(60),CooldownMinutes(20); var : S1(0),D1(0),TM(0),TF(0),CooldownStartTF (0),TradingAllowed(0),tx(0); if Bdate != Bdate[1] Then { S1 = TimeToMinutes(stime); D1 = sdate; } if D1 > 0 then { if sdate == D1 Then TM = TimeToMinutes(stime)-S1; Else TM = TimeToMinutes(stime)+1440-S1; TF = TM%분주기; //새로운 60분 시작 if Bdate != Bdate[1] or (Bdate == Bdate[1] and 분주기 > 1 and TF < TF[1]) or (Bdate == Bdate[1] and 분주기 > 1 and TM >= TM[1]+분주기) or (Bdate == Bdate[1] and 분주기 == 1 and TM > TM[1]) Then { if TradingAllowed == 0 Then { tx = Text_New(sDate,sTime,H,"새로운분주기 시작 쿨다운해제"); Text_SetStyle(tx,2,1); } //Trade는 true TradingAllowed = 1; } //xTF이후 20분 경과 if TradingAllowed == False and TF >= CooldownStartTF +CooldownMinutes Then { //Trade는 true TradingAllowed = 1; tx = Text_New(sDate,sTime,H,"지정시간이후 쿨다운해제"); Text_SetStyle(tx,2,1); } //손절발생 if TotalTrades > TotalTrades[1] and PositionProfit(1) < 0 Then { //발생시 TF CooldownStartTF = TF; //Trade는 False TradingAllowed = 0; tx = Text_New(sDate,sTime,H,"쿨다운발생"); Text_SetStyle(tx,2,1); } if TradingAllowed == 1 Then { //진입수식 } } 즐거운 하루되세요 > 스오어스 님이 쓴 글입니다. > 제목 : 안녕하세요. 질문 있습니다. > 안녕하세요. 손절 후 쿨다운 기능 구현 관련 질문 입니다. 기존은 조건대로 손절 발생 후 다음 조건대로 계속 진입해서 연속 손절을 하는 문제가 있었습니다. 그래서 조건대로 진입하다가 손절 되면 바로 다음 진입하지 않고 일정 시간 동안 재진입을 막는 쿨다운 기능을 구현하려고 하는데, 제대로 작동하지 않아 문의드립니다. 구현하려는 로직: 손절 발생 시 해당 60분 주기 내에서 설정한 시간(예: 20분) 동안 재진입 차단 60분 주기가 새로 시작되면 쿨다운 리셋하고 처음부터 다시 시작 쿨다운 완료 후 조건 맞으면 재진입, 조건 안 맞으면 다음 60분 주기까지 대기 현재 시도한 코드: var : InCooldown(0); var : CooldownStartTF(0); Input : CooldownMinutes(20); // 손절 감지 시 쿨다운 시작 if MarketPosition[1] == 1 and MarketPosition == 0 and PositionProfit < 0 Then { InCooldown = 1; CooldownStartTF = TF; // 60분 주기 내 시간 저장 TradingAllowed = 0; } // 쿨다운 체크 if InCooldown == 1 Then { if TF >= CooldownStartTF + CooldownMinutes Then { InCooldown = 0; TradingAllowed = 1; } else { TradingAllowed = 0; } } // 진입 조건에 쿨다운 체크 추가 if TF >= RangeMinutes and TF < 55 and InCooldown == 0 and TradingAllowed == 1 Then { // 진입 로직 } 문제점: 손절 후 20분이 지나도 해당 60분 주기 내에서 재진입이 안됨 TF 기준으로 쿨다운을 계산했는데 정확히 작동하지 않음 여러 조건에서 TradingAllowed 변수를 동시에 제어할 때 충돌이 발생하는 것 같음 질문사항: 60분 주기 내에서 TF 기준 쿨다운을 구현하는 정확한 방법이 있나요? 여러 조건에서 TradingAllowed 변수를 동시에 제어할 때 우선순위 설정 방법이 있나요? 60분 주기 시작시 변수 초기화와 쿨다운 로직의 올바른 순서는 무엇인가요? 60분 주기 내 쿨다운 구현 방법에 대한 조언 부탁드립니다. **추가 질문** 변수 초기화 순서 관련: // 60분 주기 시작시 초기화 순서가 중요한지? EntryCount = 0; TradingAllowed = 1; // 이게 쿨다운을 덮어쓰는 건 아닌지? InCooldown = 0; // 이 순서가 맞는지? TF 계산의 정확성: "TF가 0~59분으로 순환할 때, CooldownStartTF = 45이고 CooldownMinutes = 20이면 TF >= 65가 되어야 하는데, 실제로는 TF가 59를 넘지 않아서 계산이 틀어지는 것 같습니다." 디버깅용 질문: "쿨다운 상태를 확인할 수 있는 디버깅 방법이나 Text_New로 현재 상태를 표시하는 방법이 있나요?" 감사합니다.