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

Bu hata, strateji girişinin boyutunu öz sermayesinin yüzdesi olarak hesapladığında ortaya çıkar. Öz sermaye 0'ın altına düşerse, pozisyonun boyutu da negatif olur, bu mümkün değildir ve bir çalışma zamanı hatasına neden olur.

Bu sorunu çözmenin en iyi yolu, stratejiyi Pine Script v6'ya dönüştürmektir. Pine v6'da strateji varsayılan olarak pozisyon boyutu sınırlarını zorlar. Stratejinin öz sermayesi çok fazla düşmeye başlarsa, mevcut pozisyonlar marj çağrıları ile zorla likide edilecek ve fonlar tamamen tükenirse, strateji negatif miktarla yeni emirler oluşturmaya çalışmayacak ve bu hatayı önleyecektir.

Bu hatanın kaynağı ve önceki Pine sürümlerinde bundan nasıl kaçınılacağı hakkında daha fazla bilgi edinmek istiyorsanız, aşağıdaki metne bakın.

Strateji öz kaynağı negatif hale gelirse ve strategy.entry()veya strategy.order() işlevleri için hesaplanan toplam sözleşme sayısı negatifse, özellikler menüsünden strateji ayarlarını değiştirerek veya doğrudan stratejinin mantığını değiştirerek önlenebilir.

Hatanın kaynağı

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

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

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

 Komutdosyasını 1D (1G) zaman dilimi için bir 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 operatörü kullanarak strategy.equity() işlevine yapılan çağrıya bir kısıtlama eklemelisiniz. Bu şekilde, bir pozisyon girme işlevi her çubukta çağrılmayacak (ve  qty değeri dahil olmak üzere parametrelerin ek olarak yeniden hesaplanmasına neden olmayacaktır ) ve komut dosyası başarıyla hesaplanacaktı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 pozisyona girer. Ancak  AAPL değerinin büyümesiyle, açık kısa pozisyondan elde edilen kar ( strategy.openprofit değişkeninin değeri) açık kısa pozisyondan Short düşer ve sonunda stratejinin sermayesi (strategy.öz sermaye = strategy.initial_capital + strategy.netprofit + strategy.openprofit) negatif olur.

Strateji motoru tarafından hesaplanan sözleşme sayısı qty = (emir büyüklüğü * öz sermaye / 100) / closeşeklinde hesaplanır . Strateji sermayesinin negatif değerlere dönüştüğü alan aşağıdaki gibi 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ü, ortaya çıkan sözleşme sayısının - 2 olduğu negatif öz sermaye bölümünde yer alan etiketi göstermektedir. Yeşil bölümdeki sözleşme sayısı >= 0'dır:

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

Bunu nasıl düzeltebilirim? Kural olarak, bu hata doğru uygulanan bir stratejide görünmez. Hatalardan kaçınmak için, strateji bir pozisyona girme ve çıkma koşullarını, stopları ve marjı kullanmalıdır. 

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

1. Teminat kaldıracının kullanılması (stratejinin Özelliklerindeki Uzun/Kısa pozisyonlar için Teminat veya strategy() fonksiyonundaki margin_long ve margin_short parametreleri). Belirtilirse, stratejinin bunu sürdürmek için yeterli öz sermayesi yoksa, bir pozisyonun bir kısmı otomatik olarak likide edilecektir. Bu işlevsellik hakkında daha fazla bilgiyi Kullanıcı Kılavuzumuzdaki makalede veya bu 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 çağırmadan önce öz sermaye değerinin sıfırın üzerinde olup olmadığını kontrol etmek veya ek olarak giriş sözleşmelerinin sayısını yeniden tanımlamak.

//@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 kategorisinin değişkenlerini kullanma. Bunlar hakkında daha fazla bilgiyi Kullanıcı Kılavuzumuzda bulabilirsiniz.