Skip to content

Commit 5ed5b62

Browse files
authored
Merge pull request #13 from JohnCCarter/feature/mtf-behavior-research
MTF multi-leg labeling and behavior facit v3 (research)
2 parents eade139 + 967a224 commit 5ed5b62

82 files changed

Lines changed: 6325 additions & 228 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,17 @@ __marimo__/
218218
.streamlit/secrets.toml
219219

220220
# --- Fibonacci-engine projekt-specifikt ---
221+
# Ephemeral markdown for `gh issue create` / `gh pr edit --body-file` (not project docs)
222+
.gh-*.md
221223
tmp/
222224
# Cachad marknadsdata och referensbilder versioneras inte.
223225
data/raw/
224226
data/screenshots/
225227
# Per-körning audit-mappar versioneras inte (artefakter, inte källa).
226228
# experiments/results/*.jsonl och experiments/label_review/ versioneras (default).
229+
# Timestamped per-run snapshots (not append-only ledgers):
230+
experiments/results/mtf_*.json
231+
experiments/results/*_compare_*T*.json
227232
experiments/runs/
228233
# Genererade human-review-paket (charts/sheets) är artefakter, inte källa.
229234
experiments/review/

.pre-commit-config.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ repos:
1111

1212
- repo: local
1313
hooks:
14+
- id: repo-bounds
15+
name: repo bounds (anti-blob / module size)
16+
entry: uv run python scripts/check_repo_bounds.py
17+
language: system
18+
pass_filenames: true
1419
- id: pytest
1520
name: pytest
1621
entry: uv run pytest -q

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ZigZag-Fib. Den väljer swingar, ritar Fib automatiskt och förbättras iterativ
1212
> Premortem/reflektion är obligatoriskt: se `premortem/` och `REPO_POLICY.md` §11.
1313
> Spårmodell: se `docs/TRACKS.md` (Research / Validate / Promotion).
1414
> Backtest-roadmap: [`docs/FIB_BACKTEST_PLAN.md`](docs/FIB_BACKTEST_PLAN.md).
15+
> Bitfinex / Genesis validate: [`docs/GENESIS_BITFINEX_VALIDATE.md`](docs/GENESIS_BITFINEX_VALIDATE.md).
1516
> Arkiv (legacy/dubletter): [`archive/`](archive/README.md).
1617
1718
## Filosofi
@@ -126,6 +127,9 @@ leg än en ritning är det en signal att undersöka, inte automatiskt ett fel.
126127

127128
### Maskin-labeling (kandidater, inte facit)
128129

130+
Två giltiga frågor (motor-swing vs synligt chartfönster) — se
131+
[`docs/MACHINE_LABELING.md`](docs/MACHINE_LABELING.md).
132+
129133
`labeling/autolabel.py` kan generera **provisoriska** swing-kandidater
130134
(`source="machine"`) från motorns eget urval, så att du slipper börja från ett
131135
tomt chart. Tre hårda regler skyddar facit-integriteten:

REPO_POLICY.md

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Allt nytt arbete ska följa indexet nedan. Fungerar något annorlunda i praktike
2525
| `tmp/` | Tillfälliga skript/artefakter | Valfritt (se §9) |
2626

2727
Toppnivån ska bara innehålla: `README.md`, `REPO_POLICY.md`, `pyproject.toml`,
28-
`uv.lock`, `.gitignore`, och dessa mappar. **Inga stub-filer** som bara pekar
28+
`uv.lock`, `.gitignore`, `.pre-commit-config.yaml` (lokal hook-kedja), och dessa mappar. **Inga stub-filer** som bara pekar
2929
bort flyttat innehåll — uppdatera länkar till canonical path (t.ex. `docs/FIB_BACKTEST_PLAN.md`).
3030
Tillfälliga filer läggs i `tmp/`.
3131

@@ -83,6 +83,51 @@ Varje modul ska ha ett tydligt ansvar. Inga “utils.py” utan kategori.
8383
| `experiment.py` | Standardrunner som loggar till `experiments/runs/` |
8484
| `core/logging_conf.py` | Loguru-setup |
8585

86+
## 2B. Modulstorlek, ansvar och anti-blob (MÅSTE)
87+
88+
Undvik **monolitiska moduler** (en fil som gör för många saker) och **blobs**
89+
(stora klumpiga filer utan tydlig struktur). En fil ska ha **en huvudorsak att ändras**.
90+
91+
### Principer
92+
93+
- **Ett ansvar per modul** — följ tabellen i §2; dela om en fil både CLI, domänlogik
94+
och GUI i samma modul utan tydlig gräns.
95+
- **Inga generiska `utils.py`** — namnge efter domän (`store.py`, `stability.py`, …).
96+
- **Tunna entrypoints**`experiment.py`, `runner.py`, `autolabel.py` ska orkestrera;
97+
tung logik i paket undermappar.
98+
- **Data ≠ dokumentation** — rå metrics i `experiments/results/*.jsonl`; guider i `docs/`;
99+
korta beslut i `premortem/reflections/`.
100+
101+
### Storleksgränser (verkställs i pre-commit)
102+
103+
| Mönster | Max rader | Max storlek | Kommentar |
104+
|---------|-----------|-------------|-----------|
105+
| `premortem/reflections/*.md` | 80 | 8 KiB | utom `INDEX.md`, `README.md` |
106+
| `src/fibengine/**/*.py` | 400 | 25 KiB | ny kod ska ligga under gränsen |
107+
| `tests/**/*.py` | 250 | 15 KiB | |
108+
| `docs/**/*.md` | 200 | 20 KiB | längre innehåll → flera docs-filer |
109+
| `scripts/*.py` | 120 | 8 KiB | |
110+
111+
Kör lokalt: `uv run python scripts/check_repo_bounds.py`
112+
113+
### Känd skuld (får inte växa)
114+
115+
| Fil | Rader (ca) | Plan |
116+
|-----|------------|------|
117+
| `src/fibengine/labeling/tool.py` | ~595 | Dela workspace / plot / CLI — grandfather tills split |
118+
| `src/fibengine/labeling/behavior_facit.py` | ~530 | Dela I/O vs validate — grandfather tills split |
119+
| `scripts/behavior_facit.py` | ~220 | Tunn CLI-wrapper — grandfather tills split |
120+
| `scripts/compare_mtf_disambiguation.py` | ~245 | Dela argparse vs report — grandfather tills split |
121+
| `src/fibengine/research/human_review_level_events.py` | ~610 | Dela pack writer vs runner — grandfather (main PR #11) |
122+
123+
Lägg **inte** till funktioner i grandfathered filer; fixa genom split.
124+
125+
### När ska du dela?
126+
127+
- Modul över gränsen **och** inte på grandfather-listan.
128+
- Flera orelaterade klasser eller `if __name__` + stor GUI i samma fil.
129+
- Du kan inte beskriva filens ansvar i en mening.
130+
86131
## 3. Namnkonventioner
87132

88133
- **Filer i kod:** `snake_case.py`.
@@ -254,18 +299,30 @@ Premortem-tänk och reflektion är en **obligatorisk del** av arbetsflödet.
254299
ny backtest-matris) ska minst en reflektion skrivas i
255300
`premortem/reflections/`.
256301
3. Filnamn i `premortem/reflections/` **MÅSTE** följa:
257-
`YYYY-MM-DD-<kort-beskrivning>.md`
258-
4. Reflektionen **MÅSTE** innehålla:
302+
`YYYY-MM-DD-<kort-beskrivning>.md` (eller `premortem/reflections/YYYY/` när årsindelning
303+
är aktiv — se `premortem/reflections/README.md`).
304+
4. **INDEX:** Nya reflektioner ska listas i `premortem/reflections/INDEX.md` (en rad:
305+
datum, fil, typ, ämnen, status).
306+
5. Reflektionen **MÅSTE** innehålla:
259307
- Hypotes
260308
- Scope (symbol/timeframe/data)
261309
- Observationer (nyckelmetrics)
262310
- Beslut
263311
- Nästa steg
312+
6. **Storlek (MÅSTE):** varje fil i `premortem/reflections/*.md` (utom `INDEX.md`/`README.md`)
313+
är **≤ 80 rader** och **≤ 8 KiB**. Detaljer → `docs/` eller `experiments/results/`.
314+
Pre-commit hook `repo-bounds` verkställer detta (samma regler som §2B för kod/docs).
264315

265316
### Miniminivå per vecka
266317

267318
- Minst **en** ny reflektion per aktiv vecka där experiment körs.
268319

320+
### Skalning
321+
322+
När `reflections/` växer: följ `premortem/reflections/README.md` (flat + INDEX → års-mappar
323+
→ arkiv för `historical`). Djupare guider (t.ex. maskin-labeling) i `docs/`, inte som
324+
långa reflektioner.
325+
269326
## 12. Skriva på policyn
270327

271328
Policyn ändras genom att uppdatera den här filen direkt. Vid större ändringar i

config/README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ Konfiguration för körningar.
99

1010
Baseline:
1111

12-
- `settings.yaml` är baseline och ska hållas stabil.
12+
- `settings.yaml` är baseline (`exchange: bitfinex`, USD-par) och ska hållas stabil.
1313
- Experiment ska i första hand köras med `--config config/variants/<fil>.yaml`.
1414

15+
Bitfinex / Genesis validate:
16+
17+
- `settings.bitfinex.yaml` — samma som baseline (explicit profil för Genesis-dok).
18+
- Körordning och symbol-mappning: [`docs/GENESIS_BITFINEX_VALIDATE.md`](../docs/GENESIS_BITFINEX_VALIDATE.md).
19+
1520
Spårkoppling:
1621

1722
- `settings.yaml` = **Promotion** (canonical baseline).

config/settings.bitfinex.yaml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Bitfinex / Genesis-Core validate-profil (Research — ändrar INTE baseline).
2+
#
3+
# Samma pivot/scoring/backtest-gates som config/settings.yaml; endast data-källan
4+
# pekar på Bitfinex (CCXT) för att repetera Validate innan inport i Genesis-Core.
5+
#
6+
# Se docs/GENESIS_BITFINEX_VALIDATE.md för symbol-mappning och körordning.
7+
8+
seed: 42
9+
10+
data:
11+
exchange: bitfinex # CCXT exchange-id (paper/live via Genesis — samma OHLCV-semantik)
12+
symbol: BTC/USD # Bitfinex spot (inte USDT); justera mot er Genesis-paper-lista
13+
timeframe: 1h
14+
limit: 500
15+
timeframe_limits:
16+
4h: 1000
17+
1d: 1000
18+
1w: 1000
19+
1M: 500
20+
21+
pivots:
22+
lookback: 3
23+
atr_period: 14
24+
min_prominence_atr: 0.5
25+
mode: fractal
26+
fractal_n: 1
27+
28+
scoring:
29+
weights:
30+
magnitude: 0.8
31+
recency: 0.6
32+
prominence: 0.5
33+
cleanliness: 0.9
34+
round_number: 0.2
35+
duration: -0.4
36+
structure_alignment: 1.4
37+
scale_confluence: 1.2
38+
duration_target: 20
39+
max_candidate_legs: 50
40+
structure_window: 6
41+
confluence_degrees: [5, 12]
42+
confluence_tol_bars: 3
43+
confirm_min_retrace: 0.1
44+
45+
fib:
46+
levels: [0.236, 0.382, 0.5, 0.618, 0.786]
47+
48+
evaluation:
49+
price_tol_atr: 0.5
50+
time_tol_bars: 3
51+
fib_level_tol: 0.02
52+
53+
sizing:
54+
enabled: false
55+
entry_levels: [0.382, 0.5, 0.618]
56+
sizes: [1.0, 2.0, 3.0]
57+
58+
backtest:
59+
warmup_bars: 60
60+
step: 1
61+
extension_tol_bars: 5
62+
gate_max_flip_rate: 0.35
63+
gate_min_confirmed_rate: 0.5
64+
gate_min_direction_consistency: 0.8
65+
gate_max_endpoint_drift_bars: 40.0

config/settings.yaml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
seed: 42
33

44
data:
5-
exchange: binance # CCXT exchange-id
6-
symbol: BTC/USDT
5+
exchange: bitfinex # CCXT exchange-id (Binance geo-blocked on some CI/cloud hosts)
6+
symbol: BTC/USD # Bitfinex spot (USD, not USDT)
77
timeframe: 1h
88
limit: 500 # antal candles att hämta (default per timeframe)
99
timeframe_limits: # override för långa TF så äldre labels inte hamnar out-of-window
@@ -52,6 +52,12 @@ sizing:
5252
entry_levels: [0.382, 0.5, 0.618] # skala in i dessa retracement-nivåer
5353
sizes: [1.0, 2.0, 3.0] # störst storlek i gyllene zonen (0.618)
5454

55+
labeling:
56+
# Research: 1W label med H+L på samma vecka → resolve via 1D (labeling.tool save).
57+
enable_same_candle_mtf_resolution: true
58+
# Research: motor MTF Disambiguation Layer (OFF = baseline; ON = läs LTF-ordning).
59+
mtf_disambiguation: false
60+
5561
backtest:
5662
# Kausalt walk-forward: mät hur stabilt urvalet är över tid (Lager A).
5763
warmup_bars: 60 # barer innan första urvalet

data/labels/README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ labels/
1212
{timeframe}.json
1313
```
1414

15-
Exempel: `binance/BTC-USDT/1h.json`
15+
Exempel (ny default): `bitfinex/BTC-USDT/1h.json`
16+
Legacy research-facit: `binance/` (Binance-perioden, behålls oförändrat).
1617

1718
## Index
1819

1920
- `INDEX.md` — tabell över alla labels (path, exchange, symbol, timeframe).
2021
- `binance/README.md` — översikt per börs.
2122

22-
Labels skrivs via `uv run python -m fibengine.labeling.tool`.
23+
Labels skrivs via `uv run python -m fibengine.labeling.tool` (begränsningar: [`docs/LABELING_TOOL.md`](../docs/LABELING_TOOL.md)).
2324

2425
Kör `uv run python -m fibengine.labeling.worklist` för att se täckning mot
2526
20–30-setup-målet (PREMORTEM.md) och få färdiga `labeling.tool`-kommandon för de
@@ -32,4 +33,18 @@ Varje label har ett `source`-fält:
3233
från recall/agreement och räknas inte mot 20–30-målet. Granska i `labeling.tool`
3334
och spara → blir `human`.
3435

36+
**Två giltiga typer av maskin-svar** (motor-swing vs chartfönster): [`docs/MACHINE_LABELING.md`](../docs/MACHINE_LABELING.md).
37+
3538
Legacy platt filnamn (`binance_BTC-USDT_1h.json` på rot) stöds fortfarande vid läsning men nya sparas i kategoriserad struktur.
39+
40+
## Multi-leg (research, 1d+)
41+
42+
Flera fib-legs i **samma** fil när du märker ned + upp (eller fler segment) på daily:
43+
44+
- Spara via labeling tool: `p` (push leg), sedan `s` — se [LABELING_TOOL.md](../docs/LABELING_TOOL.md) §5B.
45+
- JSON får `"legs": [ { "id": "leg_1", "high": ..., "low": ... }, ... ]`.
46+
- Top-level `high`/`low` = leg_1 (bakåtkompatibilitet för motor/recall idag).
47+
48+
**Exempel:** `binance/BTC-USDT/1d.json` — 30 legs (BTC HUR-facit, 2026-05-29).
49+
50+
**Motor använder inte** `legs[]` än — endast research/golden. Se [MTF_DAILY_RESEARCH.md](../docs/MTF_DAILY_RESEARCH.md).

0 commit comments

Comments
 (0)