Главная Quikprofit twiiter Quikprofit Rss

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

Июль 19, 2010 | 3 комментариев

Шаг 7. Проскальзывание.
Сильные движения на рынке частенько сводят на нет старания многих торговых роботов, если применяется рыночная заявка. Причиной тому является ПРОСКАЛЬЗЫВАНИЕ.
О том, что это такое и как с этим явлением бороться, пойдет речь в сегодняшнем уроке…

Проскальзывание — это количество рыночного движения с момента размещения торгового приказа (в случае стопа — с момента его срабатывания) до момента его исполнения.

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

Что же делать?

Одним из самых простых способов избежать подобной ситуации – выставить защитный спрэд. А для большей надежности добавить функцию, отменяющую в нужный момент активные заявки по инструменту.

Добавляем защитный спред

В нашем роботе (описание см Урок 1), согласно техническому заданию, робот применял простыне рыночные заявки. То есть выставлял заявки по лучшей цене в стакане. «Полевые испытания» робота показали, что заявка по рынку не всегда гарантирует исполнение заявки в момент высокой волатильности рынка. И как результат заявки снова и снова выставляются роботом и «зависают» не исполненными.
Для устранения такого рода проблем будем учитывать проскальзывание цены. Проскальзывание можно считать в абсолютных величинах (пример: рубли) либо в относительных величинах (пример: проценты). Для каждого случая оптимальным будет тот или иной способ. Рассмотрим оба на примере нашего робота (далее по тексту Робот).
Робот в своем теле имеет 2 схожие строчки, отвечающие за отправку заявок.

1
2
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", 0, "B", 1)
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", 0, "S", 1)

в которых:

  • Account — Счет Депо. Указывается в любой заявке в поле «Торговый счет».
  • ClientCode — Код клиента. Это ваш номер (код) у брокера. Указывается в любой заявке в поле «Код Клиента».
  • Seccode — Код бумаги. Найти можно в таблице «Поиск по инструменту», столбец «Код инструмента».
  • Price – цена выставляемой заявки. Целая и дробная части разделяются точкой. Внимание! Для отправки рыночной заявки требуется указать нулевую цену.
  • Operation – направление сделки. Указывается латинскими буквами B (Buy/Покупка) или S (Sell/Продажа).
  • Quantity – количество лотов (контрактов).

В текущем уроке нас будет интересовать параметр Price. До настоящего момента в коде параметр price имел нулевое значение, что соответствовало отправке заявки по лучшей цене в стакане. Сейчас я предлагаю Вам попробовать три других варианта параметра price.

1. «Абсолютно выгодное предложение». Смысл стратегии заключается в том, что  заявки выставляются по заранее фиксированным ценам (разных для купли и продажи). При этом цена изначально является намного лучше рынка.

Пример. При рыночной цене акции Сбербанка в 80 руб. Робот выставляет заявки на покупку по 100 руб. и на продажу по 60 руб. соответственно.

Код в таком случае будет иметь вид:

1
2
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", 100.00, "B", 1)
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", 60.00, "S", 1)

Данный способ легок в исполнении, но имеет ряд существенных недостатков:

  • после изменения размера цен в коде придется перезагружать весь портфель.
  • присутствует некоторая бесконтрольность цен.

Внимание! Для следующих двух вариантов необходимо строку

