Разработка десктопного торгового терминала
Десктопный торговый терминал предоставляет возможности, недоступные в браузере: прямое сетевое взаимодействие без CORS-ограничений, системные уведомления, автозапуск, доступ к локальным файлам для экспорта данных, потенциально более низкий latency через нативные TCP-соединения.
Технологический выбор
Electron — самый популярный фреймворк. React/Vue/Angular frontend + Node.js backend в одном приложении. Минус — большой размер (~100MB) и высокое потребление памяти (несколько инстансов Chromium). Плюс — переиспользование web-кода.
Tauri (Rust + WebView) — более лёгкая альтернатива Electron. Использует системный WebView (Edge на Windows, WebKit на macOS), размер бинарника 3–10MB. Rust backend вместо Node.js — значительно меньше памяти, выше производительность.
Qt (C++ или Python) — нативный UI, максимальная производительность, но сложная разработка и устаревший UX.
Для большинства trading terminal проектов — Tauri если нужна производительность, Electron если нужна скорость разработки.
Tauri архитектура
// src-tauri/src/main.rs
use tauri::{Manager, Window};
use tokio::sync::broadcast;
#[tauri::command]
async fn subscribe_market_data(
symbol: String,
window: Window,
state: tauri::State<'_, AppState>,
) -> Result<(), String> {
let mut rx = state.market_data_bus.subscribe();
tokio::spawn(async move {
while let Ok(event) = rx.recv().await {
if event.symbol == symbol {
window.emit("market-data", &event).unwrap_or_default();
}
}
});
Ok(())
}
#[tauri::command]
async fn place_order(
order: OrderRequest,
state: tauri::State<'_, AppState>,
) -> Result<OrderResponse, String> {
state.exchange_client
.place_order(order)
.await
.map_err(|e| e.to_string())
}
// Frontend: использование Tauri API
import { invoke } from '@tauri-apps/api/tauri';
import { listen } from '@tauri-apps/api/event';
// Подписка на рыночные данные через нативное событие
await invoke('subscribe_market_data', { symbol: 'BTC/USDT' });
const unlisten = await listen<MarketData>('market-data', (event) => {
updateOrderBook(event.payload);
});
Нативные фичи для трейдеров
System tray — терминал работает в трее, получает алерты даже в свёрнутом состоянии:
import { TrayIcon } from '@tauri-apps/api/tray';
import { sendNotification } from '@tauri-apps/plugin-notification';
// Алерт по цене
if (currentPrice >= alertPrice) {
await sendNotification({
title: 'Price Alert',
body: `BTC/USDT reached ${currentPrice.toFixed(2)}`,
icon: 'icons/icon.png',
});
}
Hotkeys — глобальные горячие клавиши:
use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, Modifiers, Shortcut};
app.global_shortcut().register(
Shortcut::new(Some(Modifiers::CTRL | Modifiers::SHIFT), Code::KeyB),
move |_app, _shortcut, _event| {
// Ctrl+Shift+B - быстрая покупка по рынку
place_market_buy_order();
},
)?;
Auto-start — запуск с системой для мониторинга 24/7:
import { enable, isEnabled } from '@tauri-apps/plugin-autostart';
async function enableAutostart() {
if (!(await isEnabled())) {
await enable();
}
}
Производительность против Electron
| Метрика | Electron | Tauri |
|---|---|---|
| Размер бинарника | 80–150 MB | 3–10 MB |
| Память при запуске | 150–300 MB | 30–80 MB |
| CPU idle | 2–5% | 0.5–1% |
| Startup time | 2–5 сек | 0.5–1 сек |
Для trading terminal, работающего 24/7, разница в потреблении памяти и CPU существенна.
Автообновление
Tauri встроенный updater через GitHub Releases или кастомный сервер:
// tauri.conf.json
{
"updater": {
"active": true,
"endpoints": ["https://releases.yourapp.com/{{target}}/{{arch}}/{{current_version}}"],
"dialog": true,
"pubkey": "..."
}
}
При выходе новой версии приложение показывает уведомление и скачивает обновление в фоне. Подпись обновлений приватным ключом — обязательное требование безопасности.







