'0보다 적은 수의 오더를 낼 수 없습니다' 에러가 납니다

이 에러는 스트래티지 에쿼티가 음이고  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 카테고리 베어리어블 쓰기. 당사 유저 매뉴얼 에서 이에 대한 자세한 것을 읽을 수 있습니다.