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

olliverkillea.mq4

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

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

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

О программе

Данный код представляет собой советник (Expert Advisor) для платформы MetaTrader 4, реализующий стратегию торговли на основе пробоя ценового диапазона с фильтрацией по скользящим средним, волатильности и объёму. Советник использует динамический расчёт размера позиции на основе заданного риска в процентах от баланса счёта, а также управляет защитным стоп-лоссом по методу трейлинг-стопа. На графике отображается информационная панель с текущими параметрами стратегии, состоянием позиции и данными для мониторинга.

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

НастройкаОписание
Group1 Группа «Управление риском» — Текстовый разделитель для группы параметров управления риском.
Risk per trade (%) (InpRiskPercent) Риск на сделку (%) — Процент от текущего баланса счёта, используемый для расчёта размера позиции при входе в сделку.
Trailing Stop (pips) (InpTrailingStopPips) Трейлинг-стоп (пипсы) — Расстояние трейлинг-стопа в пипсах, фиксирующее минимальную прибыль позиции при движении цены в выгодную сторону.
Group2 Группа «Параметры стратегии» — Текстовый разделитель для группы параметров торговой стратегии.
Fast EMA Period (InpEmaFastPeriod) Период быстрой EMA — Период быстрой экспоненциальной скользящей средней, используемой для определения направления тренда.
Slow EMA Period (InpEmaSlowPeriod) Период медленной EMA — Период медленной экспоненциальной скользящей средней, используемой совместно с быстрой для фильтрации тренда.
Base Lookback (bars) (InpBaseLookback) Базовый период просмотра (баров) — Количество баров, используемых для определения базового ценового диапазона (верхней и нижней границы).
Max Base Width (in ATR) (InpMaxBaseWidthATR) Максимальная ширина базы (в ATR) — Максимально допустимая ширина базового диапазона, выраженная кратным значением текущего ATR.
ATR Period (InpAtrPeriod) Период ATR — Период расчёта индекса среднегодового диапазона (ATR), используемого для оценки волатильности.
Volume MA Period (InpVolMaPeriod) Период MA объёма — Период скользящей средней по объёму, используемой для оценки текущей активности торгового объёма.
Group3 Группа «Настройки эксперта» — Текстовый разделитель для группы общих настроек эксперта.
Magic Number (InpMagicNumber) Магический номер — Уникальный идентификатор ордеров, открытых данным советником, для их фильтрации и управления.
InpTradeComment Комментарий к сделке — Текстовый комментарий, присваиваемый каждому открываемому ордеру для идентификации в журнале.
Получить полный код

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

#property version   "1.00"
#property strict

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 int      InpMagicNumber       = 983000;   // Magic Number
input string   InpTradeComment      = "OliverKell";

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

void OnDeinit(const int reason)
  {
   Comment("");
  }

bool IsNewBar()
  {
   static datetime lastTime = 0;
   datetime currentTime = Time[0];
   if(currentTime != lastTime)
     {
      lastTime = currentTime;
      return true;
     }
   return false;
  }

double GetPipMultiplier()
  {
   if(Digits == 3 || Digits == 5) return 10.0;
   return 1.0;
  }

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

void CheckEntry()
  {
   bool hasPos = false;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == InpMagicNumber)
           {
            hasPos = true;
            break;
           }
        }
     }

   if(hasPos) return;

   long sumVol = 0;
   for(int i = 2; i <= InpVolMaPeriod + 1; i++) 
     {
      sumVol += (long)iVolume(Symbol(), 0, i);
     }
   long avgVol = sumVol / InpVolMaPeriod;
   long lastVol = (long)iVolume(Symbol(), 0, 1);

   double baseHigh = 0;
   double baseLow = 9999999;

   for(int i = 2; i <= InpBaseLookback + 1; i++) 
     {
      double h = iHigh(Symbol(), 0, i);
      double l = iLow(Symbol(), 0, i);
      if(h > baseHigh) baseHigh = h;
      if(l < baseLow) baseLow = l;
     }
   double close1 = iClose(Symbol(), 0, 1);
   double close2 = iClose(Symbol(), 0, 2);

   double currentAtr = iATR(Symbol(), 0, InpAtrPeriod, 1);
   bool isBaseTight = (baseHigh - baseLow) <= (InpMaxBaseWidthATR * currentAtr);

   double emaFast1 = iMA(Symbol(), 0, InpEmaFastPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
   double emaSlow1 = iMA(Symbol(), 0, InpEmaSlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
   bool isAboveEma = close1 > emaFast1 && close1 > emaSlow1;
   bool isBreakout = close1 > baseHigh && close2 <= baseHigh;
   bool isStrongVol = lastVol > avgVol;
   if(isBaseTight && isAboveEma && isBreakout && isStrongVol)
     {
      double tickSize = MarketInfo(Symbol(), MODE_TICKSIZE);
      double sl = baseLow - (2 * tickSize);
      double ticks = (Ask - sl) / tickSize;
      if(ticks <= 0) return;

      double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
      if (tickValue == 0) return;

      double riskAmount = AccountBalance() * (InpRiskPercent / 100.0);
      double stepVol = MarketInfo(Symbol(), MODE_LOTSTEP);

      double lotSize = riskAmount / (ticks * tickValue);

      double minLot = MarketInfo(Symbol(), MODE_MINLOT);
      double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);

      lotSize = MathFloor(lotSize / stepVol) * stepVol;
      if(lotSize < minLot) lotSize = minLot;
      if(lotSize > maxLot) lotSize = maxLot;
      int ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, sl, 0, InpTradeComment, InpMagicNumber, 0, clrGreen);
      if (ticket < 0)
        {
         Print("OrderSend failed with error #", GetLastError());
        }
     }
  }

void CheckExit()
  {
   double emaFast1 = iMA(Symbol(), 0, InpEmaFastPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
   double emaSlow1 = iMA(Symbol(), 0, InpEmaSlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
   double close1 = iClose(Symbol(), 0, 1);
   for(int i = OrdersTotal() - 1

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

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

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

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

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

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

Стоимость полного кода
583₽ ≈ $7.13