From 2015b62104ab8ffdb3038be0dca1b4e258daf596 Mon Sep 17 00:00:00 2001 From: Gahow Wang Date: Sat, 11 Apr 2026 13:32:41 +0800 Subject: [PATCH] Charge 5 CNY per A-share trade via per-market fee table Add MARKET_FEES {us: 2, cn: 5} so the monitor and cron (auto) paths automatically apply the correct local-currency fixed commission without needing a per-strategy override. CLI --fixed-fee still wins when set explicitly for auto; monitor now always resolves from the table so its banner and each strategy sub-call agree. Co-Authored-By: Claude Opus 4.6 --- trader.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/trader.py b/trader.py index 467b3fd..78d7e6b 100644 --- a/trader.py +++ b/trader.py @@ -48,6 +48,16 @@ from strategies.recovery_momentum import RecoveryMomentumStrategy from strategies.trend_following import TrendFollowingStrategy from universe import UNIVERSES +# --------------------------------------------------------------------------- +# Per-market fixed trading fees (per trade, in the market's local currency) +# --------------------------------------------------------------------------- +# These are applied automatically by cmd_monitor and cmd_auto; they can still +# be overridden by explicitly passing --fixed-fee on the CLI. +MARKET_FEES = { + "us": 2.0, # USD per trade + "cn": 5.0, # CNY per trade (A-share minimum commission) +} + # --------------------------------------------------------------------------- # Strategy registry # --------------------------------------------------------------------------- @@ -1088,12 +1098,13 @@ def cmd_monitor(args): print(f" MONITOR MODE — {len(markets)} market(s), " f"{len(strategies)} strategies each") print(f" Capital: ${args.capital:,.0f} | " - f"Fee: ${args.fixed_fee:.2f}/trade | " f"Integer shares: {args.integer_shares}") for mkt, sched in market_schedules.items(): + fee = MARKET_FEES.get(mkt, args.fixed_fee) print(f" {sched['label']}:") print(f" Morning: {sched['morn_h']:02d}:{sched['morn_m']:02d} {sched['tz']}") print(f" Evening: {sched['eve_h']:02d}:{sched['eve_m']:02d} {sched['tz']}") + print(f" Fixed fee: {fee:.2f}/trade") print(f" Strategies: {', '.join(strategies)}") print(f"{'='*60}") @@ -1138,10 +1149,12 @@ def cmd_monitor(args): f"{now_local.strftime('%Y-%m-%d %H:%M:%S %Z')}") print(f"[monitor] {'='*55}") + market_fee = MARKET_FEES.get(market, args.fixed_fee) for strat_name in strategies: sub_args = copy.copy(args) sub_args.strategy = strat_name sub_args.market = market + sub_args.fixed_fee = market_fee print(f"\n[monitor] --- {market.upper()}:{strat_name} ---") try: @@ -1295,8 +1308,10 @@ def cmd_auto(args): integer_shares=args.integer_shares ) + # Fall back to per-market fee when the user didn't explicitly override + fixed_fee = args.fixed_fee if args.fixed_fee > 0 else MARKET_FEES.get(market, 0.0) execute_trades(state, trades, close_prices, - tx_cost=args.tx_cost, fixed_fee=args.fixed_fee, + tx_cost=args.tx_cost, fixed_fee=fixed_fee, trade_date=today_str, integer_shares=args.integer_shares) post_value = portfolio_value(state["holdings"], close_prices, state["cash"])