Форум » Консультации по программированию » Получение максимума цены за определенное время » Ответить

Получение максимума цены за определенное время

kot103: Здравствуйте подскажите как получить максимум или минимум за определенное время например на графике м5 к примеру время час дня нам надо узнать максимальную цену за период открытия торгового дня до например десяти часов тридцати минут как составить такую функцию которая будет вычислять максимум и минимум за определенный промежуток времени но не с нулевого бара.

Ответов - 4

Scriptong: Добрый день. Для того чтобы решить какую-либо задачу, необходимо разбить ее на множество мелких подзадач, каждая из которых является неким элементарным действием. Применительно к этой задаче нужно исходить из того, что максимум и минимум цен вычисляются при помощи функций 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); Исходный код скрипта, решающего поставленную задачу - здесь. Ну и в процессе решения задачи не стоит забывать о проверке корректности исходных данных и доступности данных заданного таймфрейма.

kot103: Здравствуйте, спасибо большое очень доступно пояснили. Но не могу разобраться с еще одной проблемой не могу понять, как получить значение цены определенного уровня объекта фибонанчи. Допустим эксперт нарисовал объект Фибо нужно получить значение цены уровня 1.618,функцию получения: описания уровня я нашел в справочнике, а вот чтоб цену уровня получить не как не могу найти, подскажите пожалуйста за ранее спасибо!

Scriptong: Напрямую ценовые значения уровней сетки или расширения Фибоначчи получить нельзя. Их требуется рассчитывать. Для этого потребуется получить цены начального и конечного уровней объекта: double price1 = ObjectGet(name, OBJPROP_PRICE1); double price2 = ObjectGet(name, OBJPROP_PRICE2); Это цены, соответствующие 0% и 100% сетки Фибоначчи, вне зависимости от реального наличия этих уровней у сетки. К сожалению, если неизвестно направление развертывания сетки, то точно узнать, какой из этих уровней 0%, а какой - 100%, не получится. После получения этих данных нам нужно определиться, цену какого уровня нужно рассчитать. Возьмем, к примеру, уровень 61.8%: double price618 = MathAbs(price1 - price2) * 61.8 / 100; Таким образом, мы нашли относительное положение уровня 61.8 на "шкале" сетки. Для нахождения абсолютного значения цены нужно знать направление сетки, т. е., какой из (price1; price2) является 0%. Если 0% - price1 и это значение больше, чем 100%, то искомая цена будет: double absPrice = price1 - price618; Если же price1 меньше price2 и 0% - это именно price1, то соответственно: double absPrice = price1 + price618;


kot103: Благодарю за ответ!



полная версия страницы