더 있는 트레이드는 마지막 트레이드입니다. 데이터가 끝날 때 아직 열려 있던 포지션을 TradingView가 마지막 봉의 종가에 청산한 트레이드로 기록한 것입니다. 그 행이 무엇인지, 왜 통계를 바꾸는지, PineForge는 이를 어떻게 기록하는지 설명합니다.
같은 전략인데 TradingView에는 내 백테스터보다 트레이드가 하나 더 있습니다. 더 있는 건 목록의 마지막 트레이드입니다. 청산 시그널은 Open이거나 비어 있고, 청산가는 그냥 마지막 봉의 종가입니다.
어느 쪽 도구도 고장 난 게 아닙니다. 이 행은 데이터가 끝나는 시점에 아직 열려 있는 포지션을 TradingView가 보고하는 방식입니다. 이 행을 빼는 백테스터는 트레이드 수와 순이익, 그리고 이 둘로 계산하는 모든 통계에서 TradingView와 어긋납니다.
TradingView가 기록하는 것
백테스트는 마지막 봉에서 멈출 뿐, 그 자리에서 포지션을 정리해 주는 장치는 없습니다. TradingView 리포트는 열린 포지션을 버리지 않습니다. 구간의 마지막 봉에서 그 봉의 종가로 청산한 트레이드로 기록하고, 다른 트레이드와 똑같이 셉니다. PineForge도 이 규칙을 그대로 따르며, 자세한 내용은 엔진 헤더에 있습니다.
공개 코퍼스에서 예를 하나 보겠습니다. stats-eventrades-zero-pnl-count-01은 UTC 자정 봉에서 1단위를 매수하고(체결은 다음 봉 시가), 그 진입가에 지정가로 매도하는 전략입니다. 이 전략의 마지막 롱은 끝내 그 가격으로 돌아오지 못했습니다. TradingView의 트레이드 목록은 다음과 같습니다(시각은 Asia/Taipei 타임존 기준이라 08:00이 UTC 자정입니다).
Trade number,Type,Date and time,Signal,Price USDT,...,Net PnL USDT,...
140,Exit long,2026-05-01 08:00,,2261.44,...,-2525.12,...
140,Entry long,2025-08-25 08:15,even-trade entry,4786.56,...,-2525.12,...
청산 행을 보세요. 시그널이 없고, 가격은 마지막 봉의 종가일 뿐입니다. 전략은 한 번도 팔지 않았습니다. −2,525.12는 8개월 동안 들고 있던 포지션의 평가 손실인데도, 트레이드 목록과 순이익에는 실현된 손실처럼 들어가 있습니다.
이 행의 표기는 두 가지입니다. TradingView에서 트레이드 목록을 CSV로 직접 내보내면 Signal 열에 Open이라고 적힙니다(이 전략의 이전 내보내기가 그랬습니다). TradingView의 딥 백테스팅 리포트에서는 이 칸이 비어 있고, 지금 코퍼스 파일 대부분에서도 위처럼 비어 있습니다(채점기).
행 하나가 중요한 이유
매매가 뜸한 전략이나 짧은 구간에서는 열린 포지션이 결과의 대부분을 차지하기도 합니다. 일봉 차트에서는 구간 안의 유일한 트레이드인 경우도 흔합니다. PineForge가 이 행을 기록하기 전에는 이런 전략에서 트레이드가 하나도 없다고 보고했고, TradingView는 하나라고 보고했습니다. 트레이드 수, 승률, 순이익, 평균 트레이드 손익까지, 트레이드 목록으로 계산하는 수치는 모두 이 행을 따라 움직입니다.
PineForge가 기록하는 것
예전 엔진은 청산된 트레이드만 내보냈습니다. 지금은 TradingView가 기록하는 행을 똑같이 기록합니다. 마지막 봉 이후에도 열려 있는 로트마다 한 행씩, 날짜는 그 봉으로, 가격은 그 봉의 종가를 틱 단위로 반올림한 값으로 기록합니다. 수수료는 붙이지만 슬리피지는 붙이지 않습니다. 이 행은 “주문이 아니라 시가 평가(mark)”이기 때문입니다(엔진 가이드). 엔진의 트레이드 목록은 마지막 열로 이 행을 표시합니다.
Trade #,Type,Date and time,Price,Qty,Net PnL,...,Engine range-end
140,Exit long,2026-05-01 00:00,2261.440000,1,-2525.120000,...,open
봉도, 가격도, 손실도 TradingView와 같고, open은 이 행이 시가 평가라는 표시입니다. 스크립트 자신은 이 행을 보지 못합니다. 실행 중에는 포지션이 아직 열려 있으므로 Pine의 strategy.closedtrades는 이 트레이드를 세지 않습니다. 엔진 문서도 이 변수와 맞추려면 이 행을 걸러 내라고 안내합니다(Pine-네이티브 대응표).
데이터가 끝나는 지점이 가격을 정한다
시가 평가는 백테스터의 마지막 봉에서 기록되므로, 그 봉이 TradingView의 마지막 봉과 같아야 합니다. TradingView의 구간은 종료일 UTC 자정이나 그 전에 시작하는 마지막 봉에서 끝납니다(하네스). 그런데 코퍼스의 가격 파일은 그 뒤로 5월 4일까지 이어집니다. 파일을 통째로 넣으면 엔진은 140번 트레이드를 그날 마지막 봉의 2,365.09에 기록하게 되는데, TradingView의 2,261.44보다 약 4.6% 높은 값입니다(같은 파일). 그래서 하네스는 실행 전에 데이터를 TradingView의 마지막 봉에서 자릅니다.
그다음 엔진의 채점기는 두 행을 다른 트레이드와 똑같이 짝짓고, 청산가와 P&L도 다른 트레이드처럼 채점합니다. TradingView가 이 행을 Open으로 표기했을 때만 이 짝을 시가 평가끼리의 비교로 다룹니다. 짝을 짓고 개수에 넣고 진입도 확인하지만, 청산과 P&L은 채점에서 빼고, P&L 일치 여부는 센트 단위로 따로 보고합니다(채점기).
전략 29개, 트레이드 하나 더
현재 엔진으로 코퍼스의 트레이드 목록을 다시 만들었더니 전략 312개 중 29개에서 트레이드 수가 바뀌었습니다. 그중 26개는 새로 생긴 트레이드 가운데 하나가 바로 이 행입니다. 나머지 세 개는 TradingView 쪽 목록이 그날 끝까지 포함하도록 갱신되면서 청산된 트레이드가 하나 늘었습니다.
stats-eventrades-zero-pnl-count-01의 이전 목록도 채점기에서 최고 등급을 받고 있었습니다. 채점기는 두 목록이 함께 다루는 구간의 양쪽 끝에서 트레이드를 잘라 냅니다. 시작이나 끝에 트레이드가 하나 더 있다는 이유만으로 전략이 떨어지지 않게 하려는 장치입니다. 그런데 여기서는 이 잘라 내기가 빠진 트레이드를 가렸습니다. 이전 리포트는 TradingView 목록에 140건이 있는데도 양쪽 139건씩을 채점했고, 새 리포트는 140건 대 140건을 채점합니다.
코퍼스 전략 312개 중 131개, 열에 넷이 넘는 전략에서 PineForge의 트레이드 목록이 아직 열린 포지션으로 끝납니다(코퍼스 README).
실무에서 기억할 것
- TradingView에 내 백테스터보다 트레이드가 하나 더 있고 그게 마지막 트레이드라면, 끝까지 열려 있던 포지션이 있는지 찾아보세요. TradingView의 정상 동작입니다.
- TradingView의 순이익과 승률에는 그 포지션이 마지막 종가 기준으로 들어 있습니다. 실현된 결과만 보려면 청산 시그널이
Open이거나 비어 있는 마지막 트레이드를 빼세요. PineForge 목록에서는open으로 표시된 트레이드입니다. - 두 백테스트를 비교하기 전에 둘 다 같은 봉에서 멈추게 하세요. TradingView 종료일 UTC 자정까지 시작하는 마지막 봉입니다.
2026-10-02에 그날 릴리스된 PineForge 엔진과 codegen 1.0.1로 측정했습니다.
다음으로 볼 곳
- engine_trades.csv 형식 읽기: 위에서 인용한 파일의 모든 열과 pandas 로더.
- 갤러리 둘러보기: 코퍼스 전략마다 트레이드 목록을 TradingView의 목록과 나란히 보여 줍니다.
- 패리티를 측정하는 방법: 현재 결과와 그 출처.