ฉันเห็นข้อผิดพลาด 'ไม่สามารถสร้างออร์เดอร์ที่มีปริมาณติดลบ' ได้

ข้อผิดพลาดนี้จะปรากฏขึ้นหากส่วนของกลยุทธ์กลายเป็นค่าลบ และจำนวนสัญญาทั้งหมดที่คำนวณสำหรับฟังก์ชัน Strategy.entry() หรือ Strategy.order() เป็นค่าจำนวนเต็มลบ (qty <0) สามารถหลีกเลี่ยงได้โดยการปรับการตั้งค่ากลยุทธ์จากเมนูคุณสมบัติหรือโดยการเปลี่ยนตรรกะของกลยุทธ์โดยตรง

ที่มาของข้อผิดพลาด

มาดูสคริปต์ที่คำนวณปริมาณการสั่งซื้อเป็นเปอร์เซ็นต์ของทุน ไม่ว่าจะผ่านการตั้งค่าขนาดคำสั่งซื้อในการตั้งค่ากลยุทธ์ หรือผ่านค่าคงที่ Strategy_percent_of_equity ในแหล่งที่มาไพน์ของกลยุทธ์ ในแต่ละแถบ ฟังก์ชัน Strategy.entry() จะถูกเรียกเพื่อเข้าสู่ตำแหน่ง:

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

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

เมื่อเพิ่มสคริปต์ลงในชาร์ต NASDAQ:AAPL สำหรับไทม์เฟรม 1D สคริปต์จะขัดข้องโดยมีข้อผิดพลาดรันไทม์:

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

เพื่อให้เข้าใจสาเหตุของข้อผิดพลาดนี้ คุณควรพล็อตทุนโดยใช้ตัวแปร Strategy.equity และเพิ่มข้อจำกัดในการเรียกฟังก์ชัน Strategy.equity() โดยใช้ตัวดำเนินการเงื่อนไขใดๆ ด้วยวิธีนี้ ฟังก์ชันสำหรับการเข้าสู่ตำแหน่งจะไม่ถูกเรียกใช้ในแต่ละแถบ (และจะไม่ทำให้เกิดการคำนวณพารามิเตอร์ใหม่เพิ่มเติม รวมถึงค่าจำนวน) และสคริปต์จะคำนวณได้สำเร็จ:

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

เมื่อเปิดบาร์ที่สอง (bar_index = 1) กลยุทธ์จะเข้าสู่โพสิชั่นขาย (short) แต่ด้วยการเติบโตของมูลค่า AAPL กำไร (มูลค่าของตัวแปร Strategy.openprofit) จากโพสิชั่นขาย (Short) ที่เปิดอยู่ Short ดิ่งลง และในที่สุดเงินทุนของกลยุทธ์ (strategy.equity = strategy.initial_capital + Strategy.netprofit + Strategy.openprofit) กลายเป็นลบ

จำนวนสัญญาที่คำนวณโดยกลไกจัดการกลยุทธ์คำนวณเป็น qty = (ขนาดคำสั่ง * ส่วนของผู้ถือหุ้น / 100) / ปิด พื้นที่ที่เงินทุนกลยุทธ์เปลี่ยนเป็นค่าลบสามารถแสดงได้ดังนี้:

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

ภาพหน้าจอแสดงฉลากที่อยู่บนส่วนทุนติดลบ ซึ่งจำนวนสัญญาที่ได้คือ - 2 จำนวนสัญญาในส่วนสีเขียวคือ >= 0:

หากเมื่อคำนวณกลยุทธ์ Strategy.entry() ถูกเรียกบนแถบที่มีอิควิตี้ติดลบ (และจำนวนสัญญาเป็นลบ) การคำนวณกลยุทธ์จะหยุดลงโดยมีข้อผิดพลาด

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?

ตามกฎแล้ว ข้อผิดพลาดนี้ไม่ปรากฏในกลยุทธ์ที่นำไปใช้อย่างถูกต้อง เพื่อหลีกเลี่ยงข้อผิดพลาด กลยุทธ์ควรใช้เงื่อนไขสำหรับการเข้าและออกจากตำแหน่ง การหยุด และระยะขอบ

หากเกิดข้อผิดพลาด วิธีการที่ถูกต้องสำหรับการดีบักกลยุทธ์คือ:

1. การใช้มาร์จิ้นเลเวอเรจ (มาร์จิ้นสำหรับตำแหน่งยาว/สั้นในคุณสมบัติของกลยุทธ์หรือพารามิเตอร์ margin_long และ margin_short ในฟังก์ชัน strategy()) หากระบุไว้ ส่วนหนึ่งของโพซิชั่นจะถูกชำระบัญชีโดยอัตโนมัติหากกลยุทธ์มีอิควิตี้ไม่เพียงพอที่จะรักษาไว้ คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชันนี้ได้ในบทความในคู่มือผู้ใช้ของเราหรือในบล็อกโพสต์

//@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() หรือ Strategy.order() หรือกำหนดจำนวนสัญญาการเข้าใหม่เพิ่มเติม

//@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. การใช้ตัวแปรของหมวด Strategy.risk สำหรับการบริหารความเสี่ยง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ได้ในคู่มือผู้ใช้ของเรา