forked from animatedread/Warrior_EA
Step 3 of the swing-pivot plan, whole-hog. The swing label is now the ONE target and the era verdict is precision + recall per class against the label's own base rate - no win rate, no break-even, no expectancy, no geometry anywhere in training. DELETED - Expert/Excursion/ (4), Expert/BarrierHorizon/ (4), GeometrySweep, FirstPassageLadder, Labeling/TripleBarrier.mqh (CLabelOverlap survives in Labeling/LabelOverlap.mqh), 3 test EAs. - TripleBarrierLabel + walk, fractal label, geometry derivation/scan/ adoption, exit-policy replay, excursion MI targets, the drift verdict (DIRECTION_INTELLIGENT), the recall floor, balanced-accuracy telemetry, the barrier defines, the .cfg geometry adopt (slots kept as zeros for the positional layout), the derived-geometry live-order override. - TRAINING_TARGET input/enum: direction models are always swing; META2 re-keys the meta head onto label agreement (descriptor loses its two geometry slots). REWORKED - Labels.mqh (1795 -> ~370 lines): AdvanceSwingLabelState with FINALITY-GATED CACHING - an unresolved bar (pivot pair uncommitted) is never cached, so it can never freeze as a false Neutral; training, calibration, OOS scoring and online learning all skip unresolved bars. - SDeployVerdict: significance-only; SOosTally chance = larger directional class share; pooled gate poolability = timeframe (record v2). - Purge/embargo/declustering gaps: the measured mean label resolution lag (LabelResolutionBars), not a barrier horizon. - Pool purge key + backfill DB rows: marked at the bar the label resolved on (m_labelResolveAge), not a fabricated barrier touch. - Online learning frontier: finality, not a horizon delay. - m_bestBalancedOos -> m_bestSelectionScore, m_erasSinceBestBalanced -> m_erasSinceBest, ensemble vote outcome arrays -> label arrays. STEP 4 folded in: Entry_Multiplier / SL_Mode / TP_Mode / tradingdirection are inputs again - trade management is the tester GA's search space. Fingerprints: every direction model re-keys (TGT:SWG1 now unconditional, CUT token gone); META1 -> META2. Full retrain, as planned. Compile-verified in _claude_stage: Warrior_EA + both surviving test EAs, 0 errors, 0 warnings each. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
112 lines
4.9 KiB
MQL5
112 lines
4.9 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Warrior_EA |
|
|
//| AnimateDread |
|
|
//| |
|
|
//| CAIBaseTrainingData bodies - needs the full signal declaration. |
|
|
//+------------------------------------------------------------------+
|
|
#ifndef WARRIOR_TRAINING_AIBASETRAININGDATAIMPL_MQH
|
|
#define WARRIOR_TRAINING_AIBASETRAININGDATAIMPL_MQH
|
|
//+------------------------------------------------------------------+
|
|
//| EVERY METHOD HERE IS A FORWARD, and that is the whole point. |
|
|
//| |
|
|
//| The bounds tests, the sentinels and the "has the gate scored yet" |
|
|
//| rule all live once, next to the data, in the signal's published |
|
|
//| read API. This file only maps that API onto CTrainingDataView, so |
|
|
//| a collaborator can be written, read and replaced without ever |
|
|
//| naming CExpertSignalAIBase. |
|
|
//| |
|
|
//| It holds a BORROWED pointer. The signal owns the adapter, so the |
|
|
//| owner outlives it by construction - but every call still checks, |
|
|
//| because a NULL here would be a silent wrong answer rather than a |
|
|
//| crash, and a diagnostic that quietly reports nothing is worse |
|
|
//| than one that fails loudly. |
|
|
//+------------------------------------------------------------------+
|
|
int CAIBaseTrainingData::HistoryBars(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataHistoryBars() : 0;
|
|
}
|
|
int CAIBaseTrainingData::FeaturesPerBar(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataFeaturesPerBar() : 0;
|
|
}
|
|
int CAIBaseTrainingData::LabelResolutionBars(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataLabelResolutionBars() : 1;
|
|
}
|
|
int CAIBaseTrainingData::PurgeBars(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataPurgeBars() : 0;
|
|
}
|
|
int CAIBaseTrainingData::CalibrationHiIndex(const int totalIter, const int oosCutoff)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID)
|
|
? m_owner.DataCalibrationHiIndex(totalIter, oosCutoff) : 0;
|
|
}
|
|
bool CAIBaseTrainingData::HasLabel(const int bar)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataHasLabel(bar) : false;
|
|
}
|
|
bool CAIBaseTrainingData::IsBuyLabel(const int bar)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataIsBuyLabel(bar) : false;
|
|
}
|
|
bool CAIBaseTrainingData::IsSellLabel(const int bar)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataIsSellLabel(bar) : false;
|
|
}
|
|
bool CAIBaseTrainingData::RowFeatures(const int bar, const int width, double &x[])
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.BaselineRowFeatures(bar, width, x) : false;
|
|
}
|
|
bool CAIBaseTrainingData::DirectionalCall(const int bar, bool &isBuy, double &magnitude)
|
|
{
|
|
isBuy = false;
|
|
magnitude = 0.0;
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataDirectionalCall(bar, isBuy, magnitude) : false;
|
|
}
|
|
string CAIBaseTrainingData::Id(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataId() : "";
|
|
}
|
|
bool CAIBaseTrainingData::IsEnsembleMember(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataIsEnsembleMember() : false;
|
|
}
|
|
int CAIBaseTrainingData::EnsembleIndex(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataEnsembleIndex() : -1;
|
|
}
|
|
bool CAIBaseTrainingData::GateReference(double &precPct, int &calls, double &chancePct)
|
|
{
|
|
precPct = chancePct = -1.0;
|
|
calls = 0;
|
|
return (CheckPointer(m_owner) != POINTER_INVALID)
|
|
? m_owner.DataGateReference(precPct, calls, chancePct) : false;
|
|
}
|
|
double CAIBaseTrainingData::EffectiveSampleSize(const double rawN)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.DataEffectiveSampleSize(rawN) : rawN;
|
|
}
|
|
bool CAIBaseTrainingData::Stopping(void)
|
|
{
|
|
return (CheckPointer(m_owner) != POINTER_INVALID) ? m_owner.ShutdownRequested() : true;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| One feature window into a plain double[] - the shape both Alglib |
|
|
//| predictors take. Fails exactly where the net's own path fails. |
|
|
//+------------------------------------------------------------------+
|
|
bool CExpertSignalAIBase::BaselineRowFeatures(const int bar, const int width, double &x[])
|
|
{
|
|
if(!BuildFeatureWindow(bar) || TempData.Total() < width)
|
|
return false;
|
|
for(int f = 0; f < width; f++)
|
|
{
|
|
double v = TempData.At(f);
|
|
if(!MathIsValidNumber(v))
|
|
return false;
|
|
x[f] = v;
|
|
}
|
|
return true;
|
|
}
|
|
#endif // WARRIOR_TRAINING_AIBASETRAININGDATAIMPL_MQH
|
|
//+------------------------------------------------------------------+
|