Автор: Николай Камынин

При разработке программ для автоматической торговли в QUIK на языке QPILE возникает задача определения момента времени появления новой свечи и получение значений предыдущей.

Обычно , именно в момент закрытия свечи и открытия новой и принимается решение о выставлении или снятии заявки.

Привожу фрагмент программы показывающий, как определить в программе данный момент для графика с ИДЕНТИФИКАТОРом   RIZO:

~~~~~~~~~~~~~~~~~~~~~~

NEW_GLOBAL(«CANDLE_OLD»,»   «) ‘предыдущая свеча

FLAG=0  ‘ флаг новой свечи

X_=GET_VALUE(GET_DATETIME (),»DATETIME»)

Date=SUBSTR (X_,6,4) & SUBSTR (X_, 3,2) & SUBSTR (X_, 0,2) ‘текущая дата

Time=SUBSTR (X_,11,2) & SUBSTR (X_, 14,2) & SUBSTR (X_, 17,2) ‘текущее время

CANDLE = (GET_CANDLE_EX («RIZO», Date, Time)

IF (GET_VALUE (CANDLE,»TIME»)-GET_VALUE (CANDLE_OLD,»TIME») <>0)  ‘свеча новая

FLAG=1     ‘ флаг равен 1 в момент появления новой свечи на графике

END IF

‘ добавить в конце программы

IF (FLAG=1)  ‘запоминаем новую свечу

CANDLE_OLD= CANDLE

END IF

~~~~~~~~~~~~~~~~~~~~~~~~

Кроме того на графике выберите “параметры графика”   — можно правой кнопкой мышки

И в  закладке ДОПОЛНИТЕЛЬНО в окне ИДЕНТИФИКАТОР запишите   RIZO

На основе данного фрагмента не трудно  написать программу получения свечи по любому номеру, считая от последней.

Внимание: В тексте программы использованы русские кавычки »

при копировании в QPILE замените их на обычные.

Успехов в учебе

Tags: , , ,

This entry was posted on Четверг, 14 октября, 2010 at 07:12 and is filed under QUIK и QPILE, торговые роботы (МТС). You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

6 comments so far

Kobalt
 1 

Чему должен быть равен период пересчета портфеля что бы на минутках было ясно что свеча сформировалась? И что означают эти значения SUBSTR (X_, 17,2)?

19 декабря, 2010 at 01:34
Kamynin
 2 

1)Период пересчета Вы задаете исходя из желаемой загрузки процессора .
Если отставание времени сервера от времени компьютера не возникает, то время пересчета можно установить минимальное 1 сек. Это означает, что Вы обнаружите появление новой свечи с задержкой не более 1 сек.
При сильной загрузке время расчета можно увеличить до 10 секунд.
2) SUBSTR(x_,17,2) -выделяет из строки x_ начиная с 17 символа 2 символа.

20 декабря, 2010 at 09:16
Kobalt
 3 

Т. е. если мы пересчитываем портфель каждую секунду и при работе функции времени вычисляем секунды, ваш алгоритм будет считать каждую секунду значения внутри свечи и как только у нас изменятся значения мы получем флаг = 1 хотя новая свеча еще не появилась. Как же сделать так что бы максимально быстро получить сигнал о новой свече?

19 декабря, 2010 at 02:04
Kamynin
 4 

Добрый день!
Дело в том, что функция GET_CANDLE_EX всегда возвращает время начало свечи, а не текущее время.
Т.е. если на тайме 10 мин свеча создана в 10:30, то при считывании параметров свечи по текущему времени от 10:31 до 10:39 функция GET_CANDLE_EX будет возвращать 10:30.
В том момент, когда на графике появится новая свеча, время возвращенное функцией GET_CANDLE_EX изменится и для нашего примера станет 10:40. В этот момент Вы и обнаружите новую свечу.

20 декабря, 2010 at 09:11
meteop
 5 

А зачем думать об отставании времени компьютера, если можно использовать GET_INFO_PARAM(«SERVERTIME») вместо GET_DATETIME () и получать время сервера а не локальное?

28 февраля, 2011 at 15:26
Mr. Foggs
 6 

Реализовал этот код в роботе… лучше, чем без него, но я поставил еще и счетчик прохода скрипта, который обнуляется при появлении новой свечи. Картина получилась подозрительная типа: 1, 2, 3, 1, 2, 3, 4 … 59. Или бывает 1, 2, 1, 2, 3 … 59. А бывает и 1 … 59. Николай, кстати, код этого я вам выслал — если прочитаете комментарий — пожалуйста скажите свое мнение. Спасибо!

17 февраля, 2012 at 22:37