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:
19
trader.py
19
trader.py
@@ -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"])
|
||||||
|
|||||||
Reference in New Issue
Block a user