Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 26)
if(iHigh(_Symbol, _Period, i) <= iHigh(_Symbol, _Period, i+j) ||
iHigh(_Symbol, _Period, i) <= iHigh(_Symbol, _Period, i-j))
{
isSwingHigh = false;
break;
}
}
if(isSwingHigh)
{
int size = ArraySize(highs);
ArrayResize(highs, size + 1);
ArrayResize(highTimes, size + 1);
highs[size] = iHigh(_Symbol, _Period, i);
highTimes[size] = iTime(_Symbol, _Period, i);
}
// Проверяем swing low
bool isSwingLow = true;
for(int j = 1; j <= lookback; j++)
{
if(iLow(_Symbol, _Period, i) >= iLow(_Symbol, _Period, i+j) ||
iLow(_Symbol, _Period, i) >= iLow(_Symbol, _Period, i-j))
{
isSwingLow = false;
break;
}
}
if(isSwingLow)
{
int size = ArraySize(lows);
ArrayResize(lows, size + 1);
ArrayResize(lowTimes, size + 1);
lows[size] = iLow(_Symbol, _Period, i);
lowTimes[size] = iTime(_Symbol, _Period, i);
}
}
}
//+–+
//| Фильтр паттернов по дополнительным критериям |
//+–+
bool ValidatePattern(const PatternPoints &pattern)
{
// 1. Проверяем объемы в точках разворота
// 2. Проверяем временные соотношения
// 3. Проверяем наличие дивергенций
// 4. Проверяем контекст рынка
// Пример: проверяем, что в точке D объем выше среднего
int barD = iBarShift(_Symbol, _Period, pattern.timeD);
long volumeD = iVolume(_Symbol, _Period, barD);
long avgVolume = iMA(_Symbol, _Period, 20, 0, MODE_SMA, VOLUME_TICK, barD);
if(volumeD < avgVolume * 0.8) return false;
// Проверяем временные соотношения
double timeAB = double(pattern.timeB – pattern.timeA);
double timeBC = double(pattern.timeC – pattern.timeB);
double timeCD = double(pattern.timeD – pattern.timeC);
// Время CD не должно быть меньше времени BC (для большинства паттернов)
if(timeCD < timeBC * 0.5) return false;
return true;
}
```
Ключевые особенности робота:
1. Алгоритм распознавания:
· Использует индикатор ZigZag для поиска экстремумов
· Проверяет соотношения Фибоначчи с заданным допуском
· Распознает 6 основных гармонических паттернов
2. Точность распознавания: