Торговый робот. Шаг за шагом. Шаг 3. / QUIK Profit
Главная Quikprofit twiiter Quikprofit Rss

Торговый робот. Шаг за шагом. Шаг 3.

Апрель 26, 2010 | 9 комментариев

Шаг 3. Получаем данные из Quik.

Продолжаем серию статей о создании собственного робота, используя встроенный язык QPile.

Исходя из выбранной в первой статье торговой стратегии, необходимые для анализа данные мы будем получать из графика. Из первого урока вспомним какие данные нам понадобятся: Используемые переменные:

  1. Короткая ЕМА (ЕМА_1) для последней закрытой свечи;
  2. Длинная ЕМА (ЕМА_2) для последней закрытой свечи;
  3. Текущее значение AC (АС_С) в незакрытой свече
  4. Значение АС в последней закрытой свечи (АС_С_1).

Таким образом, нам будут нужны данные для текущей незакрытой свечи и для последней закрытой свечи.

Наш урок будет построен по следующему сценарию:

  1. Настраиваем график к передаче информации.
  2. Прикрепляем необходимые функции к телу программы.
  3. Присваиваем переменным значения индикатора в заданных свечках.
  4. Редактируем таблицу вывода на экран.
  5. Собираем весь код воедино и проверяем.

Итак, поехали !…

1. Настраиваем график к передаче информации.

Чтобы получить данные с определенного графика, этот график нужно настроить соответствующим образом. Таковы требования языка QPile

Согласно нашей стратегии нам необходим график по акции СБЕРБАНК с таймфреймом 15 минут и добавленными к нему индикаторами: Moving Average (Exponential,9),  Moving Average (Exponential,25), AC. Более того, каждому индикатору на графике должно быть присвоено собственное уникальное имя.

Теперь все вышеизложенное по порядку.

  1. Для графика Сбербанк установим таймфрейм 15 минут.
  2. Добавим интересующие нас индикаторы и сразу дадим им названия:
    Индикатор//Название графика//Переменная

MovingAverage ( Exponential, 9)// “SBEREMA9”// EMA_1
MovingAverage ( Exponential, 25)// “
SBEREMA25”// EMA_2
AC// “
SBERAC”//AC_C и AC_C_1

Для того чтобы дать название индикатору, в параметрах индикатора выбираем закладку «Дополнительно». В поле «Идентификатор» вводим необходимое название, регистр не учитывается.

В итоге у нас получается подобная картинка на экране:

Далее переходим к следующему пункту.

2. Прикрепляем необходимые функции к телу программы.

Чтобы не ломать лишний раз голову, воспользуемся уже готовым решением. Речь далее пойдет о функциях, которые возвращают ассоциативный массив с данными для графика по номеру свечи (бара). Согласно нашей стратегии нам понадобятся две функции:

  1. fGetMA
  2. fGetAC

Сохраняем файлы fGetMA.qpl и fGetAC.qpl в папку с телом нашего робота, открываем файл с программой в редакторе и поехали…!

В заголовок программы добавляем строчку:
INCLUDE fGetMA.qpl, fGetAC.qpl;

Заголовок будет иметь вид:

1
2
3
4
5
PORTFOLIO_EX EMAvsAC;
DESCRIPTION Робот ЕМА и АС;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
INCLUDE fGetMA.qpl, fGetAC.qpl;

Важно! Файлы с функциями должны находиться в одной папке с файлом торгового робота.

Этого достаточно, чтобы в дальнейшем без проблем и сколько угодно раз использовать вышеуказанные функции в теле программы.

3. Присваиваем переменным значения индикатора в заданных свечках.

Прежде чем перейти к следующим действиям предлагаю подробней ознакомиться с синтаксисом функций fGetMA и fGetAC. Синтаксис для функций одинаков.

fGetMA(fSecCode, fIntervalCount, fInterval)

  • fSecCode - идентификатор графика индикатора, который является источником данных. Идентификатор графика, указывается в параметрах графика.
  • fIntervalCount - порядковый номер свечи. Отсчет производится в обратном порядке начиная с текущей не закрытой свечи (№1).
    • Текущая незакрытая свеча (после окончании торгов будет последняя закрытая свеча) — номер 1
    • Предыдущая свеча — номер 2
    • Предпредыдущая свеча — номер 3 и т.д.
  • fInterval - выбранный таймфрейм. Указывается в формате ММ (в минутах).

В нашем случае функция в действии будет выглядеть следующим образом:

