'0보다 적은 수량의 오더를 낼 수 없습니다' 에러가 납니다
이 오류는 전략이 포지션의 크기를 편일예탁잔고 비율로 계산할 때 나타납니다. 편일예탁잔고가 0 이하로 떨어지면 포지션의 크기도 음수가 되며, 이는 불가능하므로 런타임 오류가 발생합니다.
이 문제를 해결하는 가장 좋은 방법은 Pine 스크립트 v6로 전략을 변환하는 것입니다. Pine v6에서는 기본적으로 전략에 포지션 크기 제한을 적용합니다. 전략의 자산이 너무 많이 떨어지기 시작하면 기존 포지션은 마진콜에 의해 강제로 청산되고, 자금이 완전히 소진되면 전략은 마이너스 수량으로 새 주문을 생성하려고 시도하지 않아 이 오류를 방지합니다.
이 오류의 원인과 이전 Pine 버전에서 이 오류를 방지하는 방법에 대해 자세히 알아보려면 아래 텍스트를 참조하세요.
이 에러는 스트래티지 에쿼티가 음이고 strategy.entry() 또는 strategy.order() 펑크션에 대한 전체 계약수가 음 (qty < 0) 일 때 나옵니다. 프로퍼티 메뉴에서 스트래티지 세팅을 바꾸거나 또는 스트래티지 로직을 직접 바꿈으로써 이 에러를 막을 수 있습니다.
에러 소스
오더 퀀티티가 스트래티지 세팅의 오더 사이즈, 또는 스트래티지 파인 소스의 strategy_percent_of_equity 콘스탄트에 의해 에쿼티 퍼센티지로 셈이 되는 스크립트를 보겠습니다. 각 바에서
strategy.entry() 펑크션으로 포지션을 들어가게 됩니다:
//@version=5 strategy("negative_qty", default_qty_type = strategy.percent_of_equity)
strategy.entry("Short", strategy.short) plot(strategy.equity)
NASDAQ:AAPL 스크립트를 1D 타임프레임 차트에 넣으면 그 스크립트는 다음의 런타임 에러가 납니다:
0보다 적은 수의 오더를 낼 수 없습니다. 현재 qty_type 은 percent_of_equity 이며 equity 는 0 보다 작습니다
이 에러의 까닭을 알려면 strategy.equity 베어리어블을 써서 캐피털을 플롯한 뒤 조건 오퍼레이터를 써서 strategy.entry() 펑크션 콜을 하여 제약을 걸면 됩니다. 그렇게 하면 포지션을 들어가는 펑크션이 매 바마다 불리지 않게 되어 (그리고 qty 를 포함한 파라미터들의 재계산이 일어나지 않게 되어) 스크립트 셈이 에러없이 이루어집니다:
//@version=5 strategy("negative_qty", default_qty_type = strategy.percent_of_equity)
if strategy.equity > 0 strategy.entry("Short", strategy.short)
hline(0, "zero line", color = color.black, linestyle = hline.style_dashed) plot(strategy.equity, color = color.black, linewidth = 3)
두번 째 바 오픈 뒤에는 (bar_index = 1), 이 스트래티지는 숏 포지션을 들어가게 됩니다. 하지만 AAPL 밸류가 커짐에 따라 오픈된 숏 포지션인 Short 으로부터 프라핏 (strategy.openprofit 베어리어블 밸류) 이 뚝 떨어지게 되어, 마침내 스트래티지 캐피털이 (strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit) 네거티브가 됩니다.
스트래티지 엔진에 의한 컨트랙트 셈은 qty = (order size * equity / 100) / close 입니다.스트래티지 캐피털이 네거티브로 돌아서는 부분을 아래와 같이 디스플레이할 수 있습니다:
//@version=5 strategy("negative_qty", default_qty_type = strategy.percent_of_equity)
if strategy.equity > 0 strategy.entry("Short", strategy.short)
hline(0, "zero line", color = color.black, linestyle = hline.style_dashed) plot(strategy.equity, color = color.black, linewidth = 3) equity_p = 1 // percents of equity order size value (1% is default) qty = (equity_p * strategy.equity / 100) / close if qty <= -1 var l1 = label.new(bar_index, strategy.equity, text = "Negative qty_value at \n bar index: " + str.tostring(bar_index) + ".\n" + "Order size: " + str.tostring(math.round(qty)), color = color.white) var l2 = label.new(bar_index - 1, strategy.equity[1], text = "Order size : " + str.tostring(math.round(qty[1])), color = color.white) var l3 = label.new(bar_index - 2, strategy.equity[2], text = "Order size: " + str.tostring(math.round(qty[2])), color = color.white) bgcolor(qty > -1 ? color.green : color.red)
아래 스크린샷에 컨트랙트 셈이 -2 인 네거티브 섹션에 라벨이 보입니다. 그린 섹션의 컨트랙트 수는 >= 0:

스트래티지를 셈할 때 네거티브 에쿼티를 가진 바에서 strategy.entry() 가 콜되면 스트래티지 셈이 에러가 나며 멈춥니다
어떻게 고치나요?
보통 이 에러는 제대로 된 스트래티지에서는 나타나지 않습니다. 실수하지 않으려면 스트래티지에서 조건을 써서 포지션 엔터, 스탑 및 마진을 해야 합니다.
에러가 나면 올바른 스트래티지 디버깅 방법은 다음과 같습니다:
1. 마진 레버리지 쓰기 (스트래티지 프로퍼티의 롱/숏 포지션에 대한 마진 또는 strategy() 펑크션의 margin_long and margin_short 파라미터). 마진 값이 주어지면 해당 스트래티지가 그 포지션을 유지할 만큼 충분한 에쿼티가 없을 경우 포지션의 일부가 저절로 청산되게 됩니다. 당사 유저 매뉴얼의 아티클 또는 블로그 포스트에서 이 기능에 대해 자세한 것을 알 수 있습니다.
//@version=5 strategy("", default_qty_type = strategy.percent_of_equity, default_qty_value = 10, margin_long = 100, margin_short = 100)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) strategy.entry("Long", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) strategy.entry("Short", strategy.short)
2. strategy.entry() or strategy.order() 펑크션 콜에 앞서 에쿼티 밸류가 0 보다 큰지를 체크하거나 추가적으로 엔트리 컨트랙트 수를 재정의하기.
//@version=5 strategy("", default_qty_type = strategy.percent_of_equity, default_qty_value = 10)
if strategy.equity > 0 strategy.entry("Short", strategy.short) // enter at 10 % of currently available equity else strategy.entry("Long", strategy.long, qty = 1) // Reverse position with fixed contract size
3. 리스크 매니지먼트를 위해 strategy.risk 카테고리 베어리어블 쓰기. 당사 유저 매뉴얼 에서 이에 대한 자세한 것을 읽을 수 있습니다.