реклама
Бургер менюБургер меню

Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 8)

18

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();