Saya mendapatkan error 'Tidak dapat membuat order dengan kuantitas negatif'
Error ini muncul saat strategi menghitung ukuran entri sebagai persentase dari ekuitasnya. Jika ekuitas turun di bawah 0, maka ukuran posisi juga akan menjadi negatif, yang tidak mungkin dan mengakibatkan error runtime.
Cara terbaik untuk memperbaiki masalah ini adalah mengkonversi strategi ke Pine Script v6. Di Pine v6, strategi secara default memberlakukan batasan pada ukuran posisi. Jika ekuitas strategi mulai turun terlalu banyak, posisi yang ada akan dilikuidasi secara paksa dengan margin call, dan jika dana habis sepenuhnya, strategi tidak akan mencoba membuat order baru dengan kuantitas negatif, sehingga terhindar dari error ini.
Jika anda ingin mempelajari lebih lanjut tentang sumber error ini dan cara menghindarinya di versi Pine sebelumnya, lihat teks di bawah ini.
Jika ekuitas strategi menjadi negatif dan jumlah total kontrak yang dihitung untuk fungsi strategy.entry() atau strategy.order() adalah negatif. Hal ini dapat dihindari dengan mengubah pengaturan strategi dari menu Properties atau dengan mengubah logika strategi secara langsung.
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:
//@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 di atas zero sebelum memanggil fungsi strategy.entry() atau strategy.order() atau sebagai tambahan untuk mendefinisikan ulang jumlah kontrak entri.//@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