הוספתי בהצלחה אסטרטגיה לגרף שלי, אבל היא לא מייצרת פקודות

אם הכרטיסיות "רשימת עסקאות" ו"סקירה כללית" של בוחן האסטרטגיה מציגות את "ללא נתונים" לאחר שהוספת אסטרטגיה לגרף, סביר להניח שהיא לא מדמה פקודות כלשהן, מה שמוביל ללא נתונים לאכלס הכרטיסיות. אם הסקריפט שלך לא מייצר פקודות, ייתכן שזה נובע מכל אחת מהסיבות הבאות:

 

הסקריפט אינו מסווג כאסטרטגיה או אינו משתמש בפקודות היוצרות פקודות 

בקטסטינג עם בודק האסטרטגיה פועל רק עם אסטרטגיות Pine Script™, המשתמשות בפונקציה `strategy()` להצהרת ההצהרה שלהן. סקריפטים המוצהרים באמצעות `indicator()` או `library()` אינם יכולים לקיים אינטראקציה עם מודול בוחן האסטרטגיה.

סקריפטים שהוכרזו כאסטרטגיות חייבים להשתמש בפקודות 'אסטרטגיה*' למיקום פקודות (למשל, 'strategy.order()' או 'strategy.entry()') כדי לדמות פקודות ולהציג נתונים ב-Strategy Tester, ללא קשר לכל קנייה/ מכירת אותות שייתכן שמחבר הסקריפט כלל בקוד.

לאסטרטגיה אין מספיק הון כדי לפתוח פוזיציה 

כדי שאסטרטגיה תיכנס לפוזיציה, חייבת להיות לה מספיק כסף כדי לרכוש את המספר שצוין של חוזים/מגרשים/מניות/יחידות. היא לא תיכנס למסחר אם אין לה מספיק הון כדי לכסות את העלות. לדוגמה, אם ההון הראשוני של אסטרטגיה הוא 1000 דולר וגודל הפקודה הוא חוזה אחד, היא לא יכולה להיכנס לפוזיציה אלא אם מחיר הנכס יורד מתחת ל-1000 דולר מכיוון שהוא לא יכול להרשות לעצמו את עלות כל העסקה. אסטרטגיות תמיד ינסו לרכוש את המספר הנקוב של חוזים/מניות/מגרשים/יחידות ולא פחות.

 

הערה חשובה על בדיקת חוזים עתידיים: 

לסימולים על חוזים עתידיים יש בדרך כלל מה שמכונה יחידת חוזה (מיוצג כ-Point Value ב-TradingView ונגיש ב-Pine באמצעות המשתנה `syminfo.pointvalue`). כמו סימולים אחרים, המחיר הגולמי בגרף מייצג את המחיר של יחידה אחת של הסחורה הנסחרת. יחד עם זאת, לחוזים עתידיים יש כמות מוגדרת שכל אחד מהם מייצג, כך שבדר"כ רכישה של יחידה בודדת לא אפשרית. כדי לחשב את ההון הנדרש לחוזה, צריך להכפיל את מחיר הגרף בערך הנקודה.

 

 כדי להדגים את ההשפעות של Point Value על אסטרטגיות הפועלות על סמלים עתידיים, בואו נסתכל על הסימול CME_MINI:ES1!, המייצג את החוזה העתידי של ES עם הנזילות הטובה ביותר ויש לו ערך נקודתי של 50:

 

 

בדוגמה למטה, האסטרטגיה שהוספנו לגרף נכנסה לפוזיציה של 4000 דולר בדיוק ויצאה ב-4500 דולר. סכום הכסף שהוצא בפועל על החוזה במחיר הכניסה היה 4000 דולר כפול מערך הנקודה של 50, שהם 200,000 דולר. כשאסטרטגיה סגרה את הפוזיציה שלה במחיר היציאה, הסכום שהתקבל היה 4500 USD * 50 = 225,000 USD, וכתוצאה מכך רווח של 25,000 USD, אותו נוכל לאשר על ידי צפייה בעמודה "רווח" בלשונית "רשימת עסקאות" בבוחן האסטרטגיה:

אם לאסטרטגיה היה ערך הון ראשוני מתחת ל-200,000 דולר במקרה זה, היא לא הייתה יכולה לבצע את הפקודה כי היא לא יכלה להרשות לעצמה את מחיר הכניסה, שהיה פי 50 מהמחיר המוצג בגרף. כדי לדמות את הפוזיציה, אנו צריכים להגדיל את ערכי ההון ההתחלתי או ה- מרג'ין לונג/שורט כדי לאפשר לאסטרטגיה להרשות זאת יש להוריד את ערכי המרג'ין, ולא להגדיל, כדי לתקן את הבעיה.

 

