Читать книгу 10 роботов для автоматической торговли на Форекс - - Страница 2
Робот 2: «Ловец отскоков» (Bounce Catcher)
ОглавлениеВот пример кода торгового робота "Bounce Catcher" для MetaTrader 5:
```mq5
//+–+
//| BounceCatcherRobot.mq5|
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+–+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+–+
//| Входные параметры эксперта |
//+–+
input double LotSize = 0.1; // Размер лота
input int BB_Period = 20; // Период Bollinger Bands
input double BB_Deviation = 2.0; // Отклонение Bollinger Bands
input int RSI_Period = 14; // Период RSI
input int RSI_OverSold = 30; // Уровень перепроданности
input int RSI_OverBought = 70; // Уровень перекупленности
input int StopLoss_Points = 200; // Стоп-лосс в пунктах
input int TakeProfit_Points = 400; // Тейк-профит в пунктах
input bool UseTrailingStop = false; // Использовать трейлинг-стоп
input int TrailingStop_Points = 100;// Уровень трейлинг-стопа
input int MagicNumber = 123456; // Магический номер
//+–+
//| Глобальные переменные |
//+–+
int handleBB, handleRSI;
double bbUpper[], bbMiddle[], bbLower[];
double rsiBuffer[];
datetime lastTradeTime = 0;
//+–+
//| Expert initialization function |
//+–+
int OnInit()
{
// Проверка входных параметров
if(LotSize <= 0 || LotSize > 100)
{
Print("Некорректный размер лота!");
return INIT_PARAMETERS_INCORRECT;
}
// Создание индикаторов
handleBB = iBands(_Symbol, _Period, BB_Period, 0, BB_Deviation, PRICE_CLOSE);
handleRSI = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
if(handleBB == INVALID_HANDLE || handleRSI == INVALID_HANDLE)
{
Print("Ошибка создания индикаторов!");
return INIT_FAILED;
}
// Установка массивов как таймсерии
ArraySetAsSeries(bbUpper, true);
ArraySetAsSeries(bbMiddle, true);
ArraySetAsSeries(bbLower, true);
ArraySetAsSeries(rsiBuffer, true);
return INIT_SUCCEEDED;
}
//+–+
//| Expert deinitialization function |
//+–+
void OnDeinit(const int reason)
{
if(handleBB != INVALID_HANDLE) IndicatorRelease(handleBB);
if(handleRSI != INVALID_HANDLE) IndicatorRelease(handleRSI);
}
//+–+
//| Expert tick function |
//+–+
void OnTick()
{
// Проверяем наличие открытых позиций по этому символу и магику
if(PositionSelect(_Symbol)) return;
// Получаем текущее время
datetime currentTime = iTime(_Symbol, _Period, 0);
if(lastTradeTime == currentTime) return; // Проверяем, чтобы не торговать несколько раз на одном баре
// Копируем данные индикаторов
if(CopyBuffer(handleBB, 0, 0, 3, bbUpper) <= 0 ||
CopyBuffer(handleBB, 1, 0, 3, bbMiddle) <= 0 ||
CopyBuffer(handleBB, 2, 0, 3, bbLower) <= 0 ||
CopyBuffer(handleRSI, 0, 0, 3, rsiBuffer) <= 0)
{
Print("Ошибка копирования данных индикаторов!");
return;
}
// Получаем текущие цены
MqlTick lastTick;
if(!SymbolInfoTick(_Symbol, lastTick)) return;
double ask = lastTick.ask;
double bid = lastTick.bid;
double close1 = iClose(_Symbol, _Period, 1); // Цена закрытия предыдущего бара
// Сигнал на покупку: цена около нижней полосы Боллинджера и RSI < 30
bool buySignal = (close1 <= bbLower[1] || bid <= bbLower[0]) &&
rsiBuffer[0] < RSI_OverSold;
// Сигнал на продажу: цена около верхней полосы Боллинджера и RSI > 70
bool sellSignal = (close1 >= bbUpper[1] || ask >= bbUpper[0]) &&
rsiBuffer[0] > RSI_OverBought;
// Проверка на боковой тренд (дополнительный фильтр)
bool isFlatMarket = MathAbs(bbUpper[0] – bbLower[0]) > 0;
// Открытие позиций
if(buySignal && isFlatMarket)
{
OpenPosition(ORDER_TYPE_BUY);
lastTradeTime = currentTime;
}
else if(sellSignal && isFlatMarket)
{
OpenPosition(ORDER_TYPE_SELL);
lastTradeTime = currentTime;
}
// Обработка трейлинг-стопа
if(UseTrailingStop && PositionSelect(_Symbol))
{
TrailingStop();
}
}
//+–+
//| Функция открытия позиции |
//+–+
void OpenPosition(ENUM_ORDER_TYPE orderType)
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize;
request.type = orderType;
request.type_filling = ORDER_FILLING_FOK;
request.deviation = 10;
request.magic = MagicNumber;
// Установка цен
if(orderType == ORDER_TYPE_BUY)
{
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = request.price – StopLoss_Points * _Point;
request.tp = request.price + TakeProfit_Points * _Point;
}
else // ORDER_TYPE_SELL
{
request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.sl = request.price + StopLoss_Points * _Point;
request.tp = request.price – TakeProfit_Points * _Point;
}
// Отправка ордера
if(!OrderSend(request, result))
{
Print("Ошибка открытия позиции: ", GetLastError());
}
else
{
Print("Позиция успешно открыта. Тикет: ", result.order);
}
}
//+–+
//| Функция трейлинг-стопа |
//+–+
void TrailingStop()
{
ulong posTicket = PositionGetTicket(0);
if(!PositionSelectByTicket(posTicket)) return;
double currentSL = PositionGetDouble(POSITION_SL);
double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
double newSL = currentSL;
double trailingStep = TrailingStop_Points * _Point;
if(posType == POSITION_TYPE_BUY)
{
if(currentPrice – currentSL > trailingStep)
{
newSL = currentPrice – trailingStep;
if(newSL > currentSL)
{
ModifyPositionSL(newSL);
}
}
}
else if(posType == POSITION_TYPE_SELL)
{
if(currentSL – currentPrice > trailingStep)
{
newSL = currentPrice + trailingStep;
if(newSL < currentSL)
{
ModifyPositionSL(newSL);
}
}
}
}
//+–+
//| Функция модификации стоп-лосса |
//+–+
void ModifyPositionSL(double newSL)
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_SLTP;
request.position = PositionGetTicket(0);
request.symbol = _Symbol;
request.sl = newSL;
request.magic = MagicNumber;
if(!OrderSend(request, result))
{
Print("Ошибка модификации стоп-лосса: ", GetLastError());
}
}
//+–+
```
Ключевые особенности робота:
1. Логика работы:
· Покупка при касании нижней полосы Боллинджера и RSI < 30
· Продажа при касании верхней полосы Боллинджера и RSI > 70
2. Управление рисками:
· Фиксированные Stop-Loss и Take-Profit
· Опциональный трейлинг-стоп
· Проверка размера лота
3. Защитные механизмы:
· Торговля только на новом баре
· Одна позиция на символ
· Проверка успешности выполнения ордеров
4. Настраиваемые параметры:
· Периоды индикаторов
· Уровни RSI
· Размеры стоп-лосса и тейк-профита
· Магический номер для идентификации
Рекомендации по использованию:
1. Тестируйте на истории с разными параметрами
2. Настройте размер лота под ваш депозит
3. Добавьте фильтр тренда (например, ADX) для лучшей работы во флете
4. Используйте на таймфреймах M15-H1 для меньшего шума
5. Регулярно оптимизируйте параметры под текущую рыночную волатильность
Внимание: Перед использованием на реальном счете обязательно протестируйте робота на демо-счете и оптимизируйте параметры под конкретный инструмент.