An open API service indexing awesome lists of open source software.

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/加密货币量化分析平台

Awesome Lists containing this project

README

          




AetherQuant

AetherQuant



License


Vue 3


TypeScript


Tauri 2


Vite


Hyperliquid


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-charts rendering

  • 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 /info candle 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 meta endpoint (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.