Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 19)
void OnDeinit(const int reason)
{
if(zigzagHandle != INVALID_HANDLE) IndicatorRelease(zigzagHandle);
DeletePatternLines();
}
//+–+
//| Expert tick function |
//+–+
void OnTick()
{
// Проверяем наличие открытых позиций по этому символу и магику
if(PositionSelect(_Symbol)) return;
// Получаем текущее время бара
datetime currentTime = iTime(_Symbol, _Period, 0);
// Ищем паттерны каждые N баров или при смене дня
static datetime lastScanTime = 0;
if(currentTime – lastScanTime < 3600) return; // Сканируем раз в час
// Обновляем данные ZigZag
if(!UpdateZigZagData()) return;
// Ищем гармонические паттерны
PatternPoints foundPattern = ScanForPatterns();
if(foundPattern.type != PATTERN_NONE)
{
patternFound = true;
lastPattern = foundPattern;
lastPatternBar = iBarShift(_Symbol, _Period, currentTime);
// Отображаем паттерн на графике
if(ShowPatternLines) DrawPattern(foundPattern);
// Открываем сделку в точке D
OpenPatternTrade(foundPattern);
lastScanTime = currentTime;
}
}
//+–+
//| Обновление данных ZigZag |
//+–+
bool UpdateZigZagData()
{
// Копируем данные ZigZag
if(CopyBuffer(zigzagHandle, 0, 0, 500, zigzagBuffer) <= 0)
{
Print("Ошибка копирования данных ZigZag!");
return false;
}
// Копируем временные метки
if(CopyTime(_Symbol, _Period, 0, 500, timeBuffer) <= 0) return false;
// Копируем High и Low
if(CopyHigh(_Symbol, _Period, 0, 500, highBuffer) <= 0) return false;
if(CopyLow(_Symbol, _Period, 0, 500, lowBuffer) <= 0) return false;
return true;
}
//+–+
//| Поиск гармонических паттернов |
//+–+
PatternPoints ScanForPatterns()
{
PatternPoints result;
result.type = PATTERN_NONE;
// Собираем экстремумы из ZigZag
double extremes[];
datetime extremeTimes[];
int extremeBars[];
CollectExtremes(extremes, extremeTimes, extremeBars);
int extremeCount = ArraySize(extremes);
if(extremeCount < 5) return result;