Появление новой свечи в торговых роботах
Во многих торговых стратегиях используется факт окончания свечи, например в системах теханализа распространен дефолтный выход на закрытии свечи. Что это значит? Что открытая позиция закроется аккурат на CLOSE текущей свечи. При тестах на истории это несомненно простая операция, а как применить это на практике в QUIK? Ведь получить программным методом факт закрытия свечи очень сложно: это для каждого таймфрейма отслеживать время, отделять минуты, проводить в ними операции, опять отслеживать время, и как только оно равно рассчитанному времени закрытия — проводить операцию. Универсальности в таком торговом роботе будет очень мало, т.к. для каждого таймфрейма расчет должен быть свой.
Как же выйти из этой ситуации? Пойдем дедуктивным путем. Что влечет за собой момент окончания текущей свечи? Правильно: появление новой свечи! И вот как раз этот момент определить очень легко. Достаточно запомнить точное время предыдущей и как только время текущей свечи не совпадает с временем предыдущей — значит празднуем рождение новой свечечки.
В предыдущей публикации мы уже рассматривали, как получить точное время текущей свечи. В этом нам помогает функция GET_CANDLE_EX. Код очень простой: сверяем время текущей свечи и последнее запомненное время. Как только не равно — присваиваем специальному флагу единичку. Этот флаг потом и используем. За источник времени берем любой индикатор, я взял самый распространенный — Moving Average, с любым периодом, это не важно (собственно говоря, идентификатор можно присвоить и непосредственно графику цены, эффект будет тот же, но я взял мувинг для примера). Присваиваем этому индикатору идентификатор, указанный в коде торгового робота в настройках (чтоб получать данные через функцию GET_CANDLE_EX). Запускаем. Как только робот определяе появление новой свечи он однократно пишет в таблице в поле «Свеча» сообщение «НОВАЯ!».
Код торгового робота на QPILE доступен только зарегистрированным пользователям.

