Saya lihat ralat 'Tidak boleh mencipta satu pesanan dengan bilangan negatif'

Ralat ini muncul jika ekuiti strategi menjadi negatif dan jumlah nombor kontrak yang dikira untuk fungsi strategy.entry() or strategy.order() adalah satu nilai integer negatif (qty <0). Ia boleh dielakkan dengan mengubah penetapan strategi dari menu Sifat atau dengan menukar secara terus logik untuk strategi.

Sumber ralat

Mari kita lihat pada skrip di mana kuantiti pesanan dikira sebagai peratusan ekuiti, samada melalui penetapan Saiz Pesanan di dalam penetapan strategi atau melalui pemalar strategy_percent_of_equity di dalam sumber strategi Pine. Pada setiap bar, fungsi strategy.entry() dipanggil untuk memasuki posisi:
//@version=5 strategy("negative_qty", default_qty_type = strategy.percent_of_equity) 
strategy.entry("Short", strategy.short) plot(strategy.equity)
Apabila menambahkan skrip kepada carta NASDAQ:AAPL untuk rangka masa 1D, skrip akan ranap dengan ralat masa jalan:
Cannot create an order with negative quantity. Current qty_type is percent_of_equity and equity is less than 0
Untuk memahami sebab untuk ralat ini, anda hendaklah memplot modal menggunakan pembolehubah strategy.equity dan menambah satu kekangan kepada panggilan kepada fungsi strategy.entry()menggunakan mana-mana operator keadaan. Dengan cara ini, fungsi untuk memasuki posisi tidak akan dipanggil pada setiap bar (and ia tidak akan menyebabkan pertambahan pengiraan semula untuk parameter, termasuk nilai qty dan skrip akan dikira dengan jayanya:
//@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 pada bar kedua (bar_index = 1), strategi akan memasuki satu posisi singkat. Tetapi dengan pertumbuhan nilai AAPL , keuntungan (nilai pembolehubah the strategy.openprofit ) dari posisi singkat Short  yang dibuka merudum dan pada akhirnya modal untuk strategi (strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit) akan menjadi negatif.Nombor kontrak dikira dengan enjin strategi adalah dikira sebagai qty = (order size * equity / 100) / close. Kawasan di mana modal strategi bertukar menjadi nilai negative boleh dipaparkan seperti 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)
Tangkap layar menunjukkan label diletakkan pada bahagian ekuiti negatif, di mana bilangan nombor kontrak adalah -2. Bilangan nombor kontrak pada bahagian hijau ialah >=0:
Jika, apabila mengira satu strategi, strategy.entry() dipanggil pada satu bar dengan ekuiti negatif (dan pada mana bilangan kontrak adalah negatif), pengiraan strategi berhenti dengan satu ralat.

Bagaimanakah saya hendak membetulkan perkara ini?

Sebagai satu peraturan, ralat ini tidak muncul dalam strategi yang dilaksanakan dengan betul. Untuk mengelakkan kesilapan, strategi hendaklah menggunakan keadaan-keadaan untuk memasuki dan keluar dari satu posisi, hentian dan margin.Jika satu ralat terjadi, kaedah yang betul untuk membaiki strategi adalah:1. Menggunakan keumpilan margin (posisi Margin Untuk Panjang/Singkat di dalam Sifat untuk strategi atau parameter margin_long dan margin_short di dalam fungsi strategy() . Jika dikhususkan, satu bahagian daripada satu posisi akan dicairkan secara automatic jika strategi itu tidak mempunyai ekuiti yang cukup untuk mengekalkannya. Anda boleh mendapat lebih informasi mengenai kegunaan ini di dalam artikel di Manual Pengguna kami atau di rencana 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. Memeriksa nilai ekuiti untuk mengetahui samada ia lebih daripada kosong sebelum memanggil fungsi strategy.entry() or strategy.order() atau penambahan kepada mendefinasikan lagi nombor kontrak masuk.
//@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 pemboleh ubah kategori strategy.risk untuk pengurusan risiko. Anda boleh membaca lebih mengenai ini di Manual Pengguna kami.