בוט מסחר נתקע על נתוני נרות — שאילתות עוברות טיים-אאוט, והבאקטסטר לוקח דקה לטעון עמוד. עם מערך נתונים של 100 זוגות על פני שנה, מסד הנתונים קורס, ופאג'ינציה מסוג offset יוצרת כפילויות. נשמע מוכר? אנחנו בונים REST API לנתוני שוק היסטוריים שעומדים ב-1000 בקשות במקביל ומחזירים נרות תוך 50 אלפיות השנייה. להלן ההחלטות ההנדסיות שאנחנו מטמיעים בכל פרויקט: מבחירת מסד נתונים ועד אסטרטגיית קאשינג.
בעיות שאנחנו פותרים
מלכודות אופייניות של API למסחר — שאילתות איטיות על מערכי נתונים גדולים, סינון לא גמיש, חוסר בפאג'ינציה תקינה. ראינו פרויקטים שבהם שליפת שנה של OHLCV עבור 100 זוגות הורגת את מסד הנתונים. בעיה נפוצה נוספת היא חוסר עקביות בנתונים עם פאג'ינציה מסוג offset: אם נרות חדשים מוכנסים בין בקשות, הלקוח מקבל כפילויות או פערים. בדיקות עומס של הפתרונות שלנו מראות שיפור ביצועים של עד 200% בזכות sharding מבוסס זמן וקאשינג אגרסיבי.
עיצוב אנדפוינטים
מערכת בסיסית של אנדפוינטים לנתוני שוק:
GET /v1/ohlcv/{exchange}/{symbol} ?from=2024-01-01T00:00:00Z &to=2024-01-31T23:59:59Z &interval=1h &limit=1000
GET /v1/trades/{exchange}/{symbol} ?from=1704067200000 &to=1704153600000 &limit=10000
GET /v1/orderbook/{exchange}/{symbol}/snapshot ?timestamp=1704067200000 &depth=20
GET /v1/tickers/{exchange}/{symbol}/history ?from=2024-01-01 &to=2024-01-02 &fields=close,volumeאנחנו משתמשים ב-ISO 8601 לממשקי משתמש אנושיים וב-Unix timestamps (במילישניות) לגישה פרוגרמטית. שני הפורמטים נתמכים באמצעות זיהוי אוטומטי.
פרמטרים ואימות
from fastapi import FastAPI, Query
from datetime import datetime
from typing import Optional
@app.get("/v1/ohlcv/{exchange}/{symbol}")
async def get_ohlcv(
exchange: str,
symbol: str,
interval: str = Query("1h", regex="^(1m|5m|15m|1h|4h|1d|1w)$"),
from_time: datetime = Query(..., alias="from"),
to_time: datetime = Query(..., alias="to"),
limit: int = Query(1000, ge=1, le=50000),
):
if (to_time - from_time).days > 365:
raise HTTPException(400, "Date range cannot exceed 365 days")
data = await candle_service.get_candles(
exchange, symbol, interval, from_time, to_time, limit
)
return {"data": data, "count": len(data)} פאג'ינציה למערכי נתונים גדולים
פאג'ינציה מבוססת Cursor עדיפה על offset לנתוני סדרות זמן:
{
"data": [...],
"cursor": {
"next": "eyJ0aW1lc3RhbXAiOiAxNzA0MDY3MjAwMDAwfQ==",
"has_more": true
}
}ה-cursor הוא JSON מקודד ב-base64 המכיל את חותמת הזמן האחרונה בעמוד הנוכחי. בבקשה הבאה הלקוח מעביר GET /v1/ohlcv/{exchange}/{symbol} ?from=2024-01-01T00:00:00Z &to=2024-01-31T23:59:59Z &interval=1h &limit=1000 GET /v1/trades/{exchange}/{symbol} ?from=1704067200000 &to=1704153600000 &limit=10000 GET /v1/orderbook/{exchange}/{symbol}/snapshot ?timestamp=1704067200000 &depth=20 GET /v1/tickers/{exchange}/{symbol}/history ?from=2024-01-01 &to=2024-01-02 &fields=close,volume במקום from fastapi import FastAPI, Query from datetime import datetime from typing import Optional @app.get("/v1/ohlcv/{exchange}/{symbol}") async def get_ohlcv( exchange: str, symbol: str, interval: str = Query("1h", regex="^(1m|5m|15m|1h|4h|1d|1w)$"), from_time: datetime = Query(..., alias="from"), to_time: datetime = Query(..., alias="to"), limit: int = Query(1000, ge=1, le=50000), ): if (to_time - from_time).days > 365: raise HTTPException(400, "Date range cannot exceed 365 days") data = await candle_service.get_candles( exchange, symbol, interval, from_time, to_time, limit ) return {"data": data, "count": len(data)} .
| פרמטר | Cursor | Offset |
|---|---|---|
| עקביות תחת הוספות | מובטחת | כפילויות/פערים אפשריים |
| ביצועים על מערכים גדולים | O(log n) | O(n) עם offsets גדולים |
| תמיכה במיון | עולה בלבד (timestamp) | כל סוג |
| מורכבות יישום | בינונית | פשוטה |
אסטרטגיות קאשינג
| אסטרטגיה | TTL | ישימות |
|---|---|---|
| HTTP Cache-Control (public, max-age=3600) | שעה אחת | נתונים מעל 24 שעות |
| Redis Cache | 60 שניות | טווחים המבוקשים לעתים קרובות (30 הימים האחרונים) |
| Query Cache (TimescaleDB/ClickHouse) | 5 דקות | אגרגציות כבדות |
נרות היסטוריים הם בלתי ניתנים לשינוי — מועמדים מושלמים לקאשינג. אם הטווח המבוקש סגור לחלוטין, אנחנו שומרים בקאש למשך 24 שעות. אם הוא כולל את הרגע הנוכחי, אנחנו שומרים בקאש למשך 60 שניות.
איך לתכנן REST API לנתוני שוק?
בעת התכנון אנחנו משתמשים ב-REST עם אנדפוינטים אחידים, תמיכה במספר מסגרות זמן ופורמטים. העיקרון המרכזי הוא עיצוב מונחה משאבים: { "data": [...], "cursor": { "next": "eyJ0aW1lc3RhbXAiOiAxNzA0MDY3MjAwMDAwfQ==", "has_more": true } } . סינון דרך פרמטרי שאילתה, פאג'ינציה מבוססת cursor. אנחנו מתעדים עם OpenAPI — לקוחות יכולים לבדוק ישירות ב-Swagger UI.
למה קאשינג תקין של נתונים היסטוריים חשוב?
קאשינג תקין מפחית את זמן האחזור פי 3–5 ומקטין את העומס על מסד הנתונים. התצורות שלנו מתחשבות בתדירות הבקשות ובסטטיות הנתונים. עבור זוגות פופולריים עם היסטוריה עמוקה אנחנו משתמשים ב-ClickHouse עם תצוגות מהותיות (materialized views) — מה שנותן שיפור ביצועים של עד 40%.
הגבלת קצב ואימות
from slowapi import Limiter
from slowapi.util import get_remote_address
limiter = Limiter(key_func=get_remote_address)
@app.get("/v1/ohlcv/{exchange}/{symbol}")
@limiter.limit("100/minute")
async def get_ohlcv(...):
...עבור APIs מסחריים אנחנו מציעים תוכניות מדורגות דרך מפתחות API עם מגבלות שונות: חינמי (10 בקשות לדקה, היסטוריה של 30 יום), בתשלום (1000 בקשות לדקה, היסטוריה מלאה).
תיעוד דרך OpenAPI
FastAPI מייצר אוטומטית סכמת OpenAPI. אנחנו מוסיפים בנוסף דוגמאות בקשה/תגובה, תיאורי פורמטים, קודי שגיאה. Swagger UI ו-ReDoc מובנים — לקוחות יכולים לבדוק את ה-API ישירות בדפדפן ללא כלים נוספים.
דוגמה לתגובת שגיאה
{ "error": { "code": "INVALID_INTERVAL", "message": "Interval must be one of: 1m, 5m, 15m, 1h, 4h, 1d, 1w" } } איך אנחנו עובדים
- ניתוח: אנחנו בוחנים את הנתונים שלך, עומסי שיא, מקרי שימוש.
- עיצוב: מגדירים סכמת אנדפוינטים, פורמט תגובה, פאג'ינציה.
- יישום: בונים עם FastAPI, משלבים TimescaleDB/ClickHouse, מגדירים קאשינג.
- בדיקות: בדיקות עומס (k6 + locust), בדיקות לחץ עד 10,000 RPS.
- פריסה: פריסה בענן שלך או on-premise, הגדרת ניטור (Prometheus + Grafana).
ציר זמן — בין 2 ל-4 שבועות תלוי במורכבות ובנפח הנתונים. העלות מוערכת באופן אישי.
מה כלול
- REST API עם הפונקציונליות המתוארת לעיל (OHLCV, עסקאות, ספר הזמנות, טיקרים).
- תיעוד OpenAPI (Swagger/ReDoc).
- דוגמאות אינטגרציה ב-Python, JavaScript, cURL.
- פריסה (Docker, Kubernetes, CI/CD).
- הבטחת זמינות של 99.9% (SLA).
- חודש אחד של תמיכה חינמית לאחר ההשקה.
למה לבחור בנו?
5+ שנות ניסיון בתשתיות Web3, 30+ APIs מיושמים למערכות מסחר על Ethereum, Solana ו-Binance Smart Chain. הפתרונות שלנו מתמודדים עם עומסי שיא של עד 50,000 בקשות לדקה. אנחנו משתמשים ב-Tenderly, Slither, Mythril לבדיקות אבטחה.
צור קשר כדי לדון בפרויקט שלך. הזמן פיתוח turnkey עם הבטחות ביצועים — קבל ייעוץ מהנדס תוך 2 ימי עסקים.







