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

olliverkillea.mq5

Вы автор или правообладатель?

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

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

О программе

Советник для MetaTrader 5, реализующий стратегию входа по пробою ценового диапазона (Base Range) с фильтрацией через скользящие средние и объём. На каждом новом баре анализируются периоды быстрой и медленной экспоненциальной скользящей средней (EMA), диапазона базового уровня и среднего объёма для принятия решения о открытии позиции.

Открытие покупки происходит при условии, что цена закрытия пробила верхнюю границу базового диапазона, при этом цена находится выше обеих EMA, а объём последнего бара превышает его среднее значение. Стоп-лосс устанавливается у нижней границы базового диапазона с небольшим буфером, а размер позиции рассчитывается динамически исходя из процента риска от баланса счёта.

Выход из позиции осуществляется при закрытии цены ниже обеих EMA (так называемый EMA Crossback). Также работает трейлинг-стоп, который перемещает стоп-лосс вверх по мере роста цены на заданном расстоянии в пипсах. Вся информация о текущих настройках, позициях и состоянии стратегии отображается на графике в виде дашборда.

Настройки программы

НастройкаОписание
Group1 Группа настроек управления риском. Объединяет параметры, связанные с риск-менеджментом торгового советника.
InpRiskPercent Процент от баланса счёта, рискуемый на каждую сделку. Используется для динамического расчёта размера лота с учётом расстояния стоп-лосса.
InpTrailingStopPips Расстояние трейлинг-стопа в пипсах. При достижении ценой указанного расстояния от цены открытия позиция стоп-лосс перемещается вслед за ценой.
Group2 Группа параметров стратегии. Объединяет настройки индикаторов и условий входа на рынок.
InpEmaFastPeriod Период быстрой экспоненциальной скользящей средней (EMA). Используется как фильтр направления цены для входа в позицию.
InpEmaSlowPeriod Период медленной экспоненциальной скользящей средней (EMA). Используется совместно с быстрой EMA для определения направления тренда и условий выхода.
InpBaseLookback Количество баров, используемых для определения базового ценового диапазона (Base High и Base Low), исключая бар пробоя.
InpMaxBaseWidthATR Максимальная допустимая ширина базового диапазона в единицах ATR. Если ширина базы не превышает это значение, диапазон считается суженным (Base Tight).
InpAtrPeriod Период расчёта индикатора Average True Range (ATR). Используется для оценки волатильности цены и проверки сужения базового диапазона.
InpVolMaPeriod Период расчёта скользящей среднего объёма. Используется для сравнения объёма текущего бара со средним значением и подтверждения пробоя.
Group3 Группа настроек советника. Объединяет общие параметры экспертной системы.
InpMagicNumber Уникальный магический номер, идентифицирующий позиции, открытые данным советником. Используется для фильтрации позиций при управлении и проверке наличия открытых позиций.
InpTradeComment Текстовый комментарий, присваиваемый каждой открытой сделке советником для удобства идентификации в истории торгов.
Получить полный код

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

#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>

input string   Group1="--- Risk Management ---";
input double   InpRiskPercent       = 1.0;      // Risk per trade (%)
input int      InpTrailingStopPips  = 50;       // Trailing Stop (pips)
input string   Group2="--- Strategy Parameters ---";
input int      InpEmaFastPeriod     = 10;       // Fast EMA Period
input int      InpEmaSlowPeriod     = 20;       // Slow EMA Period
input int      InpBaseLookback      = 10;       // Base Lookback (bars)
input double   InpMaxBaseWidthATR   = 2.0;      // Max Base Width (in ATR)
input int      InpAtrPeriod         = 14;       // ATR Period
input int      InpVolMaPeriod       = 20;       // Volume MA Period
input string   Group3="--- Expert Settings ---";
input ulong    InpMagicNumber       = 983000;   // Magic Number (983% reference)
input string   InpTradeComment      = "OliverKell";

CTrade         trade;
CPositionInfo  posInfo;
CSymbolInfo    symInfo;
CAccountInfo   accInfo;
int            handleEmaFast;
int            handleEmaSlow;
int            handleAtr;
double         emaFastArr[];
double         emaSlowArr[];
double         atrArr[];
long           volArr[];

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
  {
   IndicatorRelease(handleEmaFast);
   IndicatorRelease(handleEmaSlow);
   IndicatorRelease(handleAtr);
   Comment("");
  }

bool IsNewBar()
  {
   static datetime lastTime = 0;
   datetime currentTime = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(currentTime != lastTime)
     {
      lastTime = currentTime;
      return true;
     }
   return false;
  }

void OnTick()
  {
      // код доступен только после оплаты
   }

void CheckEntry()
  {
   bool hasPos = false;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(posInfo.SelectByIndex(i))
        {
         if(posInfo.Symbol() == _Symbol && posInfo.Magic() == InpMagicNumber)
           {
            hasPos = true;
            break;
           }
        }
     }

   if(hasPos) return; // Only one position at a time

   long sumVol = 0;
   for(int i = 2; i <= InpVolMaPeriod + 1; i++) // Average of previous N bars
     {
      sumVol += volArr[i];
     }
   long avgVol = sumVol / InpVolMaPeriod;

   long lastVol = volArr[1]; // Volume of the just closed bar

   double baseHigh = 0;
   double baseLow = 9999999;

   for(int i = 2; i <= InpBaseLookback + 1; i++) // Past N bars excluding the breakout bar
     {
      double h = iHigh(_Symbol, PERIOD_CURRENT, i);
      double l = iLow(_Symbol, PERIOD_CURRENT, i);
      if(h > baseHigh) baseHigh = h;
      if(l < baseLow) baseLow = l;
     }
   double close1 = iClose(_Symbol, PERIOD_CURRENT, 1);
   double close2 = iClose(_Symbol, PERIOD_CURRENT, 2);

   double currentAtr = atrArr[1];
   bool isBaseTight = (baseHigh - baseLow) <= (InpMaxBaseWidthATR * currentAtr);

   bool isAboveEma = close1 > emaFastArr[1] && close1 > emaSlowArr[1];

   bool isBreakout = close1 > baseHigh && close2 <= baseHigh;
   bool isStrongVol = lastVol > avgVol;
   if(isBaseTight && isAboveEma && isBreakout && isStrongVol)
     {

      double sl = baseLow; 

      double tickSize = SymbolInfoDouble(

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

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

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

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

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

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

Стоимость полного кода
643,40₽ ≈ $7.86