forked from animatedread/Warrior_EA
FeedForwardConv emits POSITION-MAJOR output, matrix_o[out + window_out * i],
so one bar's window_out filter responses are contiguous and consecutive bars
sit window_out apart. Both pooling implementations (FeedForwardProof and
CPU_FeedForwardProof) slide FLAT over that buffer - pos = i * step, reducing
`window` CONSECUTIVE elements. On a position-major layout those neighbours
are different FILTERS of the same bar, never one filter across time.
At the shipped 3/2 the pool computed max(bar0_f0, bar0_f1, bar0_f2), then
max(bar0_f2, bar0_f3, bar0_f4), with every 8th window straddling a bar
boundary. So it collapsed unrelated feature detectors into whichever fired
hardest, passed gradient to that winner only, and halved the feature map
while doing it - all below every learnable layer, where nothing above can
recover it. The removed inputs' own labels ("3 Bars") show time-axis pooling
was the intent throughout.
Measured cost: CONV sat pinned at ~40% balanced accuracy for 510 eras with
Sell recall 0%, while plain MLPs on the same data reached 57-61%. HYBRID,
which also carried this stage, came second-worst of the batch-norm group.
Not fixable in the topology: pooling one filter across time needs a stride
of window_out BETWEEN samples within a window, which a consecutive-window
kernel cannot express at any window/step. That needs a stride-aware kernel
in Network.cl + WarriorCPU.cpp + WarriorDML.cpp and a DLL rebuild, and is
only worth doing if a conv front-end earns its place without downsampling
first - with 20 sliding positions there is little to gain by halving them.
ConvPoolWindow/ConvPoolStep and their enums are removed with it, along with
the |CP: fingerprint term added earlier today.
Both builds compile 0 errors, 0 warnings.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
No EOL
3.1 KiB
MQL5
58 lines
No EOL
3.1 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Warrior_EA |
|
|
//| AnimateDread |
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include "..\Expert\ExpertSignalAIBase.mqh"
|
|
// wizard description start
|
|
//+------------------------------------------------------------------+
|
|
//| Description of the class |
|
|
//| Title=Signals of indicator 'CNN-LSTM AI' |
|
|
//| Type=SignalAdvanced |
|
|
//| Name=CNN-LSTM AI |
|
|
//| ShortName=HYB |
|
|
//| Class=CSignalHYBRID |
|
|
//| Page=signal_hybrid |
|
|
//+------------------------------------------------------------------+
|
|
// wizard description end
|
|
//+------------------------------------------------------------------+
|
|
//| Class CSignalHYBRID. |
|
|
//| Purpose: a single fused CNN-LSTM signal that stacks Conv+Pool |
|
|
//| layers before the LSTM layer, then the shared dense taper. |
|
|
//| The base AI voting path still applies, so this module trades as |
|
|
//| one coherent signal instead of three loosely synchronized ones. |
|
|
//+------------------------------------------------------------------+
|
|
class CSignalHYBRID : public CExpertSignalAIBase
|
|
{
|
|
protected:
|
|
virtual bool AddCustomLayers(CArrayObj *topology) override;
|
|
virtual ENUM_ACTIVATION HiddenLayerActivation(void) override { return TANH; }
|
|
public:
|
|
CSignalHYBRID(void);
|
|
virtual bool InitIndicators(CIndicators *indicators) override;
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Constructor |
|
|
//+------------------------------------------------------------------+
|
|
CSignalHYBRID::CSignalHYBRID(void)
|
|
{
|
|
SetIdentity("Hybrid", "HYB");
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Create indicators and bootstrap/load the network. |
|
|
//+------------------------------------------------------------------+
|
|
bool CSignalHYBRID::InitIndicators(CIndicators *indicators)
|
|
{
|
|
return InitNeuralNetwork(indicators);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Conv + Pool front-end followed by an LSTM sequence layer. This |
|
|
//| matches the standalone CONV front-end exactly, then adds LSTM. |
|
|
//+------------------------------------------------------------------+
|
|
bool CSignalHYBRID::AddCustomLayers(CArrayObj *topology)
|
|
{
|
|
//--- "the standalone CONV front-end exactly, then adds LSTM" is now enforced by construction:
|
|
//--- both stages are the same code CSignalCONV and CSignalLSTM run.
|
|
return AddConvStage(topology) && AddLstmStage(topology);
|
|
}
|
|
//+------------------------------------------------------------------+ |