Comprehensive live strategy review and fixes
Strategy asset redistribution: BTC-USD-PERP: OBI (0.000200), Iceberg (0.000210), A-S (0.000230), Funding (0.000220) ETH-USD-PERP: Pairs (0.006), Momentum (0.0005), Mean Reversion (0.0005), Kalman (0.005) Bug fixes: - OBI size: 0.000200504030201000 -> 0.000200 (garbage from bad replace) - Iceberg: up>=7 BUY, up<=3 SELL (was both firing at up==5) - Kalman: unique ETH size 0.005 (was 0.006 colliding with Pairs) - Momentum: switched to ETH data, tighter 1.2sigma bands - Mean Reversion: switched to ETH data, higher vol = more signals - Pairs: sharper Z threshold 1.2 (was 1.5) Strategy types (for dashboard viz): reversal: OBI, Mean Reversion (equity + PnL cards) momentum: Iceberg, Momentum (breakout visualization) stat_arb: Pairs, Kalman (spread + hedge ratio charts) carry: Funding Rate Arb (funding rate gauge) market_making: Avellaneda-Stoikov (quote tracking)
This commit is contained in:
+18
-18
@@ -5,7 +5,7 @@ Uses real orderbook to place maker orders AT the best bid/ask level,
|
||||
not at mid ± random spread. Refreshes quotes every cycle to stay
|
||||
at queue front. Avellaneda-Stoikov places dual-sided quotes simultaneously.
|
||||
|
||||
7 strategies x 100 USDC | Maker: 0.02% | Hyperliquid Testnet.
|
||||
8 strategies x 100 USDC | Maker: 0.02% | Hyperliquid Testnet.
|
||||
"""
|
||||
import os, sys, asyncio, json, time, logging, random, math
|
||||
from pathlib import Path
|
||||
@@ -31,14 +31,14 @@ RESERVE = 398.0
|
||||
MAKER_FEE = 0.0002
|
||||
|
||||
STRATEGIES = {
|
||||
"Order Book Imbalance": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000200504030201000,"fee_paid":0.0,"signals":[],"type":"reversal","description":"L2 bid/ask volume skew — buys when bids dominate, sells when asks dominate."},
|
||||
"Order Book Imbalance": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000200,"fee_paid":0.0,"signals":[],"type":"reversal","description":"L2 bid/ask volume skew — buys when bids dominate, sells when asks dominate."},
|
||||
"Iceberg Detection": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000210,"fee_paid":0.0,"signals":[],"type":"momentum","description":"Detects whale TWAP accumulation — follows smart money flow."},
|
||||
"Funding Rate Arb": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000220,"fee_paid":0.0,"signals":[],"type":"carry","description":"Delta-neutral carry — holds spot, shorts perp, collects funding."},
|
||||
"Pairs Trading": {"allocation":100.0,"instrument":"ETH-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.006,"fee_paid":0.0,"signals":[],"type":"stat_arb","description":"BTC/ETH ratio Z-score — trades when spread exceeds 1.5σ."},
|
||||
"Avellaneda-Stoikov": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000230,"fee_paid":0.0,"signals":[],"type":"market_making","description":"Dual-sided quoting at best bid/ask — captures spread via stochastic control. Places both sides simultaneously."},
|
||||
"Momentum Breakout": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000240,"fee_paid":0.0,"signals":[],"type":"momentum","description":"Bollinger Band (2σ) breakout — enters with volume confirmation."},
|
||||
"Mean Reversion": {"allocation":100.0,"instrument":"BTC-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.000250,"fee_paid":0.0,"signals":[],"type":"reversal","description":"VWAP deviation — buys below VWAP, sells above. Oscillates around fair value."},
|
||||
"Kalman Pairs": {"allocation":100.0,"instrument":"ETH-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.006,"fee_paid":0.0,"signals":[],"type":"stat_arb","description":"Kalman-filter adaptive hedge ratio — tracks evolving BTC/ETH beta with every tick."}
|
||||
"Momentum Breakout": {"allocation":100.0,"instrument":"ETH-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.0005,"fee_paid":0.0,"signals":[],"type":"momentum","description":"Bollinger Band (1.2σ) breakout on ETH — enters when price breaks bands."},
|
||||
"Mean Reversion": {"allocation":100.0,"instrument":"ETH-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.0005,"fee_paid":0.0,"signals":[],"type":"reversal","description":"VWAP deviation on ETH — buys below VWAP, sells above. Higher vol = more reversion."},
|
||||
"Kalman Pairs": {"allocation":100.0,"instrument":"ETH-USD-PERP","pnl":0.0,"pnl_pct":0.0,"position":0.0,"trades_today":0,"wins":0,"win_rate":0.0,"status":"idle","size":0.005,"fee_paid":0.0,"signals":[],"type":"stat_arb","description":"Kalman-filter adaptive hedge ratio — tracks evolving BTC/ETH beta with every tick."}
|
||||
}
|
||||
|
||||
trades_log: list[dict] = []
|
||||
@@ -124,8 +124,8 @@ def compute_signals():
|
||||
# Iceberg: trend count
|
||||
if len(btc_prices)>=10:
|
||||
up = sum(1 for i in range(-9,0) if btc_prices[i+1]>btc_prices[i])
|
||||
if up>=5: STRATEGIES["Iceberg Detection"]["signals"].append({"time":time.time(),"signal":"BUY","strength":up/10})
|
||||
elif up<=5: STRATEGIES["Iceberg Detection"]["signals"].append({"time":time.time(),"signal":"SELL","strength":1-up/10})
|
||||
if up>=7: STRATEGIES["Iceberg Detection"]["signals"].append({"time":time.time(),"signal":"BUY","strength":up/10})
|
||||
elif up<=3: STRATEGIES["Iceberg Detection"]["signals"].append({"time":time.time(),"signal":"SELL","strength":1-up/10})
|
||||
|
||||
# Funding Rate Arb: real API data
|
||||
try:
|
||||
@@ -154,8 +154,8 @@ def compute_signals():
|
||||
cur = btc/eth if eth>0 else 0
|
||||
if std>0:
|
||||
z = (cur-mu)/std
|
||||
if z>1.5: STRATEGIES["Pairs Trading"]["signals"].append({"time":time.time(),"signal":"SELL_ETH","strength":z})
|
||||
elif z<-1.5: STRATEGIES["Pairs Trading"]["signals"].append({"time":time.time(),"signal":"BUY_ETH","strength":abs(z)})
|
||||
if z>1.2: STRATEGIES["Pairs Trading"]["signals"].append({"time":time.time(),"signal":"SELL_ETH","strength":z})
|
||||
elif z<-1.2: STRATEGIES["Pairs Trading"]["signals"].append({"time":time.time(),"signal":"BUY_ETH","strength":abs(z)})
|
||||
# Kalman Pairs: adaptive hedge via Kalman filter (falls back to Pairs logic)
|
||||
if len(btc_prices)>=20 and len(eth_prices)>=20:
|
||||
try:
|
||||
@@ -174,20 +174,20 @@ def compute_signals():
|
||||
})
|
||||
except: pass
|
||||
|
||||
# Momentum: Bollinger
|
||||
if len(btc_prices)>=20:
|
||||
w = list(btc_prices)[-20:]; sma = sum(w)/len(w)
|
||||
# Momentum: Bollinger on ETH
|
||||
if len(eth_prices)>=20:
|
||||
w = list(eth_prices)[-20:]; eth_cur = eth_prices[-1]; sma = sum(w)/len(w)
|
||||
variance = sum((p-sma)**2 for p in w)/len(w); std = math.sqrt(variance)
|
||||
if std>0:
|
||||
if btc > sma+1.5*std: STRATEGIES["Momentum Breakout"]["signals"].append({"time":time.time(),"signal":"BUY","strength":(btc-sma-2*std)/std})
|
||||
elif btc < sma-1.5*std: STRATEGIES["Momentum Breakout"]["signals"].append({"time":time.time(),"signal":"SELL","strength":(sma-2*std-btc)/std})
|
||||
if eth_cur > sma+1.2*std: STRATEGIES["Momentum Breakout"]["signals"].append({"time":time.time(),"signal":"BUY","strength":(eth_cur-sma-1.2*std)/std})
|
||||
elif eth_cur < sma-1.2*std: STRATEGIES["Momentum Breakout"]["signals"].append({"time":time.time(),"signal":"SELL","strength":(sma-1.2*std-eth_cur)/std})
|
||||
|
||||
# Mean Reversion: VWAP
|
||||
if len(btc_prices)>=20:
|
||||
w = list(btc_prices)[-20:]; vols = [1+i/len(w) for i in range(len(w))]
|
||||
# Mean Reversion: VWAP on ETH
|
||||
if len(eth_prices)>=20:
|
||||
w = list(eth_prices)[-20:]; eth_mr = eth_prices[-1]; vols = [1+i/len(w) for i in range(len(w))]
|
||||
vwap = sum(p*v for p,v in zip(w,vols))/sum(vols)
|
||||
vstd = math.sqrt(sum((p-vwap)**2 for p in w)/len(w))
|
||||
dev = (btc-vwap)/vstd if vstd>0 else 0
|
||||
dev = (eth_mr-vwap)/vstd if vstd>0 else 0
|
||||
if dev>1.0: STRATEGIES["Mean Reversion"]["signals"].append({"time":time.time(),"signal":"SELL","strength":dev})
|
||||
elif dev<-1.0: STRATEGIES["Mean Reversion"]["signals"].append({"time":time.time(),"signal":"BUY","strength":abs(dev)})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user