Little
Bird Trading

Pine Script 봉 마감과 봉 중간의 차이: 리페인팅, 알림, calc_on_every_tick

읽는 시간 3분 · 업데이트

과거 차트에서는 깔끔해 보이는 Pine Script가 실시간에서는 신호를 냈다가 나중에 사라지게 할 수 있습니다. 거의 모든 경우가 한 가지 질문으로 귀결됩니다. 스크립트가 마감된 봉에서 동작하는가, 아직 형성 중인 봉에서 동작하는가.

이 가이드는 이를 좌우하는 각 설정과, 제가 레벨 알림에 쓰는 설정을 설명합니다.

과거 봉과 실시간 봉

과거 봉에서 Pine은 스크립트를 봉마다 마감 시점에 한 번만 실행합니다. 실시간 봉에서는 가격이 갱신될 때마다 다시 실행합니다. close > level 같은 조건은 10:01에는 참, 10:03에는 거짓, 10:04에는 다시 참일 수 있습니다. 과거 차트에는 마지막 답만 남습니다. 이 차이가 트레이더들이 리페인팅이라고 부르는 현상입니다.

barstate.isconfirmed

barstate.isconfirmed 는 봉의 마지막 갱신, 즉 봉이 마감될 때만 참입니다. 조건에 추가하면 실시간 봉도 과거 봉처럼 동작합니다:

crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")

대가는 속도입니다. 신호가 봉 마감 때 나오므로, 느린 시간대에서는 봉 하나만큼 늦어집니다.

알림 빈도

알림을 만들면 TradingView가 얼마나 자주 울릴지 묻습니다:

  • Once Per Bar Close: 조건이 참인 채로 봉이 마감될 때만 울립니다. 백테스트와 일치합니다.
  • Once Per Bar: 봉 안에서 조건이 처음 참이 되는 순간 울립니다. 봉이 반대로 마감되더라도 울립니다.
  • Once Per Minute과 Only Once: 울리는 횟수에 대한 제한입니다.

레벨 알림에는 1분 또는 5분 차트에서 Once Per Bar Close를 씁니다. 레벨을 꼬리로 뚫었다가 안쪽으로 되돌아와 마감하면 울리지 않아서, 대부분의 가짜 돌파가 걸러집니다.

전략: calc_on_every_tick과 process_orders_on_close

전략은 기본적으로 과거 봉과 실시간 봉 모두에서 봉 마감 때 실행됩니다. 두 가지 설정이 이를 바꿉니다:

  • calc_on_every_tick=true 는 실시간 갱신마다 전략을 실행합니다. 과거 데이터에서는 이것이 불가능하므로 실제 거래가 백테스트와 달라지기 시작합니다.
  • process_orders_on_close=true 는 신호가 나온 봉의 종가에 주문을 체결합니다. 기본값은 다음 봉의 시가에 체결됩니다. 종가 기준 청산에는 적합하지만 진입을 실제보다 좋아 보이게 할 수 있습니다.

전략이 봉 마감 기준으로 제대로 동작할 때까지는 둘 다 꺼 두세요. 인디케이터와 전략 비교 가이드에서 Strategy Tester의 나머지 가정을 다룹니다.

Bar Magnifier

과거 데이터에서 전략이 아는 것은 각 봉의 시가, 고가, 저가, 종가뿐입니다. 손절과 목표가가 한 봉 안에 모두 있으면 어느 쪽이 먼저 닿았는지 추측해야 합니다. use_bar_magnifier=true 는 하위 시간대 데이터로 이를 판정하며, TradingView 유료 요금제에서 쓸 수 있습니다. 간격이 좁은 손절과 목표가를 믿기 전에 켜 두세요.

request.security와 상위 시간대

5분 차트에 일봉 고가를 가져오는 것은 리페인팅의 흔한 원인입니다. 과거 데이터에서는 일봉이 이미 완성되어 있어서, 스크립트가 그날 첫 봉부터 최종 고가를 봅니다. 실시간에서는 고가가 계속 움직입니다. 이전의 확정된 값을 요청하세요:

prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)

lookahead_on과 함께 쓰는 [1] 는 과거와 실시간 모두에서 오늘의 모든 봉에 어제의 고가를 줍니다.

체크리스트

  • 신호에 barstate.isconfirmed 를 쓰거나 알림이 Once Per Bar Close입니다.
  • 상위 시간대 값에 lookahead_on과 함께 [1] 를 씁니다.
  • 전략이 봉 마감 기준으로 실행되고, calc_on_every_tick 은 꺼져 있습니다.
  • 손절과 목표가가 가까울 때는 Bar Magnifier가 켜져 있습니다.
  • 거래하기 전에 일주일치 실제 알림을 백테스트와 비교합니다.

움직이지 않는 레벨

제 트레이드 플랜 레벨은 세션 전에 정해져 하루 종일 고정되므로, 이를 그리는 스크립트에는 리페인팅될 것이 없습니다. Pine Script 레벨 가이드에서 TradingView에 표시하는 방법을 보여 드립니다.

FAQ

Pine Script에서 봉 마감과 봉 중간은 어떻게 다른가요?

봉 마감은 봉이 끝났을 때 스크립트가 한 번만 동작한다는 뜻입니다. 봉 중간은 봉 안에서 가격이 갱신될 때마다 동작한다는 뜻이어서, 신호가 나타났다가 마감 전에 사라질 수 있습니다.

Pine Script 알림이 리페인팅되지 않게 하려면 어떻게 하나요?

알림을 Once Per Bar Close로 설정하거나 조건에 barstate.isconfirmed 를 추가하세요. 상위 시간대 데이터는 lookahead_on과 함께 이전 봉의 값을 사용하세요.

전략 백테스트는 봉 중간 가격을 사용하나요?

봉 안에서의 체결에만, 그리고 Bar Magnifier를 켰을 때만 사용합니다. 과거의 신호는 각 봉의 종가에서 계산됩니다.

출처

  • TradingView Pine Script 사용자 매뉴얼: 실행 모델, 리페인팅, 알림
  • TradingView 고객센터: Bar Magnifier

교육용 콘텐츠입니다. 투자 조언이 아닙니다.