//+------------------------------------------------------------------+
//|                                                           03.mq5 |
//|                                  Copyright 2026, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\Custom\SignalHMMGRU.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedMargin.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string Expert_Title                      = "03";       // Document name
ulong        Expert_MagicNumber                = -1546209308; //
bool         Expert_EveryTick                  = false;      //
//--- inputs for main signal
input int    Signal_ThresholdOpen              = 10;         // Signal threshold value to open [0...100]
input int    Signal_ThresholdClose             = 10;         // Signal threshold value to close [0...100]
input double Signal_PriceLevel                 = 0.0;        // Price level to execute a deal
input double Signal_StopLevel                  = 50.0;       // Stop Loss level (in points)
input double Signal_TakeLevel                  = 50.0;       // Take Profit level (in points)
input int    Signal_Expiration                 = 4;          // Expiration of pending orders (in bars)
input int    Signal_HMMGRU_ADXPeriod           = 14;         // HMM GRU(14,14,0,true,80,6,...) ADX averaging period
input int    Signal_HMMGRU_ATRPeriod           = 14;         // HMM GRU(14,14,0,true,80,6,...) ATR averaging period
input int    Signal_HMMGRU_SignalMode          = 0;          // HMM GRU(14,14,0,true,80,6,...) Signal mode from 0 through 6
input bool   Signal_HMMGRU_UseGRU              = true;       // HMM GRU(14,14,0,true,80,6,...) Confirm algorithm entries with GRU
input int    Signal_HMMGRU_HMMWindow           = 80;         // HMM GRU(14,14,0,true,80,6,...) HMM rolling observation window
input int    Signal_HMMGRU_HMMIterations       = 6;          // HMM GRU(14,14,0,true,80,6,...) Baum-Welch iterations
input double Signal_HMMGRU_MinRegimeProbability = 0.50;      // HMM GRU(14,14,0,true,80,6,...) Minimum regime posterior
input double Signal_HMMGRU_TrendADXLevel       = 25.0;       // HMM GRU(14,14,0,true,80,6,...) ADX trend threshold
input double Signal_HMMGRU_VolatilityZLevel    = 0.75;       // HMM GRU(14,14,0,true,80,6,...) ATR volatility z threshold
input int    Signal_HMMGRU_PriceWindow         = 20;         // HMM GRU(14,14,0,true,80,6,...) Price and ATR pattern window
input double Signal_HMMGRU_RangeATRDistance    = 0.75;       // HMM GRU(14,14,0,true,80,6,...) Range excursion inputs ATR
input int    Signal_HMMGRU_GRUTrainBars        = 160;        // HMM GRU(14,14,0,true,80,6,...) Closed bars for initial GRU fit
input int    Signal_HMMGRU_GRUSequence         = 10;         // HMM GRU(14,14,0,true,80,6,...) GRU regime sequence length
input int    Signal_HMMGRU_GRUEpochs           = 3;          // HMM GRU(14,14,0,true,80,6,...) Initial GRU training epochs
input double Signal_HMMGRU_GRULearningRate     = 0.01;       // HMM GRU(14,14,0,true,80,6,...) GRU learning rate
input double Signal_HMMGRU_GRUMinConfidence    = 0.15;       // HMM GRU(14,14,0,true,80,6,...) Minimum absolute GRU vote
input double Signal_HMMGRU_GRUWeight           = 0.35;       // HMM GRU(14,14,0,true,80,6,...) GRU share of confirmed vote
input double Signal_HMMGRU_Weight              = 1.0;        // HMM GRU(14,14,0,true,80,6,...) Weight [0...1.0]
//--- inputs for money
input double Money_FixMargin_Percent           = 10.0;       // Percentage of margin
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__ + ": error initializing expert");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Creating signal
   CExpertSignal *signal = new CExpertSignal;
   if(signal == NULL)
     {
      //--- failed
      printf(__FUNCTION__ + ": error creating signal");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalHMMGRU
   CSignalHMMGRU *filter0 = new CSignalHMMGRU;
   if(filter0 == NULL)
     {
      //--- failed
      printf(__FUNCTION__ + ": error creating filter0");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.ADXPeriod(Signal_HMMGRU_ADXPeriod);
   filter0.ATRPeriod(Signal_HMMGRU_ATRPeriod);
   filter0.SignalMode(Signal_HMMGRU_SignalMode);
   filter0.UseGRU(Signal_HMMGRU_UseGRU);
   filter0.HMMWindow(Signal_HMMGRU_HMMWindow);
   filter0.HMMIterations(Signal_HMMGRU_HMMIterations);
   filter0.MinRegimeProbability(Signal_HMMGRU_MinRegimeProbability);
   filter0.TrendADXLevel(Signal_HMMGRU_TrendADXLevel);
   filter0.VolatilityZLevel(Signal_HMMGRU_VolatilityZLevel);
   filter0.PriceWindow(Signal_HMMGRU_PriceWindow);
   filter0.RangeATRDistance(Signal_HMMGRU_RangeATRDistance);
   filter0.GRUTrainBars(Signal_HMMGRU_GRUTrainBars);
   filter0.GRUSequence(Signal_HMMGRU_GRUSequence);
   filter0.GRUEpochs(Signal_HMMGRU_GRUEpochs);
   filter0.GRULearningRate(Signal_HMMGRU_GRULearningRate);
   filter0.GRUMinConfidence(Signal_HMMGRU_GRUMinConfidence);
   filter0.GRUWeight(Signal_HMMGRU_GRUWeight);
   filter0.Weight(Signal_HMMGRU_Weight);
//--- Creation of trailing object
   CTrailingNone *trailing = new CTrailingNone;
   if(trailing == NULL)
     {
      //--- failed
      printf(__FUNCTION__ + ": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__ + ": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set trailing parameters
//--- Creation of money object
   CMoneyFixedMargin *money = new CMoneyFixedMargin;
   if(money == NULL)
     {
      //--- failed
      printf(__FUNCTION__ + ": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__ + ": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set money parameters
   money.Percent(Money_FixMargin_Percent);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__ + ": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+
