olliverkillea.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.