Добрый день.
Для того чтобы решить какую-либо задачу, необходимо разбить ее на множество мелких подзадач, каждая из которых является неким элементарным действием. Применительно к этой задаче нужно исходить из того, что максимум и минимум цен вычисляются при помощи функций
iHighest и
iLowest. Причем функции возвращают только индекс бара экстремума. Чтобы получить значение экстремума необходимо к результату применить функции
iHigh и
iLow соответственно.
Для функций iHighest и iLowest необходимо знать, с какого бара начинать поиск. Так как поиск производится справа налево по графику, то нужно знать индекс крайнего правого бара интервала. К нему будет добавлено количество баров, составляющих интервал. Чтобы найти это количество, потребуется найти индекс бара, являющегося крайним левым баром интервала по графику. В итоге приходим к следующему алгоритму:
1. Найти индексы баров нужного таймфрейма, составляющие границы интервала.
2. Вычислить длину интервала (разность значений найденных в п. 1).
3. Найти индекс бара экстремума интервала.
4. Определить значение экстремума по индексу бара из п. 3.
Причем п. 1 разбивается еще на две задачи:
1.1 Найти индекс бара левой границы интервала - первый бар текущего дня.
1.2 Найти индекс бара правой границы интервала - бар текущего дня с указанным временем.
Решение для п. 1.1 (пройти все бары, начиная от текущего, до того бара, у которого номер дня в году не будет равен номеру текущего дня в году):
цитата: |
int currentDay = TimeDayOfYear(TimeCurrent()); int total = iBars(NULL, i_usedTF); for (int i = 1; i < total; i++) { datetime barTime = iTime(NULL, i_usedTF, i); if (TimeDayOfYear(barTime) != currentDay) return i - 1; } |
|
Решение для п. 1.2 (пройти все бары, начиная от текущего, до того бара, у которого количество минут за текущий день меньше или равно количеству минут за день заданного времени):
цитата: |
rightBarIndex = -1; int total = iBars(NULL, i_usedTF); for (int i = 1; i < total; i++) { int dayMinutes = TimeHour(barTime) * 60 + TimeMinute(barTime); datetime nextBarTime = iTime(NULL, i_usedTF, i - 1); int nextBarMinutes = TimeHour(nextBarTime) * 60 + TimeMinute(nextBarTime); if (dayMinutes <= specifiedMinutes && nextBarMinutes > specifiedMinutes) return i; } |
|
Эти два пункта объединяем в одну функцию GetIntervalsLimits (см. ссылку на код скрипта ниже).
Решение для п. 2 (dayBeginBar - начальный бар дня, daySpecifiedBar - бар, соответствующий искомому времени дня):
цитата: |
int cnt = dayBeginBar - daySpecifiedBar + 1; |
|
Решение для п. 3 (на примере максимума):
цитата: |
int highBar = iHighest(NULL, i_usedTF, MODE_HIGH, cnt, daySpecifiedBar); |
|
Решение для п. 4:
цитата: |
double high = iHigh(NULL, i_usedTF, highBar); |
|
Исходный код скрипта, решающего поставленную задачу -
здесь.
Ну и в процессе решения задачи не стоит забывать о проверке корректности исходных данных и доступности данных заданного таймфрейма.