Читать книгу 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. Регулярно оптимизируйте параметры под текущую рыночную волатильность


Внимание: Перед использованием на реальном счете обязательно протестируйте робота на демо-счете и оптимизируйте параметры под конкретный инструмент.

10 роботов для автоматической торговли на Форекс

Подняться наверх