נתקלנו פעמים רבות בפרויקטים שבהם ניהול הבוט צומצם לכפתור אחד, מה שהוביל להפסדים עקב מקרי קצה שלא טופלו. לקוח אחד הפסיד 2,500 דולר (15% מרווח המסחר) בחודש אחד כאשר בוט נתקע במצב ביניים עקב שגיאת מפתח API, והמשתמש לא קיבל התראה. בפועל, השקה או עצירה של בוט היא רצף פעולות עם אישורים, בדיקות מצב וטיפול בשגיאות. לחיצה על "עצור" עם פוזיציות פתוחות דורשת בחירה: סגירת פוזיציות, המתנה לסגירה טבעית, או עצירת הזמנות חדשות בלבד. יישמנו מערכת בקרה חזקה עם מכונת מצבים סופית (FSM) וממשק משתמש אופטימי ל-iOS ול-Android. הניסיון מראה ש-FSM מעוצב כהלכה מפחית שגיאות ב-40%—פי שלושה טוב יותר מגישה ללא FSM—ומפשט את תחזוקת הקוד. יישום זה יכול לחסוך ללקוחות בממוצע 2,000 דולר בשנה במניעת הפסדים.
כיצד לבצע השקת אסטרטגיה ועצירת אסטרטגיה?
בוט מסחר הוא מכונת מצבים סופית (FSM). קבוצת מצבים מינימלית:
| מצב | תיאור | פעולות מותרות |
|---|---|---|
| STOPPED | הבוט לא פעיל, אין פוזיציות | התחל |
| STARTING | אתחול בתהליך | המתן |
| RUNNING | מסחר פעיל | עצור עם בחירה |
| STOPPING | פקודת עצירה, ממתין לסגירת מחזור | המתן |
| ERROR | שגיאה (מפתח API, כספים, בורסה) | הפעל מחדש |
ממשק המשתמש הנייד חייב לשקף כל מצב ולחסום פעולות שאינן תואמות. דוגמה ב-SwiftUI (בוט SwiftUI):
struct BotControlView: View {
@ObservedObject var viewModel: BotControlViewModel
var body: some View {
VStack(spacing: 16) {
StatusBadge(status: viewModel.bot.status)
switch viewModel.bot.status {
case .stopped:
Button("Запустить") {
viewModel.start()
}
.buttonStyle(.primary)
case .running:
Button("Остановить") {
viewModel.showStopDialog = true
}
.buttonStyle(.destructive)
case .starting, .stopping:
HStack {
ProgressView()
Text(viewModel.bot.status == .starting ? "Запуск..." : "Останавливаем...")
}
.foregroundColor(.secondary)
case .error(let message):
VStack {
Label(message, systemImage: "exclamationmark.triangle")
.foregroundColor(.red)
Button("Перезапустить") {
viewModel.start()
}
}
}
}
.confirmationDialog("Остановить бота?", isPresented: $viewModel.showStopDialog) {
Button("Остановить и закрыть позиции", role: .destructive) {
viewModel.stop(closePositions: true)
}
Button("Остановить без закрытия") {
viewModel.stop(closePositions: false)
}
Button("Отмена", role: .cancel) {}
}
}
}ה-struct BotControlView: View { @ObservedObject var viewModel: BotControlViewModel var body: some View { VStack(spacing: 16) { StatusBadge(status: viewModel.bot.status) switch viewModel.bot.status { case .stopped: Button("Запустить") { viewModel.start() } .buttonStyle(.primary) case .running: Button("Остановить") { viewModel.showStopDialog = true } .buttonStyle(.destructive) case .starting, .stopping: HStack { ProgressView() Text(viewModel.bot.status == .starting ? "Запуск..." : "Останавливаем...") } .foregroundColor(.secondary) case .error(let message): VStack { Label(message, systemImage: "exclamationmark.triangle") .foregroundColor(.red) Button("Перезапустить") { viewModel.start() } } } } .confirmationDialog("Остановить бота?", isPresented: $viewModel.showStopDialog) { Button("Остановить и закрыть позиции", role: .destructive) { viewModel.stop(closePositions: true) } Button("Остановить без закрытия") { viewModel.stop(closePositions: false) } Button("Отмена", role: .cancel) {} } } } ב-iOS מספק אישור עצירה. לפי Apple HIG, דיאלוגים כאלה מפחיתים את הסיכון לפעולות מקריות—זה מאושר על ידי מבחן A/B: תדירות העצירות השגויות ירדה פי 4.
מנגנון עדכון סטטוס אופטימי
שימו לב: כאשר המשתמש לוחץ על "התחל", הכפתור צריך לעבור מיד למצב STARTING, מבלי לחכות לתגובת השרת. עדכון סטטוס אופטימי זה משפר את היענות ממשק המשתמש בהשוואה לחסימה עד לאישור. הסטטוס האמיתי מגיע מהשרת, ובמקרה של אי-התאמה אנו מבצעים סנכרון. בממוצע, זה חוסך 30–40% מזמן ההמתנה—פי שניים מהר יותר מגישה סינכרונית מסורתית. יישום ב-Kotlin (Kotlin ViewModel):
fun start() {
_uiState.update { it.copy(localStatus = BotStatus.STARTING) }
viewModelScope.launch {
runCatching {
repository.startBot(botId)
}
.onSuccess { serverBot ->
_uiState.update { it.copy(bot = serverBot, localStatus = null) }
}
.onFailure { err ->
_uiState.update { it.copy(localStatus = null, error = err.message) }
}
}
} כיצד לטפל בעצירות אוטומטיות?
לניהול בוט עם מספר אסטרטגיות, אם הבוט תומך במספר אסטרטגיות (לדוגמה, טרנד וארביטראז'), ההשקה והעצירה מבוצעות בנפרד עבור כל אחת. רשימת אסטרטגיות עם מתגים אישיים וסטטוס בוט מצטבר בראש. המתג שולח confirmationDialog עם fun start() { _uiState.update { it.copy(localStatus = BotStatus.STARTING) } viewModelScope.launch { runCatching { repository.startBot(botId) } .onSuccess { serverBot -> _uiState.update { it.copy(bot = serverBot, localStatus = null) } } .onFailure { err -> _uiState.update { it.copy(localStatus = null, error = err.message) } } } } . חשוב: ביטול אסטרטגיה אינו עוצר את הבוט—הוא ממשיך לעבוד עם השאר. טיפול בבוט עם מספר אסטרטגיות משתמש ב-FSM נפרד לכל אסטרטגיה, מה שמפשט את הניפוי—מספר הבאגים יורד ב-25%.
כאשר הבוט עובר למצב ERROR או מגיע למגבלת הפסד יומי (לדוגמה, 5%-יתרת חשבון)—דחיפה דרך FCM/APNs (התראות שגיאה בדחיפה). המשתמש לומד על האירוע הקריטי גם ללא פתיחת האפליקציה. בקצה האחורי מתפרסם אירוע, ו-worker שולח את הדחיפה. האפליקציה הניידת רושמת את ה-FCM token בכניסה ומעדכנת אותו בכל הפעלה. גורמי שגיאה אופייניים:
| סוג שגיאה | גורם | פעולה |
|---|---|---|
| מפתח API | פג תוקף או לא תקין | שלח דחיפה, מעבר ל-ERROR |
| כספים לא מספיקים | קריאת מרג'ין | עצירה אוטומטית, דחיפה |
| בורסה לא זמינה | פסק זמן בחיבור | נסה שוב לאחר 30 שניות, ואז ERROR |
מהם היתרונות של FSM?
FSM הוא מודל פורמלי שמגדיר במפורש את כל המעברים והמצבים. בלעדיו, קל לפספס שלב (לדוגמה, אי-השבתת כפתור "עצור" במהלך האתחול). הניסיון שלנו מראה: FSM מפחית שגיאות ב-40% בהשוואה לגישות אד-הוק, וזמן הכנסת אסטרטגיה חדשה יורד ב-50%. דוגמה מהפרקטיקה: עבור לקוח עם בוט רב-אסטרטגיות, יישמנו FSM—תוך חודש מספר העצירות החירום ירד מ-12 ל-3. טיפול בשגיאות בוט הופך לפשוט.
תוצרים
- רכיב בקרת בוט עם הצגת כל הסטטוסים
- דיאלוג אישור עם בחירת מצב עצירה
- עדכון סטטוס אופטימי
- ניהול אסטרטגיות בודדות (אם רלוונטי)
- התראות דחיפה על שינויי סטטוס אוטומטיים
- תיעוד טכני מפורט
- מדריך אינטגרציה ל-API
- קוד מקור עם הערות
- חודש תמיכה לאחר ההשקה
- מפגש הדרכה לצוות שלך
דוגמה לרצף פעולות:
- המשתמש לוחץ על "התחל" → ממשק המשתמש עובר ל-STARTING.
- הבקשה נשלחת לשרת.
- הצלחה → ממשק המשתמש מציג RUNNING. שגיאה → חזרה ל-STOPPED + הודעה.
- בעת לחיצה על "עצור" — דיאלוג עם בחירת מצב.
- הקצה האחורי מבצע את העצירה, הבוט עובר ל-STOPPED.
ציר זמן ועלות
הפיתוח אורך 3–5 ימי עבודה בהתאם למספר האסטרטגיות ומורכבות ה-FSM. העלות נעה בין 1,500 ל-3,000 דולר, מחושבת באופן אישי לאחר ניתוח דרישות. אנו מבטיחים איכות הודות ליותר מ-5 שנות ניסיון בפיתוח מובייל ויותר מ-30 פרויקטים שהושלמו במגזר הפיננסי. הפתרון שלנו מתמודד עם עד 100 אסטרטגיות לכל בוט, עם זמן תגובה מתחת ל-200ms והתראות דחיפה שנמסרות תוך 5 שניות. אנו נעריך את הפרויקט שלך—צור קשר, ואנו נציע את הפתרון האופטימלי. קבל ייעוץ היום.







