советник на индикаторах атр и болинджере.
почему то не работает.
//+------------------------------------------------------------------+
//| BB_ATR_Martin.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//|
www.mql5.com |
//+------------------------------------------------------------------+
#property copyright «Copyright 2023»
#property version «1.00»
#property strict
//--- Inputs
input int BB_Period = 20; // Bollinger Bands Period
input double BB_Deviation = 2.0; // Deviation
input int ATR_Period = 14; // ATR Period
input int ATR_Lookback = 50; // Period for ATR Minimum
input double BB_Width_Threshold = 0.5; // Max BB Width for Squeeze
input double LotSize = 0.01; // Initial Lot Size
input double Multiplier = 2.0; // Martingale Multiplier
input int StopLoss_ATR = 2; // StopLoss (ATR multiples)
input int TakeProfit_ATR = 3; // TakeProfit (ATR multiples)
input int TrailingStep = 10; // Trailing Stop Step (points)
//--- Global Variables
double lastBid, lastAsk;
int magicNumber = 12345;
int lossCount = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(!IsNewBar()) return;
//--- Get Indicators Values
double bbUpper = iBands(NULL, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_UPPER, 1);
double bbLower = iBands(NULL, 0, BB_Period, BB_Deviation, 0, PRICE_CLOSE, MODE_LOWER, 1);
double bbWidth = bbUpper — bbLower;
double atr = iATR(NULL, 0, ATR_Period, 1);
double atrMin = GetATRMin(ATR_Lookback);
//--- Check Entry Conditions
bool bbSqueeze = bbWidth < BB_Width_Threshold * Point;
bool atrCondition = atr <= atrMin;
//--- Trading Logic
if(bbSqueeze && atrCondition)
{
if(Close[1] > bbUpper) OpenOrder(OP_BUY);
if(Close[1] < bbLower) OpenOrder(OP_SELL);
}
//--- Trailing Stop
TrailingStop();
}
//+------------------------------------------------------------------+
//| Custom Functions |
//+------------------------------------------------------------------+
double GetATRMin(int lookback)
{
double min = 9999;
for(int i = 1; i <= lookback; i++)
{
double val = iATR(NULL, 0, ATR_Period, i);
if(val < min) min = val;
}
return min;
}
void OpenOrder(int cmd)
{
if(OrdersTotal() > 0) return;
double sl = 0, tp = 0;
double atr = iATR(NULL, 0, ATR_Period, 0);
double lots = LotSize * MathPow(Multiplier, lossCount);
if(cmd == OP_BUY)
{
sl = Ask — StopLoss_ATR * atr;
tp = Ask + TakeProfit_ATR * atr;
}
else
{
sl = Bid + StopLoss_ATR * atr;
tp = Bid — TakeProfit_ATR * atr;
}
int ticket = OrderSend(Symbol(), cmd, lots, cmd == OP_BUY? Ask: Bid, 3, sl, tp, "", magicNumber);
if(ticket < 0)
Print(«OrderSend failed with error #», GetLastError());
}
void TrailingStop()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType() == OP_BUY && Bid — OrderOpenPrice() > TrailingStep * Point)
{
if(OrderStopLoss() < Bid — TrailingStep * Point)
OrderModify(OrderTicket(), OrderOpenPrice(), Bid — TrailingStep * Point, OrderTakeProfit(), 0);
}
else if(OrderType() == OP_SELL && OrderOpenPrice() — Ask > TrailingStep * Point)
{
if(OrderStopLoss() > Ask + TrailingStep * Point || OrderStopLoss() == 0)
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStep * Point, OrderTakeProfit(), 0);
}
}
}
}
bool IsNewBar()
{
static datetime lastTime;
datetime currentTime = iTime(NULL, 0, 0);
if(lastTime != currentTime)
{
lastTime = currentTime;
return true;
}
return false;
}
//+------------------------------------------------------------------+
Особенности советника:
Условия входа:
Полосы Боллинджера сужены (ширина < заданного порога)
ATR находится на минимуме за последние N периодов
Пробой верхней/нижней границы Боллинджера
Управление рисками:
Мартингейл: после каждой убыточной сделки лот умножается на множитель
Стоп-лосс и тейк-профит рассчитываются на основе ATR
Трейлинг-стоп с заданным шагом
Рекомендации:
Протестируйте на истории с разными параметрами
Настройте BB_Width_Threshold под ваш инструмент
Оптимизируйте Multiplier и ATR_Lookback
Добавьте фильтр тренда (например, по MA) для уменьшения ложных сигналов
Важно! Мартингейл может быть опасен для депозита — обязательно протестируйте стратегию на демо-счете перед реальным использованием.
Комментарии (14)
23 igrun Автор Сообщений: 1702 - igrun
35 AM2 Сообщений: 16408 - Андрей
а если зашли в прибыль, то закрываем только тралом.
и еще чуть не забыл — когда плечи режут советник назначает удобный лот.
23 igrun Автор Сообщений: 1702 - igrun
23 igrun Автор Сообщений: 1702 - igrun
35 AM2 Сообщений: 16408 - Андрей
23 igrun Автор Сообщений: 1702 - igrun
35 AM2 Сообщений: 16408 - Андрей
23 igrun Автор Сообщений: 1702 - igrun
22 ruslan71 Сообщений: 995 - Руслан
23 igrun Автор Сообщений: 1702 - igrun
22 ruslan71 Сообщений: 995 - Руслан
23 igrun Автор Сообщений: 1702 - igrun
14 verta81 Сообщений: 450
22 ruslan71 Сообщений: 995 - Руслан
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий