-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathconfig.paperforward.yaml
More file actions
149 lines (133 loc) · 6.04 KB
/
Copy pathconfig.paperforward.yaml
File metadata and controls
149 lines (133 loc) · 6.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# keel runtime configuration.
#
# These are Phase 1 placeholders (spec §21 open item) — no live orders are placed in Phase 1.
# `allowlist` and `caps` are required and validated by keel.config.load_config; missing or
# invalid values raise ConfigError naming the offending key rather than silently defaulting.
allowlist:
- BTC
- ETH
- PAXG
- SOL
- XLM
- LTC
- ADA
- LINK
target_weights:
BTC: 0.30
ETH: 0.20
PAXG: 0.20
SOL: 0.06
XLM: 0.06
LTC: 0.06
ADA: 0.06
LINK: 0.06
risk_pct: 0.01
caps:
# max_per_order_usd / max_per_day_usd are OPTIONAL internal RISK limits, not real Coinbase
# limits -- Coinbase One's only subscription constraint is monthly fee-free trading VOLUME
# (see `subscription:` below). They default to a non-binding $1B when omitted (Issue #85);
# set explicit values here only if you want an extra per-order/per-day risk ceiling tighter
# than the exposure/concentration caps below. Left at their non-binding default here so
# risk-sized rule orders ($400-24k typical) aren't silently rejected.
max_exposure_usd: 5000
max_per_asset_pct: 0.50
market_data:
granularities:
- ONE_DAY
- ONE_HOUR
- FIFTEEN_MINUTE
history_days: 365
auto_trade:
mode: paper
# NOTE: currently UNUSED by any code path -- it is NOT a kill-switch and setting it
# true or false changes nothing. Use `keel kill` to halt trading.
enabled: false
interval_sec: 900
promotion:
min_trades: 100
min_expectancy: 0.0
min_rr: 1.5
min_win_rate: 0.55
money_mgmt:
profit_trigger_pct: 0.10
acceleration_pct: 0.05
max_total_dd_pct: 0.20
max_weekly_dd_pct: 0.08
# Rail 16 (consecutive-loss breaker) — DISABLED by default (0 = off).
# Set from a backtest sweep, and set it ABOVE the strategy's tested max losing streak:
# turtle_breakout's max streak is 5, so a threshold of 3 would fire on normal variance.
max_consecutive_losses: 0
streak_cooloff_days: 0
dca:
budget_usd: 50
cadence_days: 7
paper:
# 0 = seed from REAL broker mark-to-market equity (keel/agent.py:499). Changed from a
# synthetic $10k (#426), for the same reason as the hourly profile and kept identical to it
# because `test_config_universe_is_a_deliberate_superset_of_paperforward` asserts the two
# paper blocks are equal -- the profiles are meant to differ in CADENCE and nothing else.
#
# A synthetic account larger than the real one makes a paper profile propose orders the real
# deployment could never fund. Rail 14 caps monthly buy notional at the venue's fee-free
# allowance ($500 at the attested Basic tier), and that allowance is inherited from the REAL
# account whatever the synthetic equity says. At $10k synthetic and the measured 13.86%
# median daily stop, f_N = 0.07 gives ~$722 per trade -- 1.4x the whole monthly allowance.
starting_equity_usd: 0
monthly_contribution_usd: 500 # $500/mo contribution during the paper-forward
# The settlement currency this deployment TRADES IN. It must match the quote leg of the
# products you actually trade: everything here is `-USD` (see `_default_sim_products` /
# `_history_product`), so this is USD. It is NOT used to decide which balance funds a given
# order -- that comes from the product itself (`quote_currency_of`), because BTC-USD spends USD
# whatever this says. Used to screen candidates and to exclude the settlement balance from
# `keel assets holdings`.
quote_currency: USD
subscription:
# The SIMULATOR's assumed fee-free monthly volume. The LIVE rail-14 cap is not set here --
# it comes from the attested record: `keel subscription attest --venue coinbase --tier <t>`.
assumed_free_volume_usd: 500
# What rail 14 permits on a venue that is unattested, suspect, lapsed, or overdue.
# 0 means such a venue cannot buy at all until it is attested.
unsubscribed_allowance_usd: 0
pacing: opportunistic # opportunistic (monthly cap only) | even_daily (also paces per business day)
# Coinbase One subscription tiers (Issue #86) -- fee-free monthly TRADING VOLUME (buys + sells)
# allowance per tier, used by `keel simulate`'s tier/fee analysis matrix to compare staying
# within a tier's free volume (throttled, 0 trading fees, but you still pay the subscription)
# against trading freely and paying the taker fee on volume EXCEEDING it.
# free_volume_usd: null means unlimited (Premium -- always fee-free, no cap to exceed).
tiers:
- name: Basic
free_volume_usd: 500
subscription_usd_month: 4.99
- name: Preferred
free_volume_usd: 10000
subscription_usd_month: 29.99
- name: Premium
free_volume_usd: null
subscription_usd_month: 299.99
# Coinbase Advanced trading fees applied to volume beyond a tier's free allowance, for a
# <$1k-30d-volume account (Coinbase's published fee schedule). taker_pct is the sim's default --
# it fills market-style at next-bar open; maker_pct is exposed for a caller that wants to model
# limit-order fills instead.
fees:
taker_pct: 0.012
maker_pct: 0.006
# Engine-activity logging. verbose=false (default) means only errors/exceptions are ever logged
# (the "keel" logger stays at ERROR level); set verbose: true (or `keel -v`) to also log major
# operations/decisions (INFO level) -- cycle starts, signals, guard vetoes, order outcomes, etc.
# file_count is the TOTAL number of files kept (the active log + rotated backups), each capped
# at max_file_mb.
# verbose: true since 2026-07-29. With it off, a cycle reporting `signals=0` said nothing about
# WHY -- engine.no_signal and engine.setup_rejected are INFO events, so answering "why no order
# today?" meant replaying the rules against the database by hand. One cycle a day over 5 products
# is a trivial amount of INFO, and rotation is bounded at max_file_mb x file_count anyway.
logging:
verbose: true
file: logs/keel.log
max_file_mb: 25
file_count: 5
# G4 overfitting gate (KB §78). NEVER tune these to obtain a desired verdict -- doing so is
# the exact Strathern misuse the gate exists to prevent (§78.7). slope_floor is calibrated
# from §78.8's worked cases: real strategy -0.35, pure random walk -0.61, overfit -0.75.
research:
pbo_max: 0.05
slope_floor: -0.5