Je vois l'erreur "Impossible de créer un ordre avec une quantité négative".
Cette erreur apparaît si le solde de la stratégie devient négatif et que le nombre total de contrats calculé pour les fonctions strategy.entry() ou strategy.order() est une valeur entière négative (qty <0). On peut l'éviter en modifiant les paramètres de la stratégie dans le menu Propriétés ou en changeant directement la logique de la stratégie.
Source de l'erreur
Examinons le script dans lequel la quantité de l'ordre est calculée en tant que pourcentage des fonds, soit par le biais du paramètre Taille de l'ordre dans les paramètres de la stratégie, soit par l'intermédiaire de la constante strategy_percent_of_equity dans la source Pine de la stratégie. Sur chaque barre, la fonction strategy.entry() est appelée pour entrer la position :
//@version=5
strategy("negative_qty", default_qty_type = strategy.percent_of_equity)
strategy.entry("Short", strategy.short)
plot(strategy.equity)
Lorsque l'on ajoute le script à un graphique NASDAQ:AAPL pour la période 1D, le script se bloque avec une erreur d'exécution :
Cannot create an order with negative quantity.
Current qty_type is percent_of_equity and equity is less than 0
Pour comprendre la raison de cette erreur, vous devez tracer le capital à l'aide de la variable strategy.equity et ajoutez une contrainte sur l'appel à la fonction strategy.entry() en utilisant un opérateur de condition quelconque. De cette façon, la fonction d'entrée d'une position ne sera pas appelée sur chaque barre (et ne provoquera pas de recalcul supplémentaire des paramètres, y compris la valeur de la qté) et le script sera calculé avec succès :
//@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)
À l'ouverture de la deuxième barre (bar_index = 1), la stratégie entre dans une position courte. Mais avec la croissance de la valeur AAPL, le bénéfice (la valeur de la variable strategy.openprofit) de la position courte ouverte s'effondre, et au final le capital de la stratégie (strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit) devient négatif.
Le nombre de contrats calculé par le moteur de stratégie est calculé comme suit : qty = (taille de l'ordre * equity / 100) / close. La zone où le capital de la stratégie devient négatif peut être affichée comme suit :
//@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)
La capture d'écran montre l'étiquette située sur la section des fonds négatifs, où le nombre de contrats résultant est de - 2. Le nombre de contrats sur la section verte est >= 0 :
Si, lors du calcul d'une stratégie, strategy.entry() est appelé sur une barre avec une équité négative (et sur laquelle le nombre de contrats est négatif), le calcul de la stratégie s'arrête avec une erreur.
Comment puis-je corriger cette erreur ?
En règle générale, cette erreur n'apparaît pas dans une stratégie correctement implémentée. Pour éviter les erreurs, la stratégie doit utiliser des conditions d'entrée et de sortie de position, des stops et des marges.
Si une erreur se produit, les méthodes correctes pour déboguer la stratégie sont les suivantes :
1. Utiliser l'effet de levier de la marge (Marge pour les positions Long/Short dans les Propriétés de la stratégie ou les paramètres margin_long et margin_short dans la fonction strategy()). Si cela est spécifié, une partie d'une position sera automatiquement liquidée si la stratégie ne dispose pas de suffisamment de fonds propres pour la maintenir. Vous pouvez en savoir plus sur cette fonctionnalité dans l'article de notre Manuel de l'utilisateur ou sur notre blog.
//@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. Vérification de la valeur des capitaux pour voir si elle est supérieure à zéro avant d'appeler les fonctions strategy.entry() ou strategy.order() ou de redéfinir additionnellement le nombre de contrats d'entrée.
//@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. Utilisation des variables de la catégorie strategy.risk pour la gestion des risques. Vous pouvez en savoir plus à ce sujet dans notre Manuel de l'utilisateur.