fGetMA(SBEREMA9, 2,  15) – для короткой ЕМА (ЕМА_1)
fGetMA(SBEREMA25, 2,  15) – для длинной ЕМА (ЕМА_2)
fGetAC(SBERAC, 1, 15) – для АС_С в незакрытой свече
fGetAC(SBERAC, 2, 15) – для АС_С_1 в закрытой свече

Теперь переходим непосредственно к телу робота. Особенности языка QPile подразумевают получение данных с графика в 2 этапа:

  1. Создается массив данных, куда «поступают» данные из графика
  2. Получаем данные из только что созданного массива с данными.

Стоит уточнить, что данные с графика поступают в массив с определенным «ключом доступа», по которому затем они и извлекаются.

В нашем случае ключи доступа следующие:

MA_MAIN для функции fGetMA
AC_MAIN для функции fGetAC

Подробно разберем на примере одной переменной, остальные делаются по аналогии.

1. Создаем массив dataMA9 и записываем в него данные графика SBEREMA9 для 2й свечи с конца

dataMA9 = fGetMA(SBEREMA9, 2,  15)

2. Получаем данные из только что созданного массива

ЕМА_1 = get_value (dataMA9, «MA_MAIN») + 0

Последняя строка с кодом означает, что мы получаем данные из массива dataMA9 для ключа MA_MAIN и сразу указываем, что это числовое значение (+0).

Задаем переменные:

1
2
3
4
5
6
7
8
9
10
11
12
'Короткая ЕМА (ЕМА_1) для последней закрытой свечи
dataMA9 = fGetMA("SBEREMA9", 2,  15)
EMA_1 = get_value (dataMA9,"MA_MAIN")+0
'Длинная ЕМА (ЕМА_2) для последней закрытой свечи
dataMA25 = fGetMA("SBEREMA25", 2,  15)
EMA_2 = get_value (dataMA25,"MA_MAIN")+0
'Текущее значение AC (АС_С) в незакрытой свече
dataAC1 = fGetAC("SBERAC", 1,  15)
AC_C = get_value (dataAC1,"AC_MAIN")+0
'Значение АС в последней закрытой свечи (АС_С_1)
dataAC2 = fGetAC("SBERAC", 2,  15)
AC_C_1 = get_value (dataAC2,"AC_MAIN")+0

Таким образом,  код нашего робота будет иметь вид:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
PORTFOLIO_EX EMAvsAC;
DESCRIPTION Робот ЕМА и АС;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
INCLUDE fGetMA.qpl, fGetAC.qpl;
 
