Ich erhalte die Fehlermeldung "Auftrag mit negativer Menge kann nicht erstellt werden".

Dieser Fehler tritt auf, wenn der Strategiewert negativ wird und die Gesamtzahl der für die Strategie berechneten Kontrakte negativ wird. strategy.entry() oder strategy.order() Funktionen ist ein negativer ganzzahliger Wert (qty <0). Dies kann vermieden werden, indem man die Strategieeinstellungen im Menü "Eigenschaften" optimiert oder die Logik der Strategie direkt ändert.

Ursache des Fehlers

Werfen wir einen Blick auf das Skript, in dem die Auftragsmenge als Prozentsatz des Eigenkapitals berechnet wird, entweder über die Einstellung Auftragsgröße in den Strategieeinstellungen oder über die strategy_percent_of_equity Konstante in der Pine-Quelle der Strategie. Bei jedem Balken wird die Funktion strategy.entry() aufgerufen, um die Position zu erfassen:

//@version=5
strategy("negative_qty", default_qty_type = strategy.percent_of_equity)

strategy.entry("Short", strategy.short)
plot(strategy.equity)

Beim Hinzufügen des Skripts zu NASDAQ:AAPL Chart für den 1D Timeframe, stürzt das Skript mit einem Laufzeitfehler ab:

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

Um den Grund für diesen Fehler zu verstehen, sollten Sie das Kapital mit Hilfe der Variable der Funktion strategy.equity darstellen und den Aufruf der Funktion strategy.entry() mit einem beliebigen Bedingungsoperator einschränken. Auf diese Weise wird die Funktion zur Eingabe einer Position nicht bei jedem Balken aufgerufen (und verursacht keine zusätzliche Neuberechnung der Parameter, einschließlich der qty Wert) und das Skript wird erfolgreich berechnet:

//@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) 

Zu Beginn des zweiten Balkens (bar_index = 1), geht die Strategie eine Short-Position ein. Doch durch einen Wachstum des AAPL Wertes, sinkt der Profit durch die offene Short-Position (der Wert des strategy.openprofit Variable) und bleibt Short, bis das gesamte Kapital der Strategie negativ wird  (strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit).

Die von der Strategie-Engine berechnete Anzahl der Kontrakte wird wie folgt berechnet qty = (order size * equity / 100) / close. Der Bereich, in dem das Strategiekapital in einen negative Werte umschlägt, kann wie folgt dargestellt werden:

//@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)

Der Screenshot zeigt das Label im Bereich des negativen Eigenkapitals, wo die resultierende Anzahl der Kontrakte - 2 ist. Die Anzahl der Kontrakte im grünen Bereich ist >= 0:

Wenn bei der Berechnung einer Strategie, strategy.entry() bei einem Balken mit negativem Eigenkapital aufgerufen wird (und bei dem die Anzahl der Kontrakte negativ ist), bricht die Berechnung der Strategie mit einem Fehler ab.

Wie kann ich das beheben?

In der Regel tritt dieser Fehler bei einer korrekt implementierten Strategie nicht auf. Um Fehler zu vermeiden, sollte die Strategie Bedingungen für das Betreten und Verlassen einer Position, Stops und Margin verwenden.

Wenn ein Fehler auftritt, sind die richtigen Methoden zur Fehlersuche in der Strategie:

1. Einsatz von Margin Leverage (Margin für Long/Short-Positionen im Eigenschaften der Strategie oder margin_long und margin_short Parameter in der strategy() Funktion). Falls angegeben, wird ein Teil einer Position automatisch aufgelöst, wenn die Strategie nicht genug Eigenkapital hat, um sie zu halten. Mehr über diese Funktion erfahren Sie im Artikel in unserem Benutzer Handbuch oder in einem Blog Beitrag.

//@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. Überprüfung des Aktienwerts, um festzustellen, ob er über Null liegt, bevor er aufgerufen wird strategy.entry() oder strategy.order() Funktionen oder zusätzliche Neufestlegung der Anzahl der Einstiegsverträge.

//@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. Die Verwendung von Variablen der strategy.risk Kategorie für Risiko Management. Mehr darüber erfahren Sie in unserem Benutzer Handbuch.