Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 25)
request.tp = tpPrice;
request.deviation = 10;
request.magic = MagicNumber;
request.comment = GetPatternName(pattern.type);
if(!OrderSend(request, result))
{
Print("Ошибка открытия позиции по паттерну: ", GetLastError());
}
else
{
Print("Позиция открыта по паттерну: ", GetPatternName(pattern.type),
" (", (pattern.direction == 1) ? "Bullish" : "Bearish", ")");
}
}
//+–+
//| Функция для ручного тестирования паттернов |
//+–+
void TestPatternRecognition()
{
// Эта функция может быть использована для тестирования
// алгоритма распознавания паттернов на исторических данных
Print("Начинаем тестирование распознавания паттернов…");
for(int i = 100; i < Bars(_Symbol, _Period) – 100; i += 10)
{
// Здесь можно добавить код для тестирования на разных участках истории
}
}
```
Дополнительные функции для расширенного распознавания:
```mq5
//+–+
//| Улучшенная функция распознавания паттернов (опционально) |
//+–+
PatternPoints AdvancedPatternScan()
{
PatternPoints result;
result.type = PATTERN_NONE;
// Используем алгоритм поиска экстремумов без ZigZag
// для более точного распознавания
// 1. Ищем swing highs и swing lows
double swingHighs[], swingLows[];
datetime swingHighTimes[], swingLowTimes[];
FindSwingPoints(swingHighs, swingHighTimes, swingLows, swingLowTimes);
// 2. Комбинируем экстремумы в правильном порядке
// 3. Проверяем больше типов паттернов
// 4. Добавляем фильтры по объему и времени
return result;
}
//+–+
//| Поиск точек разворота (swing points) |
//+–+
void FindSwingPoints(double &highs[], datetime &highTimes[],
double &lows[], datetime &lowTimes[],
int lookback = 5)
{
ArrayResize(highs, 0);
ArrayResize(highTimes, 0);
ArrayResize(lows, 0);
ArrayResize(lowTimes, 0);
for(int i = lookback; i < Bars(_Symbol, _Period) – lookback; i++)
{
// Проверяем swing high
bool isSwingHigh = true;
for(int j = 1; j <= lookback; j++)
{