← К каталогу
Исходный код · ID 4094

Gamma Acceleration Engine

gamma acceleration engine 1.00.mqh
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека Gamma Acceleration Engine (GAE) — это детектор состояния рынка для торговых советников MetaTrader 4. Она вычисляет производные цены (Дельта, Гамма, Джерк) на основе EMA-сглаженной цены, нормализует их по ATR и классифицирует рыночное состояние по шести категориям: простой, формирование, тренд, взрыв, исчерпание и разворот. Также определяет направление рынка и формирует решения о разрешении входа в длинную или короткую позицию.

Библиотека предоставляет удобные обёртки для обработки текущего и последнего закрытого бара, а также функцию текстового вывода результатов для отладки. Конфигурация позволяет настраивать пороги, фильтры и включать или отключать отдельные этапы обработки, включая адаптивные пороги, фильтр импульсов и фильтр тренда.

Состав библиотеки

Классов: 2 · методов: 0 · конструкторов: 0 · деструкторов: 0 · отдельных функций: 9

Классы
Класс class GAE_Config

Структура конфигурации параметров обработки: периоды EMA, ATR, пороги, фильтры и переключатели этапов

Класс class GAE_Outputs

Структура результатов обработки: сырые метрики, статистика, классификация состояния и решения по входу

Функции
Функция GAE_Config GAE_DefaultConfig()

Возвращает конфигурацию со значениями по умолчанию для всех параметров

Функция double Clamp(double value, double minVal, double maxVal)

Ограничивает числовое значение в заданном диапазоне между минимумом и максимумом

Функция string GAE_StateToString(GAE_MARKET_STATE s)

Преобразует перечисление состояния рынка в читаемую строку

Функция string GAE_DirectionToString(GAE_DIRECTION d)

Преобразует перечисление направления рынка в читаемую строку

Функция double GAE_Percentile(const double &arr[], int size, double pct)

Вычисляет процентиль отсортированного массива методом линейной интерполяции

Функция bool GAE_Process(const GAE_Config &cfg, int shift, GAE_Outputs &out)

Основная функция обработки рыночных данных: расчёт производных, нормализация, классификация состояния и фильтрация входа

Функция bool GAE_ProcessCurrent(const GAE_Config &cfg, GAE_Outputs &out)

Обрабатывает текущий незавершённый бар, вызывая основную функцию с нулевым сдвигом

Функция bool GAE_ProcessLastClosed(const GAE_Config &cfg, GAE_Outputs &out)

Обрабатывает последний закрытый бар, вызывая основную функцию со сдвигом равным единице

Функция string GAE_Dump(const GAE_Outputs &out)

Формирует текстовую строку с результатами обработки для логирования и отладки

Получить полный код

Поиск по коду файла

#property strict

enum GAE_MARKET_STATE
{
   GAE_STATE_IDLE        = 0,  // Idle         - no trade
   GAE_STATE_BUILDING    = 1,  // Building     - trend beginning
   GAE_STATE_TRENDING    = 2,  // Trending     - strong trend
   GAE_STATE_EXPLOSIVE   = 3,  // Explosive    - breakout
   GAE_STATE_EXHAUSTION  = 4,  // Exhaustion   - momentum fading
   GAE_STATE_REVERSAL    = 5   // Reversal     - potential reversal
};

enum GAE_DIRECTION
{
   GAE_DIR_NEUTRAL =  0,
   GAE_DIR_BULLISH =  1,
   GAE_DIR_BEARISH = -1
};

struct GAE_Config
{

   int    PriceEMA_Period;          // EMA period on Close (8-20)

   int    GammaEMA_Period;          // EMA period on raw Gamma

   int    ATR_Period;               // ATR period

   double StrengthThreshold;        // Fixed baseline threshold (e.g. 0.35)
   double StrengthEnable;           // Enable threshold (hysteresis)
   double StrengthDisable;          // Disable threshold (hysteresis)
   bool   UseAdaptiveThreshold;     // Use adaptive percentile threshold
   int    AdaptiveLookback;         // Bars for adaptive calc
   double AdaptivePercentile;       // Percentile (0-100)

   int    PersistenceBars;          // Consecutive same-sign bars required

   bool   UseExplosionFilter;       // Require momentum burst
   double ExplosionMultiple;        // |strength| > avg * multiple
   double ExplosionZScore;          // |z-score| threshold

