Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 8)
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();