diff --git a/README.md b/README.md new file mode 100644 index 0000000..553765a --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# Multi-Currency Spot Trader (OKX + TA + Optional DeepSeek) + +A pragmatic, menu-driven spot trading system for OKX. +It fetches market data, computes robust technical signals, optionally blends an AI opinion, sizes positions under strict risk constraints, and executes market orders with dynamic trailing stops and full state persistence. + +## Features + +- **OKX official SDK** spot trading (market orders) +- **Technical stack**: RSI/KDJ/MACD/Bollinger/ATR/MA/Stochastic + reversal detectors +- **Decisioning**: TA weighted score + (optional) DeepSeek AI JSON action +- **Risk control**: max portfolio allocations, fixed SL/TP, **trailing stops** that ratchet up +- **Persistence**: SQLite for positions, trades, trailing stop state +- **Multi-symbol orchestration** with a simple CLI control panel + +## Project layout + +``` +apiratelimiter.py # tiny per-API rate limiter +database_manager.py # SQLite schema + CRUD for positions/trades/dynamic stops +deepseekanalyzer.py # optional AI integration (BUY/SELL/HOLD + sell proportion) +multistrategyrunner.py # threads per symbol, lifecycle, status +okxapiclient.py # OKX SDK wrapper: candles, prices, balances, orders +okxtrading2.0.py # CLI entrypoint (menu) +riskmanager.py # portfolio sizing, limits, trailing parameters +technicalanalyzer.py # indicators, signals, reversal detectors +tradingstrategy.py # analysis→decision matrix→execution loop per symbol +``` + +## Requirements + +- Python 3.10+ +- Packages: `okx` (official SDK), `pandas`, `numpy`, `python-dotenv` (optional), plus stdlib. +- An OKX API key with **trading permissions** for **spot**. + > By default `tdMode` is set to `"cross"` and instruments are fetched with `instType='SPOT'`. + +## Quick start + +1) **Install deps** + +```bash +python -m venv .venv && source .venv/bin/activate +pip install okx pandas numpy python-dotenv +``` + +2) **Set environment variables** + +Create `.env` (or export in your shell): + +```dotenv +# OKX (required) +OKX_API_KEY=... +OKX_SECRET_KEY=... +OKX_PASSWORD=... + +# Optional AI +DEEPSEEK_API_KEY=... + +# Risk/sizing (defaults shown) +MAX_TOTAL_POSITION=1 # 100% portfolio cap +MAX_SINGLE_POSITION=0.3 # 30% per symbol cap +STOP_LOSS=0.05 # fixed SL 5% +TAKE_PROFIT=0.15 # fixed TP 15% +TRAILING_STOP_PERCENT=0.03 # 3% trail width +MONITOR_INTERVAL=300 # seconds between trail checks +DB_PATH=trading_system.db # sqlite path +``` + +3) **Run the control panel** + +```bash +python okxtrading2.0.py +``` + +You’ll see a menu: + +- `Start All Strategies` — launch threads for all configured symbols +- `Start/Stop Specific Strategy` — control a single market +- `View System Status` — running flags, active symbols, stored positions +- `Manual Position Sync` — reconcile on-exchange balances to local state +- `Toggle Debug Mode` — echo OKX HTTP call codes + +## How it trades (in one pass) + +1. **Market data**: fetch latest candles for the symbol (`1H` by default). +2. **Indicators**: compute RSI/KDJ/MACD/BB/ATR/MA/Stochastic and reversal hints. +3. **Signals**: produce a weighted TA score and optional **DeepSeek** action. +4. **Decision matrix**: combine AI, TA, support/resistance, market state into a total score → `BUY/SELL/HOLD` + confidence. +5. **Sizing & risk**: compute size from portfolio constraints and market context (vol/trend/USDT ratio). +6. **Execution**: + - `BUY`: market buy using **quote amount (USDT)**; respects exchange **minSz**. + - `SELL`: market sell using **base amount**; optional AI estimates a **sell proportion** (with sensible fallbacks). +7. **Stops & persistence**: + - Save position/trades to **SQLite**. + - Set/ratchet **trailing stop** (and a symmetric dynamic take-profit band). + - Background monitor checks triggers every `MONITOR_INTERVAL` seconds. + +## Configuration + +- **Symbols & cadence**: edit `symbol_configs` in `multistrategyrunner.py`: + ```python + 'ETH-USDT': {'name': 'Ethereum', 'interval': 1800, 'timeframe': '1H'} + ``` +- **Risk knobs**: tweak env vars in `.env` (caps, SL/TP, trailing %). +- **Database**: change `DB_PATH` to relocate the SQLite file. + +## Operational notes + +- **AI is optional**: if `DEEPSEEK_API_KEY` is missing, system runs purely on TA with deterministic fallbacks. +- **Min trade sizes**: on buy, system checks if `estimated_base_amount >= minSz`; on sell, blocks dust/too-small partials. +- **Graceful shutdown**: Ctrl-C or menu exit triggers strategy/thread stops and monitor shutdown; state is persisted. diff --git a/tradingstrategy.py b/tradingstrategy.py index 861e8ef..e7264b2 100644 --- a/tradingstrategy.py +++ b/tradingstrategy.py @@ -480,6 +480,9 @@ class TradingStrategy: logger.info(f"[{self.symbol}] Buy successful: quantity={fill_amount:.10f}, price=${fill_price:.2f}") logger.info(f"[{self.symbol}] Updated position: {self.symbol.split('-')[0]}={self.base_amount:.10f}") + # Save trade record + self.db.save_trade_record(self.symbol, 'buy', fill_amount, fill_price, order_id) + # Sync exchange position self.sync_with_exchange()