Элегантно,Евгений Спасибо!
Евгений Reply:
марта 24, 2011 at 22:30
Вам спасибо.
Публикация ответила на вопрос, который вы мне в личку задавали?
Да все собралось,осталось сделать прогон робота на истории и поэксперементировать с заявками какие лучше стоп или лимитированые,но основная проблема была в определении начало свечи,это центральнный механизм в коде,
А на неликвидах новая свеча тоже будет сразу появляться, или только с очередной сделкой?
Евгений Reply:
марта 26, 2011 at 17:41
Привет.
По логике свеча состоит из тиков-сделок. Если сделки нет, а время подошло появиться новой свече — то и свеча не появится. Функция из этого робота получает точное время последней свечи, а если свечи нет, то и не покажет рождение соответственно. НО! Надо пробовать.
теперь для совсем тупых
т.е. робот использует любую среднюю для привязки ко времени?
в таком виде у меня реакции на сделки нет.
'========= ПОЛУЧАЕМ ВРЕМЯ ПОСЛЕДНЕЙ СВЕЧИ ИНДИКАТОРА
TIMECURRENTCANDLE=GET_VALUE (GET_CANDLE_EX (IDENTIFICATION_MA600, DATE, TIME),"TIME")+0
'========= ОПРЕДЕЛЕНИЕ НАЧАЛА СВЕЧИ
IF TIMECURRENTCANDLE<>TIMEPREVCANDLE AND TIMECURRENTCANDLE<>0
TIMEPREVCANDLE=TIMECURRENTCANDLE
NEWCANDLE=1
END IF
'========= ИСПОЛЬЗОВАНИЕ ФЛАГА НОВОЙ СВЕЧИ
IF NEWCANDLE=1
MESSAGE («RTS:НОВАЯ СВЕЧА»,1)
NEWCANDLE=0 ' ОБНУЛЯЕМ ФЛАГ
END IF
'========= ОТКРЫТИЕ ПОЗИЦИИ
IF ORDERCOUNT=0 AND TP=0 AND NEWCANDLE=1
' ENTER LONG
в чем ошибка не вижу. подскажите?
Евгений Reply:
августа 6, 2011 at 9:40
Привет.
Вы вначале обнуляете флаг NEWCANDLE, а потом пытаетесь сравнить его с единицей, поменяйте блоки местами.
Привет, Евгений
Спасибо за этот сайт, очень помогает.
Замечу, что сверять время как TIMECURRENTCANDLE<>TIMEPREVCANDLE может дать неверный результат. Использовал этот подход для формирования последней истории значений индикатора текущего, предыдущего, предпредыдущего... Так вот в quik'е, читая с графика индикатора, бывает мелькает сначала новое время, потом старое, затем снова новое
Скажем, для графика на 5-минутках (и на 1-минутках аналогично):
Текущее 10:30:01.453, на сервере 102959 — выдается значение на 10:25
Текущее 10:30:02.530, на сервере 103000 — выдается значение на 10:30 квик пересчитал индикатор, сменил его время.
Текущее 10:30:03.606, на сервере 102959 (!) — выдается значение на 10:25. Прыгнули в прошлое).
Текущее 10:30:04.714, на сервере 103001 — выдается значение на 10:30.
И далее нормализовалось, выдается без прыжков.
Здесь текущее — время по GET_VALUE (GET_DATETIME (), «DATETIME») — локального компа, как понимаю.
Время сервера — время по GET_INFO_PARAM («SERVERTIME»), без «:».
Т.е. играет полученное время сервера, а через него идет «старое» время с графика.
Так что лучше сравнивать как TIMECURRENTCANDLE > TIMEPREVCANDLE
betman Reply:
августа 6, 2011 at 10:49
условие сайт воспринял как тэг
Речь о TIMECURRENTCANDLE «не равно» TIMEPREVCANDLE с листинга кода.
Евгений Reply:
августа 6, 2011 at 21:52
Привет.
Ценное замечание!
Время индикатора мы получаем функцией TIMECURRENTCANDLE=GET_VALUE (GET_CANDLE_EX (IDENTIFICATION, DATE, TIME),"TIME")+0, где TIME и DATE
18.SERVERTIME=GET_INFO_PARAM («SERVERTIME»)
19.SERVERDATE=GET_INFO_PARAM («TRADEDATE»)
серверные. Эта функция округляет серверное время до ближайшего меньшего кратного таймфрему на графике.
Самый простой и хитрый способ избежать этих «скачков» увеличить серверное время на час
и тогда мы при запросе с таким временем всегда будем получать точное время последней свечи
betman Reply:
августа 6, 2011 at 23:02
Ага), вот тольк если б все ради новой свечки. Время сервера много где задействовано обычно. Вообще, думаю, буду по return'у избегать таких сбоев, отслеживая уже его. Впрочем, это не по теме статьи).
подскажите в чем проблема
пытаюсь получить значение цены открытия текущей свечи а показывает значение предыдущей...
'========= ПОЛУЧАЕМ ДАННЫЕ ПО БУМАГЕ
OPEN=GET_VALUE (GET_PARAM_EX (CLASSCODE,INSTRUMENT,"OPEN"),"PARAM_VALUE")+0
после вывода в таблицу идет предыдущее значение...
Или до окончания свечи нельзя снять показания? Спасибо
Евгений Reply:
сентября 27, 2011 at 19:28
Привет.
В таблице «текпараметров» OHLC за целый день, там нет привязки к таймфрейму. Значение открытия текущей свечи по-простому можно получить так:
OPEN=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX (IDENTIFICATION, DATE, TIME),"LINES"),0),"OPEN")+0
где, IDENTIFICATION, DATE, TIME — идентификатор графика, текущее серверное время и серверная дата. Точнее — эта функция выдаст «открытие» свечи, которая является последней на указанное время и дату
, а т.к. время и дата у нас текущие — значит и свеча текущая.