אני רואה את השגיאה 'לא ניתן ליצור פקודה עם כמות שלילית'

שגיאה זו מופיעה אם ההון העצמי של האסטרטגיה הופך לשלילי והמספר הכולל של החוזים המחושב עבור הפונקציות strategy.entry() או strategy.order() הוא ערך שלם שלילי (qty <0). ניתן להימנע מכך על ידי שינוי הגדרות האסטרטגיה מתפריט המאפיינים או על ידי שינוי ישיר של ההיגיון של האסטרטגיה.

מקור השגיאה

בואו נסתכל על הסקריפט שבו כמות ההוראה מחושבת כאחוז מההון העצמי, או דרך הגדרת גודל ההוראה בהגדרות האסטרטגיה, או דרך קבועה strategy_percent_of_equity במקור Pine של האסטרטגיה. בכל בר, הפונקציה 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.entry() באמצעות כל אופרטור תנאי. כך, הפונקציה להזנת פוזיציה לא תיקרא בכל בר (ולא תגרום לחישוב 

מחדש נוסף של פרמטרים, כולל ערך qty) והסקריפט יחושב בהצלחה:

//@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), האסטרטגיה נכנסת לפוזיציה שורט. אבל עם הצמיחה של ערך ה-AAPL, הרווח (ערך המשתנה strategy.openprofit) מפוזיציית השורט הפתוחה שורט צונח, ובסופו של דבר ההון של האסטרטגיה (strategy.equity = {dot}initial_capital + strategy.netprofit + strategy.openprofit) הופך לשלילי.

מספר החוזים המחושב על ידי מנוע האסטרטגיה מחושב כqty = (order size * equity / 100) / close. ניתן להציג את האזור שבו ההון האסטרטגי הופך לערכים שליליים:

//@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 For Positions Long/Short במאפיינים של האסטרטגיה או פרמטרים 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  אתה יכול לקרוא עוד על אלה במדריך למשתמש שלנו.