1
«Last_price = GET_VALUE(GET_PARAM_EX("EQBR","SBER03","last"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту

(в конечном файле урока №6 идет под номером 85) переместить выше расчета значений PriceBuy и PriceSell. Оптимальным будет ее размещение под строкой

1
ToolQuantity = DEPO_CURRENT_BALANCE("ClientCode", "FirmId", "SBER03", "Account") +0

Также переменную Last_price следует перевести в разряд числовых переменных, добавив «+ 0» в конец строки.

2. Абсолютное отклонение от цены последней сделки. Смысл стратегии заключается в том, что цена для лимитированной заявки рассчитывается путем прибавления (вычитания) некоторой константы (в валюте цены) к последней цене сделки.

Пример. Константа Delta = 3 руб. При цене последней сделки для акций Сбербанка в 80 руб., цена на покупку составит 83 руб. (80+3), на продажу – 77 руб. (80-3)

Код в таком случае будет иметь вид:

1
2
3
4
5
Delta = 3 +0
PriceBuy = Last_price + Delta
PriceSell = Last_price - Delta
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", PriceBuy, "B", 1)
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", PriceSell, "S", 1)

Недостаток данного метода заключается в трудоемкости внесения изменений, аналогично варианту 1.

3. Относительное отклонение от цены последней сделки. Смысл стратегии заключается в том, что цена для лимитированной заявки рассчитывается путем прибавления (вычитания) некоторой относительной величины (%) к цене последней сделки.

Пример. Переменная Delta = 0,5%. При цене последней сделки для акций Сбербанка в 80 руб., цена на покупку составит 80,4 руб. (80+0,5%), на продажу – 79,6 руб. (80-0,5%)

Код в таком случае будет иметь вид:

1
2
3
4
5
Delta = 0.005 +0 ‘Соответствует 0,5%, то есть 0,5/100 = 0,005
PriceBuy = Last_price * (1+ Delta)
PriceSell = Last_price * (1 – Delta)
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", PriceBuy, "B", 1)
quote_res = fNewSimpleOrder("Account", "ClientCode", "SBER03", PriceSell, "S", 1)

Внимание! Quik чувствителен к точности чисел в заявке. То есть при выставлении цены 80.7893 для цен с точностью в два знака после запятой, заявка будет отвергнута системой за «несоответствие» цены. В избежание данной ошибки используем встроенную функцию APPLY_SCALE (Подробно можно узнать в руководстве пользователя Quik).

1
2
PriceBuy = APPLY_SCALE ((Last_price * (1+ Delta)), 2)
PriceSell = APPLY_SCALE ((Last_price * (1 - Delta)), 2)

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

Тексты кодов для варианта 2 и 3 можно скачать Lesson7.

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

Комментарии

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

  1. Денис
    Август 17th, 2010 @ 11:14

    Опробовал абсолютное отклонение при торговле в течении двух дней. Результат хороший. Проскальзываний не замечено ни разу.

    У меня есть одна проблемка: не могу никак настроить под торговлю на РТС Стандарт. Инструмент, код класса бумаги и т.д. указал вроде правильно. Запускается нормально и работает, но заявку не может послать.
    В файле ORDERS.QPL.TRANSACTION записывает строчку: «17.08.2010 11:15:07.144: RESULT: 0, RESULT_EX: 5, ORDERNUM: 0.000000, DESCRIPTION: УКАЗАННАЯ ТРАНЗАКЦИЯ ПО УКАЗАННОМУ КЛАССУ НЕ НАЙДЕНА: «RTSA15″.»
    В файле лога с именем текущей даты записывает: «[11:15:05] ОТКРЫТА ПОЗИЦИЯ ШОРТ. ВЫПОЛНЕНО УСЛОВИЕ ДЛЯ ЗАКРЫТИЯ ПОЗИЦИИ. СТАВИМ ЗАЯВКУ НА ПОКУПКУ
    [11:15:05] ПРОИЗОШЛА ОШИБКА. ЗАЯВКА НЕ ПРИНЯТА
    Помогите пожалуйста разобраться.

  2. Алекс
    Август 25th, 2010 @ 13:37

    Робот выставляет заявку, она проходит, но он ее не видит, пишет «ПРОИЗОШЛА ОШИБКА. ЗАЯВКА НЕ ПРИНЯТА» и выставляет снова. Где ошибка?

  3. Саша Талант
    Август 25th, 2010 @ 21:47

    К сожалению наши сотрудники не обладают даром ясновидения, чтобы по фразе «ПРОИЗОШЛА ОШИБКА. ЗАЯВКА НЕ ПРИНЯТА» понять в чем дело.
    Пришлите на info@quikprofit.ru 2 файла: ORDERS.QPL.TRANSACTION.LOG и Дата.log

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





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

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

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

  • Рубрики

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