האסטרטגיה מחזירה שגיאת זמן ריצה

 

 

 אם אסטרטגיה נתקלת בבעיה במהלך החישובים שלה, היא תעלה שגיאת זמן ריצה ותציג סימן קריאה אדום בפינה השמאלית העליונה של חלון הגרף המכיל את האסטרטגיה. שגיאות זמן ריצה עוצרות את הסקריפט מלהמשיך בחישובים, כך שהוא לא יכול לדמות פקודות

לשגיאות זמן הריצה השונות ב-Pine ישנן סיבות ותיקונים פוטנציאליים שונים. לחיצה על סימן הקריאה תציג את הודעת השגיאה של הסקריפט.

 

התנאים הנדרשים לביצוע פקודות האסטרטגיה לא התקיימו

סיבה אפשרית אחת לאסטרטגיה שאינה מציגה נתונים היא שאף מצב לא הפעיל פקודה לאורך טווח הבדיקה. במקרה זה, לא יהיו ערכים בגרף כי לא היו פקודות למילוי. משתמשים יכולים לתקן זאת על ידי שינוי התנאים בקוד המקור של האסטרטגיה. לעתים יכול להיות מועיל לבחון חזותית את ההיסטוריה של תנאי הסדר של אסטרטגיה על ידי שרטוטם בגרף.

הסקריפט למטה משתמש בפונקציית `plotshape()` של Pine כדי לשרטט צלבים כחולים ואדומים מעל ברים עם התרחשות התנאים ללונג ולשורט מה שמאפשר לנו לבדוק את ההיסטוריה שלהם בגרף:

//@version=5
strategy('My Strategy', overlay = true)
 longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))if longCondition    strategy.entry('Long', strategy.long)plotshape(longCondition, color=color.new(color.blue, 0))
 shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))if shortCondition    strategy.entry('Short', strategy.short)plotshape(shortCondition, color=color.new(color.red, 0))
Java

למידע נוסף בנושא זה, עיין בדף המדריך למשתמש בנושא טיפול בבאגים.

 

המאפיינים של האסטרטגיה אינם נכונים

 

לכל אסטרטגיה יש מספר פרמטרים השולטים על הכללים שלה לפקודות פתיחה. מחברים יכולים להגדיר פרמטרים אלה מקוד המקור של האסטרטגיה, ומשתמשים יכולים לעקוף אותם דרך כרטיסיית "מאפיינים" של הגדרות האסטרטגיה. 

 

הערה: ישנם מספר מקומות בקוד המקור של האסטרטגיה שבהם משתמשים יכולים להגדיר את מספר החוזים/המניות/החלקות/יחידות עבור הפקודות שלה:

  • פרמטרים בפונקציה `strategy()` מאפשרים למשתמשים להגדיר את כמות וסוג המסחר המוגדרים כברירת מחדל, אשר מגדירים את ערכי ברירת המחדל בלשונית "מאפיינים". משתמשים יכולים לעקוף ערכים אלה על ידי התאמת "גודל פקודה".
  • מיקום פקודות להוראות המייצרות פקודות כניסה, כגון `strategy.entry()`, יכולות להגדיר את כמות הסחר על בסיס פקודה לפי פקודה. במקרה זה, שינויים בלשונית "מאפיינים" לא ישפיעו על גודל הפקודה של האסטרטגיה.

 

על המשתמשים לוודא שהם מציינים את הגדלים של פקודות האסטרטגיות שלהם בצורה נכונה. כדי להוסיף לסעיף "לאסטרטגיה אין מספיק הון כדי לפתוח פוזיציה" למעלה, עליך לשים לב כי:

  • אם "סוג פקודה" של אסטרטגיה מוגדר ל"חוזים" (שווה ערך ל-`strategy.fixed` בתור default_qty_type בקוד המקור), גודל הפקודה חייב להיות גדול מ-1 עבור רוב הסימולים. מטבעות קריפטוגרפיים מסוימים מאפשרים גדלים חלקיים. לדוגמה, גודל פקודה של 0.1 תקף עבור BTCUSD אך לא עבור AAPL או EURUSD.
  • גודל הפקודה חייב להיות חיובי; מספרים שליליים יגרמו לשגיאות זמן ריצה, ולערך של 0 לא תהיה השפעה.
  • גודל הפוזיציה הכולל (מספר החוזים) לא יכול לעלות על 1e12. אסטרטגיות לא ידמו פקודות חדשות אם גודל הפוזיציה עולה על מספר זה.