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

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

18

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;