2025-05-30 16:35:54 +02:00 | | | //+------------------------------------------------------------------+
|
| | | //| Warrior_EA |
|
| | | //| AnimateDread |
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | struct TradeRecord
|
| | | {
|
| | | int year;
|
| | | int month;
|
| | | int day;
|
| | | int day_of_week;
|
| | | int hour;
|
| | | int minutes;
|
| | | string pattern;
|
| | | string direction;
|
| | | double entryPrice;
|
| | | double exitPrice;
|
| | | string result;
|
 fix(db): per-side pattern journaling + versioned journaling semantics
The labelMatchesVote gate compared a single last-writer-wins label
(LongCondition then ShortCondition) against the net vote sign, which
structurally censored the pattern tables: a long event co-occurring
with any short-side state model lost its label to the later writer and
was dropped, while the mirrored short event journaled fine. Ichimoku
models 0/3 and MA model 1 could not produce a row at all by
construction (MA model 1 was "revived" in 8710240 yet still could
never journal - its weight-10 vote is exactly cancelled by the
opposing Pattern_0 state), and every pattern's win rate was measured
on a with-trend-only subset - the exact statistic
UpdateSignalsWeights() feeds back into the weights, self-sealing:
no rows -> no win rate -> default weight -> still censored.
- Direction() now evaluates the two ladders separately and snapshots
each ladder's matched pattern into its own side slot; each side that
matched journals its own row. The flat-vote poisoning the old gate
fixed stays fixed: a label can no longer contradict its side.
- The filter's net vote (raw pattern-weight units) is stored as a new
netVote column - data, never a drop filter. Snapshot is keyed on the
ladder setting a label, not on its weight, so a 0%-win-rate pattern
keeps journaling and can recover.
- SIGNAL_DB_SEMANTICS_VERSION is folded unconditionally into the DB
filename fingerprint: pattern-definition changes (b2069bc, 8710240)
re-key the database instead of blending incompatible Pattern_N
populations under one key, which the input-hash fingerprint cannot
see. 7 months of mixed-semantics rows shared one file because of it.
- dbVersion 2.0 -> 3.0: schema changed, and inserts carry the new
column, so the version-mismatch folder wipe is the migration.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 10:37:57 -04:00 | | | //--- The filter's own net vote (LongCondition - ShortCondition, pattern-weight units) on the bar
|
| | | //--- that journaled this row. Data column only - never a journaling filter (see the per-side
|
| | | //--- journaling comment in CExpertSignalCustom::Direction()). MUST STAY LAST: FetchTradeRecords
|
| | | //--- reads SELECT * via DatabaseReadBind, which maps columns to fields by POSITION.
|
| | | double netVote;
|
2025-05-30 16:35:54 +02:00 | | | };
|
| | | //+------------------------------------------------------------------+
|