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 <noreply@anthropic.com>
This commit is contained in:
2026-04-11 13:32:41 +08:00
parent b2176b0c3e
commit 2015b62104

View File

@@ -48,6 +48,16 @@ from strategies.recovery_momentum import RecoveryMomentumStrategy
from strategies.trend_following import TrendFollowingStrategy from strategies.trend_following import TrendFollowingStrategy
from universe import UNIVERSES 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 # Strategy registry
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -1088,12 +1098,13 @@ def cmd_monitor(args):
print(f" MONITOR MODE — {len(markets)} market(s), " print(f" MONITOR MODE — {len(markets)} market(s), "
f"{len(strategies)} strategies each") f"{len(strategies)} strategies each")
print(f" Capital: ${args.capital:,.0f} | " print(f" Capital: ${args.capital:,.0f} | "
f"Fee: ${args.fixed_fee:.2f}/trade | "
f"Integer shares: {args.integer_shares}") f"Integer shares: {args.integer_shares}")
for mkt, sched in market_schedules.items(): for mkt, sched in market_schedules.items():
fee = MARKET_FEES.get(mkt, args.fixed_fee)
print(f" {sched['label']}:") print(f" {sched['label']}:")
print(f" Morning: {sched['morn_h']:02d}:{sched['morn_m']:02d} {sched['tz']}") 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" 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" Strategies: {', '.join(strategies)}")
print(f"{'='*60}") print(f"{'='*60}")
@@ -1138,10 +1149,12 @@ def cmd_monitor(args):
f"{now_local.strftime('%Y-%m-%d %H:%M:%S %Z')}") f"{now_local.strftime('%Y-%m-%d %H:%M:%S %Z')}")
print(f"[monitor] {'='*55}") print(f"[monitor] {'='*55}")
market_fee = MARKET_FEES.get(market, args.fixed_fee)
for strat_name in strategies: for strat_name in strategies:
sub_args = copy.copy(args) sub_args = copy.copy(args)
sub_args.strategy = strat_name sub_args.strategy = strat_name
sub_args.market = market sub_args.market = market
sub_args.fixed_fee = market_fee
print(f"\n[monitor] --- {market.upper()}:{strat_name} ---") print(f"\n[monitor] --- {market.upper()}:{strat_name} ---")
try: try:
@@ -1295,8 +1308,10 @@ def cmd_auto(args):
integer_shares=args.integer_shares 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, 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) trade_date=today_str, integer_shares=args.integer_shares)
post_value = portfolio_value(state["holdings"], close_prices, state["cash"]) post_value = portfolio_value(state["holdings"], close_prices, state["cash"])