我看到“无法创建负数量订单”错误

如果策略净值变为负并且为 strategy.entry()strategy.order() 函数计算的合约总数为负整数值(qty <0),则会出现此错误。 可以通过从“属性”菜单调整策略设置或直接更改策略的逻辑来避免这种情况。

错误来源

让我们看一下脚本,其中通过策略设置中的 Order Size 设置,或通过策略的 Pine 源中的 strategy_percent_of_equity 常量,将订单数量计算为权益的百分比。在每根K线上,调用 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 时间周期时,脚本会因运行时错误而崩溃:

Cannot create an order with negative quantity. Current qty_type is percent_of_equity and equity is less than 0

要了解此错误的原因,您应该使用 strategy.equity 变量绘制资本,并使用任何条件运算符对调用 strategy.entry() 函数添加约束。 这样,输入仓位的函数就不会在每根K线上被调用(并且不会导致额外的参数重新计算,包括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) 

在第二根K线开盘时 (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:

 

 

 

如果在计算策略时,在净值为负(且合约数量为负)的K线上调用 strategy.entry(),则策略计算将因错误而停止。

我该如何解决?

通常,此错误不会出现在正确实施的策略中。 为避免错误,该策略应使用进入和退出仓位、止损和保证金的条件。

如果发生错误,调试策略的正确方法是:

1. 使用保证金杠杆(策略属性中的多头/空头仓位保证金或 strategy() 函数中的 margin_longmargin_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()strategy.order() 函数或额外重新定义入场合约数量之前,检查净值是否大于零。

//@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 类别的变量进行风险管理。您可以在我们的用户手册中阅读有关这些的更多信息。