טריידר מפסיד עד 5% מהרווח בגלל פיגורים בטרמינל – זו עובדה מוכחת. כל אלפית שנייה של עיכוב גורמת להפסדים לאסטרטגיות בתדירות גבוהה. אנו מפתחים טרמינלים שלא מפגרים. המהנדסים שלנו, עם ניסיון של מעל 5 שנים, בנו 12 פרויקטים לחברות פרופ טריידינג וקרנות DeFi. מסחר בתדירות גבוהה דורש זמן השהיה מתחת ל-100 אלפיות השנייה. צרו קשר – נבחן את הפרויקט שלכם תוך יומיים ונציע פתרון סוהר.
רכיבי מפתח בטרמינל
מערכת תרשימים – הלב של הטרמינל. תצוגת נרות OHLCV, אינדיקטורים טכניים, נפחי מסחר. TradingView Lightweight Charts – הבחירה הסטנדרטית לפתרונות מותאמים אישית. לטרמינלים מלאים – TradingView Advanced Charts דרך Data Feed API או יישום מותאם לחלוטין על Canvas/WebGL.
ספר הזמנות – רמות bid/ask בזמן אמת, תרשים עומק (נפח מצטבר), קיבוץ לפי טיק. קריטי: עדכונים מתרחשים ללא רינדור מחדש של כל הרכיב – רק שורות שהשתנו.
טופס הזמנה – הזנת הזמנות. תומך במרקט, לימיט, סטופ-לימיט, טריילינג סטופ. חישוב גודל באחוזים מההפקדה, במטבע בסיס/ציטוט, לפי לוטים.
פאנל פוזיציות/הזמנות – ניהול פוזיציות פתוחות והזמנות פעילות. סגירה מהירה, שינוי פרמטרים של הזמנות.
פיד עסקאות – פיד עסקאות אחרונות עם הדגשת עסקאות גדולות. תיק/יתרה – סיכום חשבון: יתרות, יחס מרווח, רווח והפסד.
ארכיטקטורת פרונטאנד
// Структура React-приложения терминала
interface TerminalLayout {
left: {
symbolSearch: SymbolSearchPanel;
watchlist: WatchlistPanel;
};
center: {
chart: ChartPanel;
orderBook: OrderBookPanel;
tradeFeed: TradeFeedPanel;
};
right: {
orderForm: OrderFormPanel;
positions: PositionsPanel;
orders: OrdersPanel;
balance: BalancePanel;
};
bottom: {
orderHistory: OrderHistoryPanel;
alerts: AlertsPanel;
};
}פריסה מתכווננת באמצעות react-grid-layout או react-mosaic – טריידרים רוצים פריסות פאנלים הניתנות להתאמה אישית.
למה מצב WebSocket הוא צוואר הבקבוק?
הטרמינל מקבל נתונים ממספר זרמי WebSocket בו-זמנית. ניהול מצב זה אינו טריוויאלי. אנו משתמשים ב-Zustand עם עדכונים אטומיים:
import { create } from 'zustand';
interface MarketDataStore {
orderBook: OrderBook | null;
trades: Trade[];
currentPrice: number | null;
updateOrderBook: (diff: OrderBookDiff) => void;
addTrade: (trade: Trade) => void;
}
export const useMarketDataStore = create<MarketDataStore>((set, get) => ({
orderBook: null,
trades: [],
currentPrice: null,
updateOrderBook: (diff) =>
set((state) => {
if (!state.orderBook) return state;
const newBids = new Map(state.orderBook.bids);
const newAsks = new Map(state.orderBook.asks);
for (const [price, qty] of diff.bids) {
if (qty === 0) newBids.delete(price);
else newBids.set(price, qty);
}
for (const [price, qty] of diff.asks) {
if (qty === 0) newAsks.delete(price);
else newAsks.set(price, qty);
}
return {
orderBook: {
bids: newBids,
asks: newAsks,
timestamp: diff.timestamp,
},
};
}),
addTrade: (trade) =>
set((state) => ({
trades: [trade, ...state.trades].slice(0, 1000),
currentPrice: trade.price,
})),
}));
איך וירטואליזציה משפרת ביצועים פי 25?
ספר הזמנות עם 200+ רמות, המתעדכן 10 פעמים בשנייה, הוא עומס DOM כבד. וירטואליזציה של רשימות (react-virtual, tanstack/virtual) מרנדרת רק שורות גלויות: 500 שורות ב-DOM -> 20 גלויות, מה שמניב שיפור פי 25 לעומת רינדור מלא.
Web Workers לחישובים – חישובים כבדים (צבירת ספר הזמנות, חישוב אינדיקטורים) מועברים ל-Worker כדי לא לחסום את שרשור ה-UI:
// orderbook.worker.ts
self.onmessage = (e: MessageEvent) => {
const { type, data } = e.data;
if (type === 'PROCESS_DIFF') {
const processed = applyDiff(data.currentBook, data.diff);
const aggregated = aggregateByTick(processed, data.tickSize);
self.postMessage({ type: 'BOOK_UPDATED', data: aggregated });
}
};requestAnimationFrame throttling – אנו מעדכנים את ה-DOM לא יותר מ-60 פעמים בשנייה, תוך חציצה של עדכונים נכנסים.
בקאנד: שירות Gateway
הטרמינל אינו מתחבר ישירות לבורסות – זו טעות ארכיטקטונית למערכות ייצור. שירות Gateway ביניים:
- מרבב חיבור WebSocket יחיד לבורסה עבור לקוחות רבים (מפחית עומס פי 10)
- מטמון של מצב ספר ההזמנות הנוכחי
- מאמת חיבורי לקוחות
- אוכף מגבלות קצב
from fastapi import FastAPI, WebSocket
from starlette.websockets import WebSocketDisconnect
import asyncio
app = FastAPI()
class MarketDataGateway:
def __init__(self):
self.subscribers: dict[str, list[WebSocket]] = {}
self.book_cache: dict[str, OrderBook] = {}
async def subscribe(self, symbol: str, ws: WebSocket):
if symbol not in self.subscribers:
self.subscribers[symbol] = []
asyncio.create_task(self.connect_to_exchange(symbol))
self.subscribers[symbol].append(ws)
# Отправляем текущий снапшот новому подписчику
if symbol in self.book_cache:
await ws.send_json(self.book_cache[symbol].to_dict())
async def broadcast(self, symbol: str, data: dict):
dead_connections = []
for ws in self.subscribers.get(symbol, []):
try:
await ws.send_json(data)
except Exception:
dead_connections.append(ws)
for ws in dead_connections:
self.subscribers[symbol].remove(ws) אינטגרציה עם TradingView
TradingView Advanced Charts (רישיון בתשלום) הוא הסטנדרט לטרמינלים מקצועיים. מתאם DataFeed מותאם אישית:
const dataFeed: IdatafeedChartApi = {
onReady: (callback) => {
callback({
supported_resolutions: ['1', '5', '15', '60', '240', 'D', 'W'],
supports_marks: true,
supports_time: true,
});
},
getBars: async (symbolInfo, resolution, periodParams, onHistoryCallback) => {
const candles = await api.getCandles(
symbolInfo.name,
resolution,
periodParams.from,
periodParams.to
);
onHistoryCallback(candles.map(toTradingViewBar), {
noData: candles.length === 0,
});
},
subscribeBars: (symbolInfo, resolution, onRealtimeCallback) => {
wsGateway.on(`candle:${symbolInfo.name}:${resolution}`, onRealtimeCallback);
},
}; גרסת מובייל
טרמינל מלא במובייל הוא אתגר UX שונה. דפוסים מרכזיים:
- החלקה בין סעיפים (תרשים/ספר הזמנות/הזמנות) במקום פריסה מרובת פאנלים
- Bottom sheet לטופס הזמנה
- ספר הזמנות מפושט (רק 10-20 רמות)
- התראות Push להתראות מחיר ומילוי הזמנות
React Native עם WebView לתרשים TradingView או יישום מקורי באמצעות react-native-canvas לגרפים פשוטים.
ביצועים ו-SLA
יעדי ביצועים:
| מדד | יעד |
|---|---|
| זמן השהיה בעדכון ספר הזמנות | < 100 אלפיות השנייה מבורסה ל-UI |
| זמן השהיה בשליחת הזמנה | < 200 אלפיות השנייה |
| FPS ברינדור תרשים | 60 fps |
| זמן טעינה ראשוני | < 3 שניות |
| חיבור מחדש של WebSocket | < 2 שניות |
פרטי ניטור
ניטור זמן השהיה בצד הלקוח באמצעות performance.now() ושליחת מדדים לאנליטיקה הוא חלק הכרחי מניטור ייצור. חיסכון בעמלות עקב הפחתת זמן השהיה יכול להגיע ל-30%.
הערכה ותהליך עבודה
אנו מתחילים בניתוח מעמיק של הדרישות שלכם. לאחר מכן אנו מתכננים את הארכיטקטורה, מפתחים את הטרמינל בסבבים איטרטיביים, בודקים ביצועים ואמינות, ולבסוף משיקים. לאחר ההשקה, אנו מספקים 3 חודשי תמיכה טכנית. ציר הזמן האופייני נע בין חודש לטרמינל בסיסי למעל 4 חודשים לפתרון מקיף. התמחור נקבע לאחר ניתוח.
טעויות פיתוח אופייניות
- חיבור ישיר של לקוח לבורסה ללא Gateway – הסבילות והאבטחה נפגעות
- חוסר וירטואליזציה של רשימות – עם 200+ רמות בספר הזמנות, ה-UI מתחיל לפגר
- רינדור מחדש של כל רכיב ספר ההזמנות בכל שינוי במקום עדכון אינקרמנטלי
- התעלמות ממגבלות קצב של הבורסה – מוביל לחסימת מפתח API
מה כלול
- תיעוד פרויקט ותיאור ארכיטקטורה
- מאגר קוד (פרונטאנד React, Gateway בפייתון, סקריפטים לפריסה)
- אינטגרציה עם בורסות מהרשימה שלכם
- הכשרת הצוות שלכם על הקוד
- 3 חודשי תמיכה טכנית לאחר השחרור
הזמינו פיתוח טרמינל מסחר סוהר. קבלו ייעוץ – כתבו לנו, נבחן את הפרויקט שלכם תוך יומיים.







