Торговый робот «Автоматическое определение таймфрейма»
Мы часто используем универсальную функцию OHLC, для получения данных по какой-то определенной свече, будь то непосредственно карта OHLC, или объем, или время. Но в данной функции есть четкая привязка к определенному таймфрейму, и к определенному инструменту. И для того чтоб их поменять, требуется изменить настройки в торговом роботе, изменить настройки самого графика, и перезагрузить торгового робота в QUIK. Это правильно для системной работы: один раз настроил и не мешаешь роботу торговать. Но в некоторых торговых стратегиях требуется динамично управлять текущим интервалом на графике. Например при тестировании алгоритма, для поиска какого-то определенного параметра. Да много для чего можно использовать.
Реализован новый торговый робот опять же на доброй и проверенной годами функции OHLC — назовем ее OHLC2. Точнее из нее взят перебор времени для поиска конкретной свечи. Главное отличие в том, что в OHLC2 мы использовали функцию GET_CANDLE а в новой будем использовать GET_CANDLE_EX, нужное нам свойство которой — округлять заданное ей время до наименьшего, по которому есть свеча. Подробнее читайте в руководстве по языку.
Основная задача данного торгового робота — это определить таймфрейм на открытом графике инструмента. Инструмент задается тоже динамично — через идентификатор (свойства графика цены — вкладка дополнительно — идентификатор. В это поле записываем значение из переменной IDENTIFICATION в настройках робота). Как же нам искать таймфрейм? Берем текущее время и ищем самую последнюю свечу — функция GET_CANDLE_EX автоматически округляет в меньшую сторону время пока оно не совпадет с последней свечой. Запоминаем ее точное время. Затем от этого найденного точного времени отнимаем минимальный таймфрейм (единица) и опять ищем свечу. Функция GET_CANDLE_EX опять окрулгяет в меньшую сторону время пока не найдет свечу. Таким образом находим вторую свечу на графике, и опять запоминаем ее точное время. Остается вычесть из первого времени второе — и мы получаем значение текущего таймфрейма на графике!
Вот что получилось у меня:
В настройках у меня стоял поиск третьей свечи (текущая свеча, которая еще формируется — нулевая). В таблице мы видим карту OHLCV, значение текущего таймфрейма на графике, точное время и дату свечи. при включенном роботе, меняю таймфрейм на графике — и робот тут же его заново определяет и ищет нужную свечу. Единственное ограничение — таймфрейм от 1 до 60 минут.
Код торгового робота на QPILE доступен только зарегистрированным пользователям.

Отличный код! Один недостаток: появилась новая свеча и бывшая определенная свеча N должна сместится сразу на N+1. А смещение происходит лишь через 10-15сек. Очень критичное запаздывание. Если есть возможность как-то ускорить- скиньте в личку kalikazandr@mail.ru
Евгений Reply:
июня 5, 2011 at 15:49
Привет.
Не совсем понял по поводу смещения.
Kalikazandr Reply:
июня 7, 2011 at 10:52
Привет! Текущая свеча = 0 (в настройках), расчетная:NUMBER=3. Образовалась новая свеча, соответственно 3-я свеча сместилась на 1 в сторону 0 и значения OHLC (третьей свечи) должны измениться . Вот только происходит это со значительным запаздыванием(засекал-от 15 до 20сек)
Вот как то так)
Евгений Reply:
июня 7, 2011 at 17:52
Ааа. Понял, суть в том что при появлении новой свечи робот начинает цикл определения таймфрейма с самого начала.
Kalikazandr Reply:
июня 7, 2011 at 18:00
А как-то ускорить можно? очень долго))
Евгений Reply:
июня 7, 2011 at 18:36
Здесь два пути:
1. Если робот определил таймфрейм и по алгоритму последний не меняется — то больше модуль определения таймфрейма не работает, а работает обычный OHLC, у которого нет задержки.
2. Запустил у себя — у меня нет задержки такой. Попробуйте на другом компьютере запустить.
Kalikazandr Reply:
июня 8, 2011 at 14:41
Все наладил. Дело оказалось действительно в разнице времени с сервером.
Спасибо за участие
Евгений Reply:
июня 8, 2011 at 22:04
Отлично!
Евгений, приветствую!
Подскажите, как можно использовать функцию OHLC в других роботах? например я хочу вызвать ее передав ей переменную NUMBER
X = OHLC (1)
что я получу взамен? Коллекцию с именем Х или массив? как получить значения этого массива?
я пробую:
OPEN0= GET_VALUE (OHLC (0+1), «OPEN»)
OPEN1= GET_VALUE (OHLC (0+2), «OPEN»)
получаю нулевые значения
может быть функцию доработать командой RESULT создающей, например, коллекцию значений?
Евгений Reply:
января 12, 2012 at 19:26
Привет.
Использовать просто:
где NUMBER — номер свечи, OHLC которой надо найти.
OHLC (NUMBER)
И после такого вызова у вас появляются переменные:
OPEN, HIGH, LOW, CLOSE, VOLUME со значениями равными искомым. Которые сразу можно использовать как переменные.
Предварительно, так же как и в этой статье переменные нужно обнулить в блоке переменных.
Евгений Reply:
января 12, 2012 at 19:29
В догонку: функция как раз и избавляет пользователя от работы со всякими массивами и коллекциями, предоставляя готовые переменные с нужными значениями. Вот тут: www.hirobot.ru/2010/04/ka...grafika-2-chast/ та же функция, только без автоопределения таймфрейма. посмотрите, сразу после вызова OHLC (X) мы выводим искомые переменные в таблицу, и они несут числовые значения.