커뮤니티

질문 있습니다.

프로필 이미지
스오어스
2025-11-18 20:12:27
54
글번호 228189
답변완료

안녕하세요,  질문이 있는데요
포지션별 손절 기능이 작동하지 않습니다 (NetProfit 기반) 60분봉 차트로 추세 추종 시스템에서 포지션별 손절 기능을 구현 중인데, 손절이 전혀 작동하지 않아 도움을 요청드립니다.
구현 목표는 아래와 같습니다.

  1. 각 포지션 진입 시 NetProfit 값을 저장

  2. 해당 포지션의 손익이 -N pt 도달 시 손절

  3. 손절 후에도 시스템은 계속 작동

현재 상황은

  1. Input으로 PositionStopLoss를 20.0으로 설정하고 백테스트 → 결과 A

  2. Input으로 PositionStopLoss를 10.0으로 변경하고 백테스트 → 결과 A (완전 동일!)

  3. 시스템 성능에서 일간수익을 보니 -40pt, -147pt 등 설정값을 훨씬 초과하는 손실 발생

  4. 그 말은 Input에 수치 입력한 그대로 손절을 하지 않는다는 겁니다. ㅜㅜ

의심되는 부분: 진입 시점의 NetProfit이 제대로 기록되지 않는 것 같습니다. 코드 구조는 아래와 같습니다.

Input : PositionStopLoss(20.0);

var : EntryNetProfit(0);
var : CurrentPL(0);
var : PrevMarketPosition(0);

// 포지션 진입 감지 및 NetProfit 기록
if PrevMarketPosition == 0 and MarketPosition != 0 Then {
    EntryNetProfit = NetProfit;  // 이 부분이 실행이 안 되는 걸까요?
}
PrevMarketPosition = MarketPosition;

// 손절 체크
if MarketPosition != 0 Then {
    CurrentPL = NetProfit - EntryNetProfit;
    
    if PriceScale > 0 Then
        CurrentPL = (NetProfit - EntryNetProfit) / PriceScale;
    
    if PositionStopLoss > 0 and CurrentPL <= -PositionStopLoss Then {
        if MarketPosition == 1 Then
            ExitLong("Stop_L");
        if MarketPosition == -1 Then
            ExitShort("Stop_S");
    }
}

**추가 정보:** - 60분봉 차트 사용 중 - Buy/Sell은 OnClose로 진입 - ShowDebug로 확인해보니 EntryNetProfit 값이 0으로 나옴 (또는 확인 못함)
**전체 코드 흐름:** 1. 신호 발생 → Buy/Sell 명령 2. 포지션 진입 감지 → EntryNetProfit 기록 3. 매 봉마다 손절 체크
질문인데요.

  1. MarketPosition이 0에서 1(또는 -1)로 변경되는 시점은 정확히 언제인가요?

  2. 포지션 진입 시점의 NetProfit을 기록하려면 어떻게 해야 하나요?

  3. 혹시 EntryPrice를 사용해서 손익을 계산해야 하나요?

  4. 위 코드에서 어떤 부분이 잘못되었는지 알려주시면 감사하겠습니다!

추운데 몸 조심하고 건강하세요!  감사합니다!

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

예스스탁 예스스탁 답변

2025-11-19 10:49:41

안녕하세요 예스스탁입니다. 1 NetProfit은 청산완료된 거래까지의 총손익입니다.' 현재 진행중인 포지션의 손익은 포함되지 않습니다. 현재 포지션의 손익은 PositionProfit으로 리턴됩니다. PositionStopLoss이 틱수이면 PositionProfit/PriceScale <= -PositionStopLoss 포인트이면 아래와 같이 지정하시면 됩니다. PositionProfit <= -PositionStopLoss Input : PositionStopLoss(20.0); var : EntryNetProfit(0); var : CurrentPL(0); var : PrevMarketPosition(0); // 손절 체크 if MarketPosition != 0 Then { if PositionStopLoss > 0 and PositionProfit/PriceScale <= -PositionStopLoss Then { if MarketPosition == 1 Then ExitLong("Stop_L"); if MarketPosition == -1 Then ExitShort("Stop_S"); } } 2 MarketPosition등 포지션 함수는 신호가 발생하면 변경됩니다. 다만 if문이 봉완성시이므로 봉완성기준으로 변경된다고 보시면 됩니다. 진입이 onclose이면 봉완성(다음봉시가수신)시이고 if문이 봉완성이므로 신호표시봉 다음봉 부터 if MarketPosition != 0 Then 조건이 충족됩니다. 즐거운 하루되세요