'Negatif miktarlı emir oluşturulamıyor' hatasını görüyorum

Bu hata, strateji özsermayesi negatif hale gelirse ve strategy.entry() ve strategy.order() işlevleri için hesaplanan toplam sözleşme sayısı negatif bir tamsayı değeri (miktar<0)ise görünür. Özellikler menüsünden strateji ayarlarını değiştirerek veya stratejinin mantığını doğrudan değiştirerek önlenebilir.

Hatanın kaynağı

Emir miktarının özkaynak yüzdesi olarak hesaplandığı komut dosyasına, strateji ayarlarındaki Emir Boyutu ayarı aracılığıyla veya stratejinin Pine kaynağındaki strategy_percent_of_equity sabiti aracılığıyla bir göz atalım. Her çubukta, strategy.entry() işlevi konumu girmek için çağrılır:

//@version=5 strategy("negative_qty", default_qty_type = strategy.percent_of_equity) 
strategy.entry("Short", strategy.short) plot(strategy.equity)

Komut dosyasını 1D zaman dilimi için nasdaq:AAPL grafiğine eklerken, komut dosyası bir çalışma zamanı hatasıyla çöküyor:

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

Bu hatanın nedenini anlamak için, strategy.equity değişkenini kullanarak sermayeyi çizmeli ve herhangi bir koşul işlecini kullanarak strategy.entry() işlevine çağrıya bir kısıtlama eklemelisiniz. Bu şekilde, bir pozisyon girme işlevi her çubukta çağrılmaz (ve miktar değeri de dahil olmak üzere parametrelerin ek yeniden hesaplanmasına neden olmaz) ve komut dosyası başarıyla hesaplanır:

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

İkinci çubuğun açılışında (bar_index = 1), strateji kısa bir konuma girer. Ancak AAPL değerinin büyümesiyle, açık kısa konumdan elde edilen kar (strategy.openprofit değişkeninin değeri) Kısa düşer ve sonunda stratejinin sermayesi (strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit) negatif hale gelir.

Strateji motoru tarafından hesaplanan sözleşme sayısı miktar = (emir boyutu * özkaynak / 100) / kapanış olarak hesaplanır. Strateji sermayesinin negatif değerlere dönüştüğü alan şu şekilde görüntülenebilir:

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

Ekran görüntüsü, negatif özkaynak bölümünde bulunan etiketi gösterir, burada ortaya çıkan sözleşme sayısı - 2'dir. Yeşil bölümdeki sözleşme sayısı >= 0'dır:

Bir strateji hesaplanırken, strategy.entry() negatif özkaynak içeren (ve sözleşme sayısının negatif olduğu) bir çubukta çağrılırsa, stratejinin hesaplanması bir hatayla durur.

Bunu nasıl düzeltebilirim?

Kural olarak, bu hata doğru uygulanmış bir stratejide görünmez. Hataları önlemek için strateji, bir pozisyona, duraklara ve kenar boşluğuna girme ve çıkma koşullarını kullanmalıdır.

Bir hata oluşursa, stratejide hata ayıklamak için doğru yöntemler şunlardır:

1. Kenar boşluğu kaldıraç kullanma (Stratejinin Özelliklerinde Uzun/Kısa pozisyonlar için Marj veya strateji() işlevinde margin_long ve parametreleri margin_short). Belirtilirse, stratejinin onu korumak için yeterli özsermayesi yoksa, pozisyonun bir kısmı otomatik olarak tasfiye edilir. Bu işlevsellik hakkında daha fazla bilgi edinmek için Kullanım Kılavuzumuzdaki makalede veya bir blog gönderisinde bulabilirsiniz.

//@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() veya strategy.order() işlevlerini aramadan veya giriş sözleşmelerinin sayısını yeniden tanımlamadan önce özkaynak değerinin sıfırın üzerinde olup olmadığını kontrol etmek.

//@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. Risk yönetimi için strategy.risk kategorisi değişkenlerini kullanmak. Bunlar hakkında daha fazla bilgiyi Kullanım Kılavuzumuzda bulabilirsiniz.