Saya mendapatkan error 'Tidak dapat membuat order dengan kuantitas negatif'

Error ini muncul jika ekuiti strategi menjadi negatif dan jumlah total dari kontrak dihitung untuk fungsi strategy.entry() atau strategy.order() adalah niilai bilangan bulat negatif (kuantitas <0). Ini bisa dihindari dengan cara mengubah pengaturan strategi dari menu Properti atau dengan mengubah secara langsung logic dari strategi.

Sumber error

Silakan lihat ke script dimana jumlah order dihitung sebagai persentase dari ekuiti, baik melalui pengaturan Ukuran Order di dalam pengaturan strategi, maupun melalui konstanta strategy_percent_of_equity pada sumber pine dari strategi. pada tiap bar, fungsi strategy.entry() dipanggil untuk masuk ke posisi:
//@version=5 strategy("negative_qty", default_qty_type = strategy.percent_of_equity) 
strategy.entry("Short", strategy.short) plot(strategy.equity)
Saat menambahkan script ke chart NASDAQ:AAPL pada kerangka waktu 1D, script crashes dengan sebuah runtime error: 
Cannot create an order with negative quantity. Current qty_type is percent_of_equity and equity is less than 0
Untuk memahami alasan error ini, anda perlu menempatkan modal dengan menggunakan variabel strategy.equity dan menambahkan constraint pada panggilan ke fungsi  strategy.entry() dengan menggunakan operator kondisi tertentu. Dengan cara itu, maka fungsi dalam memasuki posisi tidak akan dipanggil pada tiap bar (dan tidak akan menyebabkan penghitungan ulang tambahan dari setiap parameter, termasuk nilai qty) dan script akan berhasil dihitung:
//@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) 
Pada pembukaan bar kedua (bar_index = 1), strategi memasuki posisi short. Namun dengan pertumbuhan nilai AAPL, keuntungan (nilai dari variabel strategy.openprofit) dari posisi short yang terbuka Short anjlok, dan pada akhirnya modal dari strategi (strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit) menjadi negatif.Jumlah kontrak dihitung oleh mesin strategi yang dihitung sebagai qty = (order size * equity / 100) / close. Area dimana modal strategi berubah menjadi nilai negatif dapat ditunjukkan sebagai berikut:
//@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)
Pada cuplikan gambar tampak label berada pada bagian ekuiti negatif, dimana angka yang dihasilkan dari kontrak adalah -2. Angka kontrak pada bagian hijau adalah >= 0:
Jika, saat menghitung sebuah strategi, strategy.entry() dipanggil pada bar dengan ekuiti negatif (dan pada angka dimana kontrak adalah negatif), perhitungan dari strategi akan berhenti dengan sebuah error.Bagaimana cara menyelesaikan ini ?Dalam aturannya, error ini tidak muncul pada strategi yang dilaksanakan dengan benar. Untuk menghindari kesalahan, strategi seharusnya menggunakan kondisi untuk masuk dan keluar posisi, stop loss, dan margin.Jika sebuah error terjadi, metode yang benar untuk melakukan debugging strategi adalah:1. Gunakan margin leverage (Margin Untuk Long/Short posisi pada  Properties dari strategi atau parameter margin_long dan margin_short pada fungsi strategy()). Jika dirincikan, sebuah bagian dari posisi akan secara otomatis dilikuidasi jika strategi tidak lagi memliki ekuiti yang cukup untuk menahannya. Anda bisa mencari tahu lebih lanjut tentang fungsi ini pada pada User Manual kami atau pada blog post.
//@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.Pemeriksaan nilai ekuiti untuk melihat apakah berada diatas zero sebelum memanggil fungsi strategy.entry() atau strategy.order() atau sebagai tambahan untuk mendefinisikan ulang jumlah kontrak entry.
//@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. Menggunakan variabel dari kategori strategy.risk untuk pengelolaan resiko. Anda bisa membaca lebih lanjut mengenai ini pada User Manual.