-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlive_engine.py
More file actions
75 lines (63 loc) · 2.76 KB
/
Copy pathlive_engine.py
File metadata and controls
75 lines (63 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""CLI entry point for the live HFT engine.
Usage:
python live_engine.py --symbol BTCUSDT --strategy momentum --gateway binance --backend dryrun
python live_engine.py --symbol AAPL --strategy sma --backend alpaca # needs keys
Ctrl+C flattens positions and shuts down gracefully.
"""
import argparse
import asyncio
import logging
from engine.live_engine import LiveEngine
from engine.state import StateStore
logging.basicConfig(level=logging.INFO,
format="%(asctime)s %(levelname)s %(name)s: %(message)s")
logger = logging.getLogger("hft.cli")
async def main():
ap = argparse.ArgumentParser(description="HFT-Engine live trading")
ap.add_argument("--symbol", default="AAPL")
ap.add_argument("--strategy", choices=["sma", "threshold", "rsi", "momentum"], default="sma")
ap.add_argument("--fast", type=int, default=20)
ap.add_argument("--slow", type=int, default=50)
ap.add_argument("--threshold", type=float, default=100.0)
ap.add_argument("--rsi-period", type=int, default=14)
ap.add_argument("--oversold", type=float, default=30.0)
ap.add_argument("--overbought", type=float, default=70.0)
ap.add_argument("--mom-period", type=int, default=50)
ap.add_argument("--qty", type=int, default=10)
ap.add_argument("--max-position", type=int, default=100)
ap.add_argument("--max-exposure", type=float, default=100_000.0)
ap.add_argument("--backend", choices=["dryrun", "direct", "alpaca"], default="dryrun",
help="order router backend")
ap.add_argument("--gateway", choices=["poll", "binance"], default="poll",
help="market data backend")
ap.add_argument("--db", default="hft_live.db")
args = ap.parse_args()
store = StateStore(args.db)
engine = LiveEngine(
args.symbol, store, backend=args.backend, strategy=args.strategy,
fast=args.fast, slow=args.slow, threshold=args.threshold,
rsi_period=args.rsi_period, oversold=args.oversold, overbought=args.overbought,
mom_period=args.mom_period, qty=args.qty,
max_position=args.max_position, max_exposure=args.max_exposure,
gateway_backend=args.gateway,
)
await engine.start()
logger.info("=== LIVE %s (%s) backend=%s gateway=%s — Ctrl+C to flatten+stop ===",
args.symbol, args.strategy, args.backend, args.gateway)
try:
while True:
await asyncio.sleep(1)
except KeyboardInterrupt:
logger.info("[ctrl-c] flattening + stopping...")
await engine.flatten()
await engine.stop()
store.close()
def cli():
"""Console-script entry point (wraps the async main)."""
import asyncio
try:
asyncio.run(main())
except KeyboardInterrupt:
pass
if __name__ == "__main__":
cli()