//+------------------------------------------------------------------+
//|                                                 RetryConfig.mqh  |
//+------------------------------------------------------------------+
#ifndef EXECUTION_GATEWAY_RETRYCONFIG_MQH
#define EXECUTION_GATEWAY_RETRYCONFIG_MQH
//+------------------------------------------------------------------+
//| Retry policy configuration for CRetryExecutor.                   |
//| All members are public to allow aggregate initialization.        |
//+------------------------------------------------------------------+
struct SRetryConfig
  {
   int               m_max_attempts;       // Maximum submission attempts (including first)
   uint              m_base_delay_ms;      // Base backoff delay in milliseconds
   uint              m_max_delay_ms;       // Ceiling on backoff delay in milliseconds
   uint              m_retryable_codes[];  // Return codes classified as transient/retryable
  };
//+------------------------------------------------------------------+
//| Returns a default SRetryConfig suitable for most live EAs.       |
//+------------------------------------------------------------------+
SRetryConfig DefaultRetryConfig(void)
  {
   SRetryConfig cfg;
   cfg.m_max_attempts  = 4;
   cfg.m_base_delay_ms = 200;
   cfg.m_max_delay_ms  = 5000;
//--- Standard transient return codes
   ArrayResize(cfg.m_retryable_codes, 6);
   cfg.m_retryable_codes[0] = 10004; // TRADE_RETCODE_REQUOTE
   cfg.m_retryable_codes[1] = 10006; // TRADE_RETCODE_CONNECTION
   cfg.m_retryable_codes[2] = 10010; // TRADE_RETCODE_TIMEOUT
   cfg.m_retryable_codes[3] = 10020; // TRADE_RETCODE_PRICE_CHANGED
   cfg.m_retryable_codes[4] = 10021; // TRADE_RETCODE_PRICE_OFF
   cfg.m_retryable_codes[5] = 10030; // TRADE_RETCODE_TOO_MANY_REQUESTS
   return(cfg);
  }

#endif // EXECUTION_GATEWAY_RETRYCONFIG_MQH
//+------------------------------------------------------------------+