PROGRAM
'Наш первый Портфель на основе ЕМА и АС
'Версия 0.1
DELETE_ALL_ITEMS () 'Благодаря этой функции из таблицы будут удалены старые значения.
'Короткая ЕМА (ЕМА_1) для последней закрытой свечи
dataMA9 = fGetMA("SBEREMA9", 2,  15)
EMA_1 = get_value (dataMA9,"MA_MAIN")+0
'Длинная ЕМА (ЕМА_2) для последней закрытой свечи
dataMA25 = fGetMA("SBEREMA25", 2,  15)
EMA_2 = get_value (dataMA25,"MA_MAIN")+0
'Текущее значение AC (АС_С) в незакрытой свече
dataAC1 = fGetAC("SBERAC", 1,  15)
AC_C = get_value (dataAC1,"AC_MAIN")+0
'Значение АС в последней закрытой свечи (АС_С_1)
dataAC2 = fGetAC("SBERAC", 2,  15)
AC_C_1 = get_value (dataAC2,"AC_MAIN")+0
Massiv = CREATE_MAP() 'Создали массив с названием Massiv
Last_price = GET_VALUE(GET_PARAM_EX("EQBR","SBER03","last"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту
Massiv = SET_VALUE(Massiv,"SecCode","СБЕРБАНК") 'Записали в массив наименование инструмента
Massiv = SET_VALUE(Massiv,"LastPrice", Last_price) 'Записали в массив цену последней сделки по инструменту
ADD_ITEM(0, Massiv)
END_PROGRAM
 
PARAMETER SecCode;
PARAMETER_TITLE Инструмент;
PARAMETER_DESCRIPTION Наименование инструмента;
PARAMETER_TYPE String(10);
END
PARAMETER LastPrice;
PARAMETER_TITLE Цена;
PARAMETER_DESCRIPTION Цена последней сделки по инструменту;
PARAMETER_TYPE Numeric(10,2);
END
 
END_PORTFOLIO_EX

4. Редактируем таблицу вывода на экран

До настоящего момента на экран у нас выводилась таблица с данными о цене последней сделке. Сейчас предлагаю повысить информативность выводимой на экран таблицы. Добавим в нее столбцы с данными переменных.

Для этого в созданный ранее массив с названием Massiv добавляем сведения о наших переменных.

1
2
3
4
Massiv = SET_VALUE(Massiv,"EMA_1", EMA_1)
Massiv = SET_VALUE(Massiv,"EMA_2", EMA_2)
Massiv = SET_VALUE(Massiv,"AC_C", AC_C)
Massiv = SET_VALUE(Massiv,"AC_C_1", AC_C_1)

Ну и добавляем соответствующие столбцы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PARAMETER EMA_1;
PARAMETER_TITLE ЕМА_1;
PARAMETER_DESCRIPTION MovingAverage с параметрами Exponential, 9;
PARAMETER_TYPE Numeric(10,6);
END
PARAMETER EMA_2;
PARAMETER_TITLE ЕМА_2;
PARAMETER_DESCRIPTION MovingAverage с параметрами Exponential, 25;
PARAMETER_TYPE Numeric(10,6);
END
PARAMETER AC_C;
PARAMETER_TITLE АС незакрытой свечи;
PARAMETER_DESCRIPTION АС незакрытой свечи;
PARAMETER_TYPE Numeric(10,6);
END
PARAMETER AC_C_1;
PARAMETER_TITLE АС закрытой свечи;
PARAMETER_DESCRIPTION АС закрытой свечи;
PARAMETER_TYPE Numeric(10,6);
END

5. Собираем весь код воедино и проверяем.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
PORTFOLIO_EX EMAvsAC;
DESCRIPTION Робот ЕМА и АС;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
INCLUDE fGetMA.qpl, fGetAC.qpl;
 
PROGRAM
'Наш первый Портфель на основе ЕМА и АС
'Версия 0.1
DELETE_ALL_ITEMS () 'Благодаря этой функции из таблицы будут удалены старые значения.
'Короткая ЕМА (ЕМА_1) для последней закрытой свечи
dataMA9 = fGetMA("SBEREMA9", 2,  15)
EMA_1 = get_value (dataMA9,"MA_MAIN")+0
'Длинная ЕМА (ЕМА_2) для последней закрытой свечи
dataMA25 = fGetMA("SBEREMA25", 2,  15)
EMA_2 = get_value (dataMA25,"MA_MAIN")+0
'Текущее значение AC (АС_С) в незакрытой свече
dataAC1 = fGetAC("SBERAC", 1,  15)
AC_C = get_value (dataAC1,"AC_MAIN")+0
'Значение АС в последней закрытой свечи (АС_С_1)
dataAC2 = fGetAC("SBERAC", 2,  15)
AC_C_1 = get_value (dataAC2,"AC_MAIN")+0
Massiv = CREATE_MAP() 'Создали массив с названием Massiv
Last_price = GET_VALUE(GET_PARAM_EX("EQBR","SBER03","last"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту
Massiv = SET_VALUE(Massiv,"SecCode","СБЕРБАНК") 'Записали в массив наименование инструмента
Massiv = SET_VALUE(Massiv,"LastPrice", Last_price) 'Записали в массив цену последней сделки по инструменту
Massiv = SET_VALUE(Massiv,"EMA_1", EMA_1)
Massiv = SET_VALUE(Massiv,"EMA_2", EMA_2)
Massiv = SET_VALUE(Massiv,"AC_C", AC_C)
Massiv = SET_VALUE(Massiv,"AC_C_1", AC_C_1)
ADD_ITEM(0, Massiv)
END_PROGRAM
 
PARAMETER SecCode;
PARAMETER_TITLE Инструмент;
PARAMETER_DESCRIPTION Наименование инструмента;
PARAMETER_TYPE String(10);
END
PARAMETER LastPrice;
PARAMETER_TITLE Цена;
PARAMETER_DESCRIPTION Цена последней сделки по инструменту;
PARAMETER_TYPE Numeric(10,2);
END
PARAMETER EMA_1;
PARAMETER_TITLE ЕМА_1;
PARAMETER_DESCRIPTION MovingAverage с параметрами Exponential, 9;
PARAMETER_TYPE Numeric(10,6);
END
PARAMETER EMA_2;
PARAMETER_TITLE ЕМА_2;
PARAMETER_DESCRIPTION MovingAverage с параметрами Exponential, 25;
PARAMETER_TYPE Numeric(10,6);
END
PARAMETER AC_C;
PARAMETER_TITLE АС незакрытой свечи;
PARAMETER_DESCRIPTION АС незакрытой свечи;
PARAMETER_TYPE Numeric(10,6);
END
PARAMETER AC_C_1;
PARAMETER_TITLE АС закрытой свечи;
PARAMETER_DESCRIPTION АС закрытой свечи;
PARAMETER_TYPE Numeric(10,6);
END
 
END_PORTFOLIO_EX

Загружаем портфель в Quik  и смотрим результат!

У меня получилось! Получится и у вас!

P.S. Вы можете скачать представленный код одним файлом EMAvsAC_Lesson3

Понравилось? Следите за обновлениями по RSS! Также можете следить за обновлениями в Twitter.
* * *     2 проголосовавших

Комментарии

9 ответов to “Торговый робот. Шаг за шагом. Шаг 3.”

  1. Александр
    Май 27th, 2010 @ 15:00

    Вы предлагаете использовать две функции
    fGetMA и fGetAС, при этом ссылка на первыую функцию не работает (нет такой странице), а за вторую просите денег. В тексте хотябы указали, что эти функции платные.
    А лучше бы создали пример без этих функций, а то как то не очень красиво получается.
    100 руб не жалко, но хочется понимать, что дальше не будут просить денег за функции.
    Предлагаете запустить, а нельзя.
    Или сказали, что курс платный соит стольк-то и в эту цену входит оплата ВСЕХ дополнительных программ.

  2. Ю.Р.
    Май 27th, 2010 @ 22:03

    Здравствуйте Александр!

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

    P.S. Ссылка на функцию fGetMA доступна.

  3. Игорь
    Июнь 7th, 2010 @ 17:31

    Присоединяюсь к комментарию Александра. Малость непорядочно получается, так сказать «заманить» в интересный по сути Курс, но не предупредить, что вспомогательные материалы к нему платные, не честно, даже с коммерческой точки зрения… И без приобретения вышеуказанных доп.функций дальнейшая практичность Курса становится нулевой, т.к. опубликованные примеры не протестировать…
    P.S. ухожу с Курса на 3-м шаге с неприятным осадком…

  4. Ю.Р.
    Июнь 8th, 2010 @ 13:31

    На стартовой странице проекта имеется упоминание о «платности» дополнительных элементов, так как они являются результатами нашего труда.

  5. Борис
    Июнь 30th, 2010 @ 17:45

    Здравствуйте,Ю.Р. хочу купить у вас функции fGetMA , fGetAC через банковский платеж, в квитанции указано «покупка чеков WMR для оплаты заказа»,вопрос:
    1. как после оплаты вы узнаете за что я заплатил и вышлите мне функции на электронный ящик?
    2.Что я должен делать после оплаты в банке?
    3.Через какое время вы вышлите мне функции?

  6. Ю.Р.
    Июль 8th, 2010 @ 21:44

    Здравствуйте, Борис!
    Система оплаты и получения ссылки на скачивание полностью автоматизированна. По получению денежных средств, система автоматически сформирует ссылки и отправит письмо на указанную при оплате электронную почту.

  7. Владимир
    Июль 26th, 2010 @ 18:28

    Как присвоить имя индикатору АС для закрытой свечи понятно. Только не указаны какие должны быть параметры. А как присвоить имя индикатору для незакрытой свечи? Или для этого нужно все параметры положить равными нулю?

  8. Ю.Р.
    Июль 26th, 2010 @ 21:34

    ‘Текущее значение AC (АС_С) в незакрытой свече
    dataAC1 = fGetAC(«SBERAC», 1, 15)
    AC_C = get_value (dataAC1,»AC_MAIN»)+0

  9. Борис
    Октябрь 6th, 2010 @ 13:05

    Здравствуйте,Ю.Р. я оплатил 2 функции fGetMA , fGetAC ,подтверждение платежа пришло сегодня в 11.38,но ссылка на скачивание не пришла, хотелось бы уточнить через какой промежуток времени придет ссылка и не обман ли это?

Оставить комментарий





Поля помеченные (*) обязательны к заполнению

Страница 1 из 11
  • Меню

  • Облако тегов

  • Рубрики

  • Для пользователя