   bool   UseTrendFilter;
   int    TrendEMAFast;             // Fast trend EMA
   int    TrendEMASlow;             // Slow trend EMA
   bool   UseADX;                   // Use ADX instead of EMA cross
   int    ADX_Period;
   double ADXThreshold;
   bool   RequireSlope;             // Require EMA slope confirmation
   int    SlopeBars;                // Bars to check EMA slope

   bool   UseConfidenceFilter;
   double MinConfidenceScore;

   double MinATR;                   // Minimum ATR (0 = disabled)
   int    MaxSpreadPoints;          // Max spread in points (0 = off)

   bool   RequireDirectionAgreement;// Stage 7
   bool   RequirePersistence;       // Stage 9
   bool   RequireStrengthFilter;    // Stage 8
};

struct GAE_Outputs
{

   double SmoothPrice;        // EMA(Close, PriceEMA_Period)
   double Delta;              // 1st derivative (current)
   double DeltaPrev;          // 1st derivative (previous bar)
   double Gamma;              // 2nd derivative (raw)
   double GammaEMA;           // Smoothed Gamma (current)
   double GammaEMAPrev;       // Smoothed Gamma (previous bar)
   double GammaStrength;      // GammaEMA / ATR (signed)
   double Jerk;               // 3rd derivative
   double ATR;                // Current ATR

   double AvgGammaStrength;   // Mean |strength| over lookback
   double StdGammaStrength;   // Std-dev of strength over lookback
   double GammaZScore;        // Current z-score
   double AdaptiveThreshold;  // Computed percentile threshold

   GAE_DIRECTION    Direction;     // Bullish / Bearish / Neutral
   GAE_MARKET_STATE State;         // Market state (Stage 12)
   int    PersistenceCount;        // Consecutive same-sign bars
   double ConfidenceScore;         // 0-100 signal quality

   bool   TrendBullish;
   bool   TrendBearish;

   bool   EntryAllowedLong;
   bool   EntryAllowedShort;
   bool   EntryAllowed;            // Long OR Short

   int      SpreadPoints;
   datetime EvalTime;
};

GAE_Config GAE_DefaultConfig()
{
   GAE_Config c;
   c.PriceEMA_Period         = 10;
   c.GammaEMA_Period         = 5;
   c.ATR_Period              = 14;

   c.StrengthThreshold       = 0.35;
   c.StrengthEnable          = 0.38;
   c.StrengthDisable         = 0.30;
   c.UseAdaptiveThreshold    = true;
   c.AdaptiveLookback        = 200;
   c.AdaptivePercentile      = 80.0;

   c.PersistenceBars         = 3;

   c.UseExplosionFilter      = false;
   c.ExplosionMultiple       = 2.0;
   c.ExplosionZScore         = 2.0;

   c.UseTrendFilter          = true;
   c.TrendEMAFast            = 50;
   c.TrendEMASlow            = 200;
   c.UseADX                  = false;
   c.ADX_Period              = 14;
   c.ADXThreshold            = 20.0;
   c.RequireSlope            = true;
   c.SlopeBars               = 5;

   c.UseConfidenceFilter     = false;
   c.MinConfidenceScore      = 70.0;

   c.MinATR                  = 0.0;
   c.MaxSpreadPoints         = 0;

   c.RequireDirectionAgreement = true;
   c.RequirePersistence       = true;
   c.RequireStrengthFilter    = true;
   return c;
}

double Clamp(double value, double minVal, double maxVal)
{
   if(value < minVal) return minVal;
   if(value > maxVal) return maxVal;
   return value;
}

string GAE_StateToString(GAE_MARKET_STATE s)
{
   switch(s)
   {
      case GAE_STATE_IDLE:       return "Idle";
      case GAE_STATE_BUILDING:   return "Building";
      case GAE_STATE_TRENDING:   return "Trending";
      case GAE_STATE_EXPLOSIVE:  return "Explosive";
      case GAE_STATE_EXHAUSTION: return "Exhaustion";
      case GAE_STATE_REVERSAL:   return "Reversal";
   }
   return "Unknown";
}

string GAE_DirectionToString(GAE_DIRECTION d)
{
   switch(d)
   {
      case GAE_DIR_BULLISH: return "Bullish";
      case GAE_DIR_BEARISH: return "Bearish";
      default:              return "Neutral";
   }
}

