64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
"""
|
|
REAL TRADING EXECUTOR — Only loaded when PAPER_MODE=false.
|
|
|
|
DO NOT MODIFY unless explicitly asked and paper trading thresholds are met:
|
|
- Sharpe Ratio > 0.5 (over 4+ weeks)
|
|
- Win Rate > 52%
|
|
- Calibration Score > 0.7
|
|
- Explicit `make promote` confirmation
|
|
|
|
This file is intentionally minimal until paper trading validates the strategy.
|
|
"""
|
|
import logging
|
|
import os
|
|
from typing import Optional
|
|
|
|
from bot.risk.manager import Order
|
|
from bot.executor.paper import Trade
|
|
from bot.data.db import Database
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class RealExecutor:
|
|
"""
|
|
Real money executor using py-clob-client.
|
|
Requires: POLYMARKET_API_KEY, POLYMARKET_SECRET, POLYMARKET_PASSPHRASE, WALLET_PRIVATE_KEY
|
|
"""
|
|
|
|
def __init__(self, db: Database) -> None:
|
|
# Safety check
|
|
if os.getenv("PAPER_MODE", "true").lower() == "true":
|
|
raise RuntimeError("RealExecutor instantiated while PAPER_MODE=true — this is a bug!")
|
|
|
|
log.critical("REAL EXECUTOR ACTIVE — Real USDC will be spent")
|
|
self._db = db
|
|
self._client = self._init_client()
|
|
|
|
def _init_client(self):
|
|
try:
|
|
from py_clob_client.client import ClobClient
|
|
from py_clob_client.clob_types import ApiCreds
|
|
|
|
host = "https://clob.polymarket.com"
|
|
key = os.getenv("WALLET_PRIVATE_KEY", "")
|
|
chain_id = 137 # Polygon
|
|
|
|
creds = ApiCreds(
|
|
api_key=os.getenv("POLYMARKET_API_KEY", ""),
|
|
api_secret=os.getenv("POLYMARKET_SECRET", ""),
|
|
api_passphrase=os.getenv("POLYMARKET_PASSPHRASE", ""),
|
|
)
|
|
return ClobClient(host, key=key, chain_id=chain_id, creds=creds)
|
|
except ImportError:
|
|
raise ImportError("py-clob-client not installed. Run: pip install py-clob-client")
|
|
|
|
async def execute(self, order: Order) -> Optional[Trade]:
|
|
"""Execute real order on Polymarket CLOB."""
|
|
# TODO: Implement after paper trading phase validates strategy
|
|
# See: https://docs.polymarket.com/developers/clob/examples
|
|
raise NotImplementedError("Real executor not yet implemented — complete paper trading phase first")
|
|
|
|
def get_portfolio(self):
|
|
raise NotImplementedError("Real portfolio tracking not yet implemented")
|