OKX · API מעשי
שגיאות API נפוצות ב-OKX ורשימת אבחון: תקן לפי הטבלה הזו
מי שכותב סקריפטים אלגוריתמיים, בתשעה מתוך עשרה מקרים לא נתקע באסטרטגיה אלא בשורת שגיאה אדומה: הסקריפט רץ, הטרמינל מקפיץ שרשרת של code ואנגלית שלא מובנים, ובן אדם נתקע. החדשות הטובות: לשגיאות ה-API של OKX יש רק כמה דגמים תכופים, וברגע שמבינים איך כל אחת נראית ולאיזו סיבה היא מתאימה, האבחון הופך הרבה יותר מהיר.
במאמר הזה אנחנו (צוות המערכת של MeowQuant) ריכזנו את השגיאות שנתקלנו בהן בעצמנו, ושראינו שוב ושוב בקהילות, לרשימה אחת — שליבה היא טבלת קודי שגיאה. כשמשהו משתבש, קודם אתר בטבלה לפי קוד השגיאה או מילת מפתח, ואז הסתכל על האבחון המתאים שלמטה. בסוף הקריאה אתה אמור לפתור את רוב השגיאות בעצמך תוך דקות, ולא לבהות באדום בחוסר אונים.
קודם תלמד לקרוא את השגיאה: code + msg
הצעד הראשון בפתרון תקלות הוא להבין את השגיאה עצמה. כשממשק של OKX נכשל הוא מחזיר שלושה דברים:
- קוד סטטוס HTTP: השכבה הגסה ביותר, למשל 401 (בעיית אימות), 429 (יותר מדי בקשות), 400 (הבעיה בבקשה עצמה).
- code: קוד שגיאה מספרי של OKX עצמה, שמצביע בדיוק הרב ביותר על סוג הבעיה. זה הבסיס העיקרי לאבחון שלך.
- msg: הסבר מילולי שעוזר לאשר את הכיוון, ולפעמים מצביע ישירות על השדה שנכשל.
אם אתה משתמש ב-ccxt, היא עוטפת את השגיאות הגולמיות האלה לסוגי חריגות קריאים יותר: בעיית אימות זורקת AuthenticationError, מגבלת קצב זורקת RateLimitExceeded, וחוסר יתרה זורק InsufficientFunds. מידע החריגה נושא בדרך כלל גם את ה-code וה-msg המקוריים של OKX. הרגל טוב הוא להדפיס אותם בבירור עם try/except:
import ccxt
okx = ccxt.okx({
'apiKey': 'ה_apiKey_שלך',
'secret': 'ה_secret_שלך',
'password': 'ה_Passphrase_שלך',
'enableRateLimit': True,
})
try:
balance = okx.fetch_balance()
print('USDT זמין:', balance['USDT']['free'])
except ccxt.AuthenticationError as e:
print('כשל אימות, בדוק את שלושת האישורים ואת שעון המערכת:', e)
except ccxt.RateLimitExceeded as e:
print('הגעת למגבלת קצב, האט את הבקשות:', e)
except ccxt.BaseError as e:
print('שגיאה אחרת, בדוק את ה-code/msg המקוריים:', e)
רשום לעצמך את שרשרת ה-code וה-msg מהחריגה כמו שהיא, השווה לטבלה שלמטה, וברוב המקרים תאתר לאיזו קטגוריית בעיה זה שייך.
טבלת השגיאות התכופות
הטבלה הבאה מכסה את השגיאות שמתחילים נתקלים בהן הכי הרבה. קודי השגיאה הם לפי מה שמפורסם בתיעוד הנוכחי של OKX API v5 (OKX משנה מדי פעם ערכי קוד, ואם לא תואם — לך לפי טקסט ה-msg והתיעוד הרשמי), והעיקר הוא להתאים בין "סיבה ← איך לתקן".
| שגיאה (code / מילת מפתח) | הסיבה הסבירה | איך לתקן |
|---|---|---|
| 50011 Too Many Requests / מגבלת קצב |
הבקשות צפופות מדי, הפעילו את הגנת מגבלת הקצב של הממשק | הדלק enableRateLimit; אם עדיין נתקלים — הוסף retry עם נסיגה מעריכית, אל תשתמש בלולאת while ללא השהיה |
| Invalid sign כשל אימות |
חתימה שגויה: ברוב המקרים Passphrase שגוי, או apiKey/secret שהועתק לא נכון, או שעון לא מדויק | בדוק כל אחד משלושת האישורים לרווחים/תווים חסרים; ודא ש-password מולא עם ה-Passphrase; כייל את שעון המערכת |
| API key לא תקין APIKey does not exist |
apiKey הועתק שגוי, נמחק, או שימוש בסביבה שגויה (key אמיתי בתור key של דמו) | העתק מחדש את ה-apiKey מהלוח; ודא שהמפתח עדיין קיים ולא נמחק; ודא שמתג ה-sandbox תואם לסביבה |
| Passphrase שגוי passphrase incorrect |
השדה password ב-ccxt מולא עם סיסמת ההתחברות, ולא עם ה-Passphrase שהוגדר ביצירת המפתח |
שנה את password ל-Passphrase שהגדרת ביצירת המפתח; אם לא זוכר — מחק את המפתח וצור מחדש |
| יתרה לא מספיקה Insufficient balance |
סכום ההזמנה עולה על היתרה הזמינה, או שהכסף בחשבון אחר (חשבון מימון מול חשבון מסחר) | הקטן את כמות ההזמנה; ודא שהכסף בחשבון המשמש למסחר; בדמו אפשר לאפס את הכסף הווירטואלי |
| חותמת זמן פגה timestamp expired |
סטיית שעון המערכת המקומי גדולה מדי, חותמת הזמן של החתימה חרגה מהסובלנות של OKX | הדלק NTP לכוונון אוטומטי וסנכרן את השעון; שרתי ענן בדרך כלל מדליקים זאת כברירת מחדל |
| אין הרשאה permission denied |
למפתח הזה אין את ההרשאה הנדרשת (נפוץ: סומן רק קריאה, לא מסחר) | חזור לניהול ה-API והוסף למפתח את הרשאת 'מסחר', בלי צורך ביצירה מחדש |
| IP מחוץ לרשימה IP not allowed |
הוגדרה רשימת IP מורשים, אבל ה-IP היוצא הנוכחי לא ברשימה (החלפת רשת/proxy/IP ביתי שהשתנה) | הוסף את ה-IP היוצא הנוכחי לרשימה של המפתח; אם ה-IP משתנה הרבה — שקול לא להגדיר רשימה |
| צמד מסחר לא קיים instrument does not exist |
פורמט symbol שגוי, או שימוש בפורמט חוזים להזמנת ספוט | כתוב ספוט כ-BTC/USDT (אותיות גדולות עם קו נטוי); קודם load_markets() כדי לראות צמדים זמינים |
| כמות/דיוק לא תואמים size too small |
כמות ההזמנה קטנה מהמינימום של הצמד הזה, או שמספר ספרות הדיוק שגוי | השתמש ב-load_markets() כדי לבדוק limits ו-precision של הצמד, ועגל לפי הנדרש |
אבחון ותיקון, שורה אחר שורה
הטבלה נותנת כיוון, הסעיף הזה נותן פרטים. בחר את השורה שנתקלת בה וקרא הלאה.
אימות (Invalid sign / API key לא תקין / Passphrase שגוי)
זה אזור האסון של שגיאות מתחילים. בדוק בסדר הבא, ושיעור הפגיעה הגבוה ביותר:
- קודם בדוק את ה-Passphrase. השדה
passwordב-ccxt חייב להיות מולא עם ה-Passphrase שהגדרת בעת יצירת המפתח — לא סיסמת ההתחברות, וגם לא ה-secret. זה לבדו תופס יותר ממחצית מכשלי האימות. - אחר כך בדוק אם ה-apiKey / secret הועתקו שגוי. נפוץ שבהדבקה נוספו רווחים בתחילה/בסוף, או נחסרו תו או שניים. העתקה מחדש מהלוח היא הבטוחה ביותר.
- בנוסף בדוק את שעון המערכת. שעון לא מדויק גורם לחותמת זמן פגה, וזה מתבטא גם הוא ככשל אימות. הדלק NTP לכוונון.
אין הרשאה
הסימפטום הטיפוסי הוא "אפשר לבדוק יתרה, אי אפשר להזין". בדיקת יתרה עוברת בהרשאת קריאה, הזמנה עוברת בהרשאת מסחר, ושתיהן מאושרות בנפרד. חזור לניהול ה-API בלוח של OKX, מצא את המפתח הזה והוסף לו 'מסחר', בלי צורך ביצירה מחדש. אם מתוך הרגל סימנת גם משיכה — אל תשאיר אותה; למפתח שמריץ אלגו לעולם אל תפתח הרשאת משיכה.
יתרה לא מספיקה
מעבר למשמעות המילולית של כסף לא מספיק, יש סיבה נסתרת נוספת: ל-OKX יש חשבונות שונים (חשבון מימון, חשבון מסחר ועוד), והכסף שלך אולי לא נמצא בחשבון שמשמש להזמנה. ודא שהכסף כבר הועבר לחשבון המסחר. בדמו, אם נגמר הכסף הווירטואלי אפשר לאפס אותו בממשק הדמו — וזה גם היתרון של תרגול קודם בדמו, ניסוי וטעייה בלי כסף אמיתי.
symbol / דיוק
צמד ספוט ב-ccxt הוא באופן אחיד אותיות גדולות/אותיות גדולות עם קו נטוי קדמי, למשל BTC/USDT. כתיבה כ-BTCUSDT, אותיות קטנות, או פורמט חוזים — כולן יחזירו שגיאה. אם הכמות קטנה מדי או הדיוק שגוי, השתמש ב-load_markets() כדי לבדוק את הכמות המינימלית והדיוק של הצמד הזה, ומלא לפי הנדרש. יש לנו דוגמת הזמנה מלאה במבוא המעשי ל-API.
OK30001 מקנה הנחה בעמלות, וזה חל גם על הזמנות דרך API. לחץ כאן להרשמה ל-OKX ולפתיחת API ←
מגבלת קצב ו-retry עם נסיגה
מגבלת קצב (50011 / Too Many Requests) היא הקטגוריה שמשתמשי סקריפט נתקלים בה הכי הרבה, ושהכי כדאי למנוע מראש. היא לא אומרת שעשית משהו לא בסדר, אלא שהבקשות צפופות מדי והפעילו את ההגנה של הבורסה. הטיפול בה בשתי שכבות:
שכבה ראשונה: הדלק את מגביל הקצב המובנה של ccxt. הוסף באתחול 'enableRateLimit': True, ו-ccxt תשתול אוטומטית מרווחים סבירים בין הבקשות. ברוב המקרים השלב הזה מספיק:
okx = ccxt.okx({
'apiKey': 'ה_apiKey_שלך',
'secret': 'ה_secret_שלך',
'password': 'ה_Passphrase_שלך',
'enableRateLimit': True, # מגביל קצב אוטומטי, הדלק קודם
})
שכבה שנייה: הוסף retry עם נסיגה מעריכית. אם האסטרטגיה שלך באמת מבצעת בקשות צפופות ברגעים מסוימים (למשל סורקת הרבה צמדים בו-זמנית), מגביל הקצב האוטומטי לבדו עדיין עלול להיתקל מדי פעם. אז עטוף את הבקשות הקריטיות בשכבת retry: נתקלת פעם, חכה שנייה ונסה שוב; שוב, חכה 2 ואז 4 שניות, האריך בהדרגה, ואחרי מספיק כשלונות — ויתר עם שגיאה.
import ccxt, time
def with_retry(fn, max_tries=5):
delay = 1
for i in range(max_tries):
try:
return fn()
except ccxt.RateLimitExceeded:
print(f'מגבלת קצב, ניסיון {i+1}, מחכה {delay} שניות ומנסה שוב')
time.sleep(delay)
delay *= 2 # נסיגה מעריכית: 1 ← 2 ← 4 ← 8 ...
raise RuntimeError('עדיין נתקל במגבלת קצב אחרי כמה ניסיונות, מוותר')
# שימוש: זרוק לתוכה את הקריאה שעלולה להיתקל במגבלת קצב
ticker = with_retry(lambda: okx.fetch_ticker('BTC/USDT'))
print(ticker['last'])
דוגמה שלילית: אל תכתוב while True: שמיד אחריו פוגע בממשק בלי שום השהיה בין לבין. לולאה כזו תזרוק עשרות עד מאות בקשות בשנייה אחת, תיתקל מיד במגבלת קצב, ובמקרים חמורים כל המפתח ייחסם זמנית. בכל לולאת תדירות גבוהה חייבים להשאיר מרווח.
בדיקה: מהמורה שאנחנו נתקלנו בה
fetch_ticker ברצף על למעלה מעשרה צמדים, בלי שום השהיה בין לבין, וגם שכחנו להדליק enableRateLimit. תוך פחות מדקה הטרמינל התחיל להקפיץ RateLimitExceeded (התואם ל-50011), ורוב הבקשות שאחריו התבטלו. עשינו שני צעדים: קודם הוספנו באתחול 'enableRateLimit': True, ואז עטפנו את הבקשה של כל צמד בפונקציית הנסיגה with_retry שלמעלה. אחרי השינוי הרצנו שוב, וכל למעלה מעשרה הצמדים החזירו תקין; מדי פעם הופעלה נסיגה פעם-פעמיים, המתנה של שנייה-שתיים והכל המשיך, וכל סבב הסריקה רץ עד הסוף בלי שגיאת מגבלת קצב נוספת. הלקח ישיר: כשפוגעים בממשק בתוך לולאה, מגביל קצב ונסיגה הם ציוד תקני, לא אופציה.
שאלות נפוצות
איך קוראים שגיאת API של OKX?
כשממשק של OKX נכשל הוא מחזיר code (קוד שגיאה מספרי) ו-msg (הסבר מילולי), וגם קוד סטטוס HTTP. קודם הסתכל על ה-code — הוא מצביע בדיוק הרב ביותר על סוג הבעיה; ה-msg עוזר לאשר את הכיוון. ב-ccxt השגיאה בדרך כלל נעטפת לסוג חריגה מתאים (למשל AuthenticationError, RateLimitExceeded, InsufficientFunds), ומידע החריגה נושא בדרך כלל גם את ה-code וה-msg המקוריים של OKX. חפש את המחרוזת הזו כמו שהיא, וברוב המקרים תאתר את הבעיה.
למה אני מקבל כל הזמן כשל אימות / Invalid sign?
שלוש הסיבות הנפוצות ביותר לשגיאות אימות: ראשית, השדה password ב-ccxt לא מולא עם ה-Passphrase של OKX (מולאה סיסמת ההתחברות); שנית, ה-apiKey או ה-secret הועתקו עם רווחים מיותרים או תווים חסרים; שלישית, שעון המערכת לא מדויק וגרם לחותמת זמן פגה בחתימה. בדוק לפי הסדר הזה, וכמעט כל Invalid sign ייפתר.
הגעתי למגבלת קצב (50011 / Too Many Requests) — מה עושים?
מגבלת קצב היא הגנה שמופעלת כשהבקשות צפופות מדי. הדרך הקלה ביותר היא להדליק enableRateLimit באתחול ccxt, והוא ישתול אוטומטית מרווחים בין הבקשות. אם עדיין נתקלים, הוסף retry עם נסיגה מעריכית — נתקלת פעם, חכה שנייה; שוב, חכה 2 ואז 4 שניות, והאריך בהדרגה. אל תשתמש ב-while True בלי השהיה כדי להפציץ את הממשק.
אני יכול לבדוק יתרה אבל ההזמנה מחזירה אין הרשאה — למה?
בדיקת יתרה היא הרשאת קריאה, הזמנה היא הרשאת מסחר, ושתיהן מאושרות בנפרד בעת יצירת המפתח. אם אפשר לבדוק אבל לא להזין, בדרך כלל סימנת רק קריאה ולא מסחר. חזור לניהול ה-API בלוח של OKX והוסף למפתח הזה את הרשאת המסחר, בלי צורך ביצירה מחדש.
מה משמעות חותמת זמן שפגה (timestamp expired)?
ל-OKX יש סובלנות לחותמת הזמן בבקשה, ואם שעון המחשב או השרת שלך לא מדויק וסוטה מעבר לסובלנות, החתימה תידחה כי חותמת הזמן פגה. הפתרון הוא לסנכרן את שעון המערכת לזמן רשת מדויק, ולהדליק NTP לכוונון אוטומטי. שרתי ענן בדרך כלל מדליקים זאת כברירת מחדל, מכונות מקומיות לפעמים סוטות.
מה הסיפור עם השגיאה 'צמד המסחר לא קיים'?
ברוב המקרים זה פורמט symbol שגוי. ב-ccxt צמד ספוט הוא אותיות גדולות עם קו נטוי קדמי, למשל BTC/USDT, וכתיבה כ-BTCUSDT, btc/usdt, או שימוש בפורמט חוזים להזמנת ספוט יחזירו 'צמד המסחר לא קיים'. אם לא בטוח, קודם print(okx.load_markets().keys()) כדי לראות איך באמת נראים הצמדים הזמינים.
אחרי שעברת את משוכת איתור התקלות, הסקריפט שלך לא ייתקע בקלות. הדבר הבא ששווה להשקיע בו זמן הוא לכתוב ניהול סיכונים לתוך הקוד — מפחיד יותר משגיאה הוא סקריפט שלא מחזיר שגיאה אבל מזין הזמנות שגויות כל הזמן. ואל תשכח להריץ קוד חדש קודם בדמו, איתור תקלות בלי כסף אמיתי.
סידרת את התקלות, מוכן להריץ אסטרטגיה ברצינות?
קודם הכן את החשבון ואת ה-API, סדר את התהליך והשגיאות בדמו, ורק אז עבור לכסף אמיתי. חשבון חדש שנפתח עם קוד ההזמנה נהנה מהנחה בעמלות, וזה חל גם על הזמנות דרך API.
מחירי נכסי קריפטו תנודתיים מאוד, וחוזים ומינוף עלולים להוביל להפסד מלא של הקרן. מסחר אלגוריתמי ואוטומטי אינו מבטיח רווח, השתמש רק בכסף שאתה יכול להרשות לעצמך להפסיד.