double GAE_Percentile(const double &arr[], int size, double pct)
{
   if(size <= 0) return 0.0;
   if(pct <= 0.0) return arr[0];
   if(pct >= 100.0) return arr[size-1];

   double tmp[];
   ArrayResize(tmp, size);
   for(int i=0; i<size; i++) tmp[i] = arr[i];
   ArraySort(tmp);   // ascending

   double rank  = (pct / 100.0) * (double)(size - 1);
   int    lo    = (int)MathFloor(rank);
   int    hi    = (int)MathCeil(rank);
   if(lo < 0)        lo = 0;
   if(hi > size - 1) hi = size - 1;
   if(lo == hi)      return tmp[lo];
   double frac = rank - (double)lo;
   return tmp[lo] + frac * (tmp[hi] - tmp[lo]);
}

bool GAE_Process(const GAE_Config &cfg, int shift, GAE_Outputs &out)
{
   ZeroMemory(out);
   if(shift < 0) shift = 0;

   static datetime lastBar = 0;
   static int lastShift = -1;
   static GAE_Outputs cachedOut;

   bool isClosedBar = (shift > 0);

   if(isClosedBar && Time[shift] == lastBar && lastShift == shift)
   {
      out = cachedOut;
      return true;
   }

   int winSize      = cfg.GammaEMA_Period * 5 + 10;
   int totalBars    = winSize + cfg.AdaptiveLookback + 20;
   int minBars      = MathMax(totalBars, cfg.TrendEMASlow + cfg.SlopeBars + 20);
   if(Bars < minBars) return false;

   out.EvalTime      = Time[shift];
   out.SpreadPoints  = (int)MarketInfo(Symbol(), MODE_SPREAD);

   double smooth[];
   ArrayResize(smooth, totalBars);
   for(int i=0; i<totalBars; i++)
      smooth[i] = iMA(Symbol(), 0, cfg.PriceEMA_Period, 0, MODE_EMA, PRICE_CLOSE, shift+i);

   double rawDelta[], rawGamma[];
   ArrayResize(rawDelta, totalBars);
   ArrayResize(rawGamma, totalBars);
   for(int i=0; i<totalBars-2; i++)
   {
      rawDelta[i] = smooth[i] - smooth[i+1];
      rawGamma[i] = rawDelta[i] - (smooth[i+1] - smooth[i+2]);
   }
   rawDelta[totalBars-2] = smooth[totalBars-2] - smooth[totalBars-1];
   rawDelta[totalBars-1] = 0.0;
   rawGamma[totalBars-2] = rawDelta[totalBars-2];
   rawGamma[totalBars-1] = 0.0;

   double gammaEMA[];
   ArrayResize(gammaEMA, totalBars);
   double mult = 2.0 / (1.0 + (double)cfg.GammaEMA_Period);
   double ema  = rawGamma[totalBars-1];               // seed at oldest
   gammaEMA[totalBars-1] = ema;
   for(int i=totalBars-2; i>=0; i--)
   {
      ema = rawGamma[i] * mult + ema * (1.0 - mult);
      gammaEMA[i] = ema;
   }

   double atrNow = iATR(Symbol(), 0, cfg.ATR_Period, shift);
   if(atrNow <= 0.0) atrNow = Point;   // safety
   out.ATR = atrNow;

   out.SmoothPrice  = smooth[0];
   out.Delta        = rawDelta[0];
   out.DeltaPrev    = rawDelta[1];
   out.Gamma        = rawGamma[0];
   out.GammaEMA     = gammaEMA[0];
   out.GammaEMAPrev = gammaEMA[1];
   out.GammaStrength= gammaEMA[0] / atrNow;

   out.Jerk = gammaEMA[0] - gammaEMA[1];

   int lookback = cfg.AdaptiveLookback;
   if(lookback > totalBars) lookback = totalBars;

   double strengthHist[];
   ArrayResize(strengthHist, lookback);
   double sum = 0.0, sumSq = 0.0;
   for(int i=0; i<lookback; i++)
   {
      double atr_i = iATR(Symbol(), 0, cfg.ATR_Period, shift+i);
      if(atr_i <= 0.0) atr_i = Point;
      double s = gammaEMA[i] / atr_i;
      strengthHist[i] = s;
      sum   += s;
  

Показано первые 50% кода (символов: 12484)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 248,40₽ ≈ $15.26