24 בספטמבר 2026 · מחקר

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

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

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

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

09:10 — בחרנו פוזיציה שגרתית

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

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

09:25 — הופיעה הפקודה הכפולה הראשונה

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

בהתחלה האשמנו את לולאת האותות. הבעיה לא הייתה בלולאה, אלא בתמונת מצב חלקית. האסטרטגיה שאלה: „איזו פוזיציה יש לי?”, אבל לא שאלה: „אילו פקודות עדיין פעילות?”

המצב אחרי ההפעלה מחדשמה שהתהליך חשבמה שהחשבון החזיק
פוזיציהלונג 0.04לונג 0.04
פקודות צמצום פתוחותאיןשתיים, 0.01 כל אחת
החשיפה המתוכננת אחרי ביצוע פקודה אחתלונג 0.03עלולה להפוך ללונג 0.02

10:00 — תיקנו את ההתאוששות, ואז גילינו בעיית תזמון

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

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

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

13:40 — ההרצה החוזרת חשפה אי התאמה חמקמקה

הרצנו מחדש את אותו מסלול מחירים בהרצה המקורית ובהרצה שלאחר ההפעלה מחדש. השוואת ה-P&L הסופי הייתה מחמיצה את הבעיה: שתי הגרסאות סיימו עם אותה פוזיציה אחרי שהשוק שינה כיוון. השוואת אירועי הפקודות חשפה אותה.

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

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

16:20 — מה נעשה אחרת בפעם הבאה

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

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

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

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