Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 2)
return INIT_FAILED;
}
prevFastMA = fastMA[0];
prevSlowMA = slowMA[0];
Print("Советник TrendFollower успешно инициализирован");
return INIT_SUCCEEDED;
}
//+–+
//| Функция деинициализации советника |
//+–+
void OnDeinit(const int reason)
{
// Освобождение хэндлов индикаторов
if(fastMAHandle != INVALID_HANDLE)
IndicatorRelease(fastMAHandle);
if(slowMAHandle != INVALID_HANDLE)
IndicatorRelease(slowMAHandle);
if(adxHandle != INVALID_HANDLE)
IndicatorRelease(adxHandle);
Print("Советник деинициализирован, причина: ", reason);
}
//+–+
//| Функция обработки тиков |
//+–+
void OnTick()
{
// Проверяем, есть ли уже открытые позиции этим советником
if(PositionsTotal() > 0)
{
CheckForClose(); // Проверяем условия для закрытия
ManageTrailingStop(); // Управляем трейлинг-стопом
return;
}
// Проверяем условия для открытия новой позиции
CheckForOpen();
}
//+–+
//| Проверка условий для открытия позиции |
//+–+
void CheckForOpen()
{
// Получаем значения индикаторов на текущем и предыдущем барах
double fastMA[2], slowMA[2], adxValue[2];
if(CopyBuffer(fastMAHandle, 0, 0, 2, fastMA) < 2) return;
if(CopyBuffer(slowMAHandle, 0, 0, 2, slowMA) < 2) return;
// Получаем значение линии ADX (индекс направленного движения)
if(CopyBuffer(adxHandle, 0, 0, 2, adxValue) < 2) return;
// Проверяем условия для BUY (покупки)
// 1. Быстрая MA пересекла медленную MA снизу вверх
// 2. ADX выше порогового значения (сильный тренд)
if(fastMA[1] <= slowMA[1] && fastMA[0] > slowMA[0] && adxValue[0] > ADXThreshold)
{
OpenPosition(ORDER_TYPE_BUY);
}
// Проверяем условия для SELL (продажи)
// 1. Быстрая MA пересекла медленную MA сверху вниз
// 2. ADX выше порогового значения (сильный тренд)
else if(fastMA[1] >= slowMA[1] && fastMA[0] < slowMA[0] && adxValue[0] > ADXThreshold)
{
OpenPosition(ORDER_TYPE_SELL);
}
// Сохраняем текущие значения для следующего сравнения
prevFastMA = fastMA[0];
prevSlowMA = slowMA[0];
}