forked from animatedread/Warrior_EA
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" in8710240yet 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>
25 lines
1.2 KiB
MQL5
25 lines
1.2 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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;
|
|
//--- 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;
|
|
};
|
|
//+------------------------------------------------------------------+
|