Skip to content
Yuval Gerber
02Real-Time Systems / FinTech

HYPE

An event-driven trading system that reacts in real time — and refuses to lose control.

Role
Solo — spec, architecture, engineering, UI
Year
2026
Stack
Python 3.12 · asyncio · threads · WebSockets · SQLite (WAL) · PyQt6 + pyqtgraph · Pydantic v2 · solders · macOS Keychain · Touch ID · PyInstaller
Hype
HypePAPERLIVEStartStop

Performance

EquityLeaders○ Paper● Live

Win rate

88%

Closed trades

289

Pre-trade checks

8

Config keys

72

Drag to pan · scroll to zoom the time range

A single-user, real-time copy-trading system for Solana. It streams trader activity over WebSockets, screens every token with parallel risk checks, executes and manages its own exits, and runs behind a secured PyQt6 dashboard and Telegram bot.

lines of Python
13,927

79 files, built against a written spec

pre-trade checks
8

run concurrently before any money moves

live services
6

Birdeye · Helius · Jupiter · DexScreener · RugCheck · Telegram

win rate
88%

289 closed trades in one live session

The problem

On-chain markets move in seconds and are full of traps. The hard part isn’t placing a trade — it’s reacting instantly, saying no to the dangerous ones, and never losing control of the money.

01Overview

Personal project · trades only its owner’s funds · not financial advice

One engine. Six live services. Zero manual steps.

HYPE ranks the most profitable trader wallets on Solana, subscribes to all of them over one WebSocket, and parses every transaction as it lands. When a followed trader buys, HYPE screens the token, sizes a position under hard risk limits, executes the swap itself, and manages the exit on its own — take-profit, stop-loss and trailing stop.

It was built paper-trading-first from a written design spec: the simulator and the live executor share the same engine, sizing and position manager. Only the executor is swapped.

02Architecture

An event pipeline, from signal to exit.

Every stage is a separate module behind a small interface, so the paper and live paths differ by exactly one component.

  1. REST

    Ranker

    Birdeye · top wallets by realized PnL

  2. SQLite

    Followed wallets

    eligibility + activity prune

  3. Helius WS

    Live monitor

    one WebSocket, logsSubscribe

  4. asyncio

    Parse worker

    queue · de-dup · buy detection

  5. thread pool

    Risk engine

    8 checks in parallel

  6. Sizing

    10% equity · caps · gas reserve

  7. one interface

    Executor

    paper | live → Jupiter

  8. every 5 s

    Position manager

    TP · SL · trailing stop

  9. persistence

    SQLite

    WAL · 7 tables

  10. Dashboard

    PyQt6 · 6 tabs

  11. Telegram

    owner-only control

  12. Investigation

    trader state machine

03Results

88% of trades closed green.

One live session, as recorded by HYPE’s own Performance tab: 289 closed trades, realized equity climbing as a staircase that only moves when a position closes. Small balance, real execution.

88%

Win rate

289 closed trades · one live session

BuyTake-profit exitStop-loss exitOther exit
HYPE realized equity over one live sessionA rising staircase over roughly three and a quarter days, with two long flat stretches and two sharp drawdowns. Win rate 88% over 289 closed trades.MonTueWedThuREALIZED EQUITY · SHAPE ONLY

Recreated from the Performance tab. Past results say nothing about future ones.

04Risk engine

Eight checks before any money moves.

Read-only checks run concurrently in a thread pool — one shared report fetch feeds several of them. Every rejection is logged with a human-readable reason.

05Concurrency

A UI thread, an engine thread, and an event loop that never blocks.

The engine runs on its own thread with a dedicated asyncio loop and three tasks. Blocking work goes to threads; exits are sold concurrently; cross-thread UI updates travel only as queued Qt signals.

Thread / task
0s5s10s15s20s

Qt main thread

UI · queued signals only

stateChanged
notify
lightChanged
notify

asyncio · monitor

WebSocket read loop → queue

asyncio · manage

TP / SL / trailing, every 5 s

plan_closes
plan_closes
plan_closes
plan_closes

asyncio · heartbeat

liveness beat, every 5 s

worker threads

to_thread · gather(exits)

handle_signal
execute_close
risk checks ×8

watchdog · QTimer

every 20 s: alive? beat < 90 s? loop < 240 s?

check

Schematic of the concurrency model — lanes and cadences from the source; block positions illustrative.

06Reliability

Designed for the failure at 3 a.m.

07Security

Keys that never touch disk. Funds with one way out.

08In numbers

typed config keys
72

Pydantic-validated, live-editable

SQLite tables
7

WAL mode, concurrent readers

dashboard tabs
6

plus Telegram remote control

asyncio tasks
3

monitor · manage · heartbeat

09Interface

A desktop cockpit for a system that runs itself.

Positions with live P&L, a realized-equity chart with a marker for every buy and exit, trader leaderboards, every threshold live-editable, a filterable activity log, and a system panel with service health lights.

Hype
HypePAPERLIVEStartStop

Performance

EquityLeaders○ Paper● Live

Win rate

88%

Closed trades

289

Pre-trade checks

8

Config keys

72

Drag to pan · scroll to zoom the time range

10From the source

Resilience you can read.

hype/monitor.pyview on GitHub ↗
backoff = 1
try:
    while not self._stop.is_set():
        try:
            await self._session()
            backoff = 1  # clean exit -> reset backoff
        except Exception as e:  # noqa: BLE001 - reconnect on any WS error
            if self._stop.is_set():
                break
            if self._intentional_reconnect:
                self._intentional_reconnect = False
                backoff = 1
                continue
            self.log.warning("Monitor WS error: %s — reconnecting in %ds", e, backoff)
            await asyncio.wait([asyncio.create_task(self._stop.wait())], timeout=backoff)
            backoff = min(backoff * 2, 30)
hype/ui/engine_controller.pyview on GitHub ↗
# Manage exits CONCURRENTLY: plan (fast) → sell each in parallel
# so many TP/SL/trailing exits fire at once, never one-at-a-time.
try:
    plan = await asyncio.to_thread(engine.plan_closes)
    if plan:
        await asyncio.gather(
            *[asyncio.to_thread(engine.execute_close, pos, reason)
              for pos, reason in plan],
            return_exceptions=True)
        reclaim_now = True   # an exit emptied an account → reclaim soon
except Exception:  # noqa: BLE001
    pass

HYPE is a personal project that trades only its owner’s funds. It is not a product, a service or financial advice, and past results do not predict future ones.

Next project

MiniGPT Studio