https://github.com/oxroot-crypto/aetherquant
AetherQuant — Cryptocurrency K-Line Quantitative Analysis Platform/加密货币量化分析平台
https://github.com/oxroot-crypto/aetherquant
aipowered cryptocurrency quantitative-finance tauri vue
Last synced: about 2 months ago
JSON representation
AetherQuant — Cryptocurrency K-Line Quantitative Analysis Platform/加密货币量化分析平台
- Host: GitHub
- URL: https://github.com/oxroot-crypto/aetherquant
- Owner: oxroot-crypto
- License: other
- Created: 2026-05-22T23:22:54.000Z (2 months ago)
- Default Branch: master
- Last Pushed: 2026-05-23T01:46:22.000Z (2 months ago)
- Last Synced: 2026-05-23T02:24:44.897Z (2 months ago)
- Topics: aipowered, cryptocurrency, quantitative-finance, tauri, vue
- Language: TypeScript
- Homepage:
- Size: 898 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
AetherQuant
Cryptocurrency K-Line Quantitative Analysis Platform
Real-time · Plugin-driven · Cross-platform
English ·
简体中文
Features ·
Quick Start ·
Architecture ·
Plugins ·
Contributors
---
## Overview
AetherQuant is a desktop-grade cryptocurrency technical analysis workstation. It renders interactive candlestick charts, runs five independent quantitative strategies in parallel, and aggregates their output into a unified consensus rating — all fed by live market data from Hyperliquid DEX over a persistent WebSocket connection.
The entire system is plugin-driven: swap exchanges to pull data from a different venue, or plug in your own strategy module without touching the core.
## Features
Chart
- TradingView
lightweight-chartsrendering - Candlestick + volume dual-pane layout
- MA indicator overlay (MA7 / MA25)
- Crosshair hover legend (OHLC + change %)
- Keyboard shortcuts — R reset, +/- zoom, ←→ pan, F fit
- Adjustable candle window (50 – 500)
- Auto-zoom to most recent 60 bars
Analysis Engine
-
MA Crossover — Golden Cross / Death Cross (MA7 & MA25) -
MACD — Momentum & signal line (12, 26, 9) -
RSI — Overbought / oversold oscillator (14) -
Bollinger Bands — Volatility & squeeze (20, 2) -
EMA Multi-TF — Multi-timeframe alignment (9, 21, 50)
Each strategy emits a 0–100 score mapped to a 5-tier rating.
Data Pipeline
- Hyperliquid
POST /infocandle snapshots - Persistent WebSocket (
wss://api.hyperliquid.xyz/ws) - Single-connection lifecycle — unsub/resub on switch
- Auto-reconnect with re-subscription on drop
- Full coin universe via
metaendpoint (100+ pairs)
UI / UX
- Frameless custom title bar with window controls
- Dark / light theme (CSS variables, persisted)
- Searchable symbol selector with real-time filtering
- English / Chinese i18n with language dropdown
- Live connection status indicator in toolbar
- Responsive layout — chart + collapsible side panel
### Scoring Model
| Score | Rating | Interpretation |
| ----: | :----- | :------------- |
| 70 – 100 | Bullish | Strong Buy |
| 55 – 70 | Slightly Bullish | Buy |
| 45 – 55 | Neutral | Hold |
| 30 – 45 | Slightly Bearish | Sell |
| 0 – 30 | Bearish | Strong Sell |
The consensus rating is the arithmetic mean of all active strategy scores.
## Tech Stack
| Layer | Stack |
| :---- | :---- |
| UI Framework | Vue 3 (Composition API, ``) |
| Language | TypeScript (strict) |
| Charting | `lightweight-charts` v5 (TradingView) |
| i18n | `vue-i18n` v10 |
| Styling | CSS Custom Properties (light / dark) |
| Bundler | Vite 8 |
| Desktop Shell | Tauri 2 (Rust backend) |
| Market Data | Hyperliquid DEX (HTTP + WebSocket) |
## Quick Start
```bash
# Prerequisites: Node.js ≥ 18, Rust toolchain
# Browser development
npm install
npm run dev # http://localhost:5173
# Desktop development
npm run tauri:dev
# Production distribution
npm run tauri:build # → src-tauri/target/release/bundle/
```
> **Windows:** requires MSVC build tools + Windows SDK for the Rust backend.
## Architecture
```
src/
├── components/ Vue 3 SFCs
│ ├── TitleBar.vue Custom frameless title bar + window controls
│ ├── Toolbar.vue Symbol / interval / limit selectors + WS indicator
│ ├── CoinSelector.vue Searchable dropdown (100+ pairs, real-time filter)
│ ├── KlineChart.vue Candlestick + volume + MA overlay + legend
│ ├── AnalysisPanel.vue Strategy cards with scores, signals, indicators
│ └── RatingBadge.vue Colored rating pill
├── composables/ Logic hooks
│ ├── useChart.ts lightweight-charts lifecycle & indicator API
│ ├── useRealtime.ts Hyperliquid persistent WebSocket manager
│ ├── useAnalysis.ts Strategy execution pipeline
│ ├── useTheme.ts Dark/light toggle + persistence
│ ├── useTauri.ts Native window API abstraction
│ └── usePlugins.ts Reactive plugin state
├── plugin-system/
│ └── PluginManager.ts Registry, activation, pub/sub
├── plugins/
│ ├── exchanges/
│ │ └── hyperliquid.ts
│ └── strategies/
│ ├── ma-strategy.ts
│ ├── macd-strategy.ts
│ ├── rsi-strategy.ts
│ ├── bollinger-strategy.ts
│ └── ema-strategy.ts
├── locales/ zh.ts / en.ts
├── types/ Shared TypeScript interfaces
├── themes.css CSS variable definitions (dark + light)
├── App.vue Root — wiring, WS lifecycle, indicator dispatch
├── i18n.ts i18n instance + locale persistence
└── main.ts Entry point
src-tauri/ Tauri (Rust) backend
├── src/ lib.rs, main.rs
├── icons/ App icons (ico, icns, png)
├── Cargo.toml
└── tauri.conf.json Window config (frameless, 1400×900)
```
### Data Flow
```
HTTP fetchData ──→ data[] ──→ KlineChart.setData()
│
WS onCandle ──→ merge ──→ data[] ──→ KlineChart.setData()
│
├── plotIndicators() (MA lines)
└── run(slice) (quant analysis)
```
### WebSocket Lifecycle
```
connect(BTC, 1h)
├── unsubscribe old (if any)
├── subscribe { candle, BTC, 1h }
│
├── onmessage → Number() coerce → filter by coin/interval → onCandle()
│
├── switch to (ETH, 15m)
│ ├── unsubscribe { candle, BTC, 1h }
│ └── subscribe { candle, ETH, 15m }
│ (same WebSocket, no reconnect)
│
└── onclose → 3s delay → reconnect → onopen → re-subscribe current
```
## Plugin System
Plugins implement a typed interface and register with the `PluginManager`. The host application never imports plugin internals directly — it only talks to the manager.
### Strategy Plugin
```ts
import type { StrategyPlugin } from '@/types'
export const myStrategy: StrategyPlugin = {
id: 'my-strategy',
name: 'My Strategy',
version: '1.0.0',
type: 'strategy',
description: 'Description',
analyze(data) {
return {
strategyId: 'my-strategy',
strategyName: 'My Strategy',
rating: 'bullish', // 'bearish' | 'slightly_bearish' | 'neutral' | ...
score: 75, // 0 – 100
signals: [{ type: 'buy', message: 'Signal text', timestamp: Date.now() }],
indicators: [{ name: 'Value', value: 1.23, displayValue: '1.23' }],
summary: 'Analysis result',
timestamp: Date.now(),
}
},
}
// Activate
pluginManager.registerStrategy(myStrategy)
```
### Exchange Plugin
```ts
import type { ExchangePlugin } from '@/types'
export const myExchange: ExchangePlugin = {
id: 'my-exchange',
name: 'My Exchange',
version: '1.0.0',
type: 'exchange',
description: 'Custom exchange adapter',
async fetchData(symbol, interval, limit) { /* → OHLCV[] */ },
async fetchRange?(symbol, interval, start, end) { /* → OHLCV[] */ },
subscribe?(symbol, interval, onCandle) { /* → unsubscribe fn */ },
getSupportedSymbols() { return ['BTC/USDT', 'ETH/USDT'] },
getSupportedIntervals() { return ['1m', '5m', '15m', '1h', '4h', '1d'] },
}
pluginManager.registerExchange(myExchange)
pluginManager.setActiveExchange('my-exchange')
```
## Contributors
<table>
<tr>
<td align="center">
<strong>oxroot</strong><br />
<sub>Project Author</sub><br />
<sub>Architecture · Strategy Algorithms · Direction</sub>
</td>
<td align="center">
<strong>Claude Code</strong><br />
<sub>Engineering</sub><br />
<sub>Full-stack Implementation · UI/UX · Tooling</sub>
</td>
</tr>
</table>
## License
MIT © 2025 oxroot. See [LICENSE](./LICENSE) for full text.