Главная > Торговый робот > Торговый робот для QUIK — Defender

Торговый робот для QUIK — Defender

4 июня 2009

стоплосс для quik«Defender» — в переводе «Защитник» и имя легендарного внедорожника. Я выбрал это название для торгового робота потому, что его две основные и единственные функции выставлять тэйкпрофит и стоплосс в виде стоп-заявок при открытии вручную позиции. Т.е. открываем длинную позу по определенному инструменту, как только заявка исполняется полностью — наш торговый робот отправляет в систему два стопордера на продажу с ценой стопа — N пунктов от цены совершения сделки для стопа, и + N пунктов соответственно для тэйкпрофита. Все параметры этого торгового робота настраиваемые. Меньше слов — больше кода (редакция кода от 3 марта 2010 года):

Код на QPILE доступен только зарегистрированным пользователям.

Сразу предупреждаю, торгового робота я не проверял, возможно понадобятся доработки «под себя», и если Вы внимательные читатели моих уроков :) вы без труда справитесь с этими доработками. Скачать торговый робот можно в виде файла. Кстати, посмотрите предложения спонсоров, встречаются очень интересные!

Евгений Торговый робот , ,

  1. Катя
    5 Июнь 2009 в 13:05 | #1

    Спасибо за код:)

    Пордскажите ,пожалуйста, безопасный способ тестировать роботов на текущих торгах. Как-то страшно открывать и чужой и свой код на реальном счете, вдруг какой портак и появятся убытки или куча каких-нибудь неадыкватных заявок. Вчера прочитала на quik.ru как один чел тестировал свой код и у него программа выставила 12 тыс заявок — его счет заблокировал брокер потом.

    Вариант конечно оставить маленькую сумму на площадке на которой тестируешь робота, но вот с брокером это косяков не решает.

  2. Евгений
    5 Июнь 2009 в 13:51 | #2

    Самый безопасный — это открыть учебный счет. Да там котировки несколько отличаются от реальных, но тем не менее алгоритмы можно проверить. Что касается торгов на РТС вот ссылка: www.rts.ru/a14068 там перечень компаний которые оказывают услуги по предоставлению учебного доступа. От себя рекомендую БК «Открытие», у них можно попросить определенный инструмент, лимит. и пр. Я всегда всех роботов вначале тестирую на их учебных счетах. Удачи!

    Евгений Reply:

    ой, не в ту ветку отправил.

    П.С. 12 тыс. заявок — это круто:)

  3. Александр
    6 Июнь 2009 в 12:46 | #3

    по-моему,при TP<0 (т.е при короткой позиции) STOP логичнее прибавить к PRICE,а ТЭЙК отнять.))

    Евгений Reply:

    Согласен, логичнее :) :):) На самом деле код написал минут за 15, на это внимания не обратил. Щас поправлю.

  4. Graf345
    8 Июнь 2009 в 22:43 | #4

    ругается на 40 строку, unknow identifier TP

    Евгений Reply:

    После TPROFIT=200 вставьте TP=0

  5. Дмитрий
    9 Июнь 2009 в 08:36 | #5

    Евгений, а можно в двух словах: какие преимущества у выставления 2-х лимитных заявок перед стопом со связанной заявкой?

    Евгений Reply:

    да никаких, кому как удобнее.

  6. Graf345
    10 Июнь 2009 в 10:55 | #6

    про ТР=0 уже догадался , но скрипт все равно не работает, ошибка пропала, время в таблицу и дату выводит а заявки не ставит

  7. Сергей
    10 Июнь 2009 в 12:28 | #7

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

  8. Евгений
    10 Июнь 2009 в 18:09 | #8

    Выложил новую версию.

    Добавил в таблицу параметры цена сделки — появляется тогда, когда есть хоть одно сделка.

    Цена для стопа и цена для тэйкпрофита — появляются тогда. когда робот отработал одно из условий. Особое внимание на правильность заполнения полек с аккаунтами, их можно взять из окна ввода новой заявки, или из таблицы ограничений по счетам (ФОРТС). Бывает так, что в коде аккаунта есть буква «О» а при переписывании ее меняют на ноль — проблема.

  9. Сергей
    11 Июнь 2009 в 12:55 | #9

    ругается на строку 6 — неверный формат описания портфеля, — отсутствует символ завершения формулы расчета ?

    Евгений Reply:

    Проверьте версию своего Квика, скорее всего она старая.

  10. Сергей
    11 Июнь 2009 в 13:31 | #10

    5.12.0.130

    Евгений Reply:

    Очень странно. Сейчас подгрузил в свой квик — не ругаецца, все нормально. Проверьте, может скопировали из окна неправильно? В окне кода есть справа вверху первая кнопка «view source» -она открывает код в текстовом редакторе, оттуда скопируйте... БОльше ничего предположить не могу. Отпишитесь по результату.

    Сергей Reply:

    Здравствуйте,Евгений!Загрузил, -работает. Но по прежнему, время, дату,текущие чистые позиции ставит,а вот расчитывать цену стопа и тейкпрофита ставить не хочет (ноль стоит), проверил заполнение полек аккаунта, -все верно.На вашем квике эта программа работает?, — выставляет стопы и тейкпрофиты?

    Евгений Reply:

    Эти цены (тэйк и стоп) он заполняет тогда, когда текпоз не равен нулю, иначе говоря это цены уже ВЫСТАВЛЕННЫХ лимитов стопов и тейкпрофита.

    Евгений Reply:

    И еще. В квике есть огромный функционал условных заявок, это в т.ч. и стоплосс, и тэйкпрофит со следящей функцией, и с уловиями привязки к определенной заявке. Это пример торгового робота — лишь пример организации построения алгоритмической схемы на QPILE, которую по аналогии можно доработать под свои нужды. Даже в этом рассматриваемом случае более эффективно вместо лимита для стоп-лосса нужно использовать классическую стопзаявку Квика.

    Проект HI ROBOT — образовательный, и задача которую я ставлю перед собой это донести основы и технические решения стандартных вопросов, которые возникают при программировании торговых роботов.

    Сергей Reply:

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

    Евгений Reply:

    Не надо извинений — тут как раз рабочий процесс))

    Уже нашел у себя ошибку: переменные PRICETPROFIT=0 и PRICEFORSTOP=0 — надо делать глобальными, ибо они каждый раз при итерации обнуляются. Обнулять их нужно в блоке где обнуляется FLAG.

    Вы тестировали в реале? Заявки выставляет, мессаги пишет?

    Сергей Reply:

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

    Евгений Reply:

    А мессагу MESSAGE («ВЫСТАВЛЯЮ СТОП И ТЭЙКПРОФИТ»,1) выкидывает?

    Сергей Reply:

    нет

    Евгений Reply:

    А при открытии позиции ТР в таблице меняет свое значение? Если меняет значит ОБЯЗАТЕЛЬНО выкинет мессагу. Каким инструментом работаете?

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

  11. Евгений
    15 Июнь 2009 в 22:04 | #11

    Выложил версию 1.3. Теперь выставляются стопордера, это более правильно. Учтен ряд замечаний. Если вы используете тестовый счет, то у например «Открытия» инструмент должен называться не «RIU9» а «RTS-9.09» иначе не работает. Обязательно правильно настроить аккаунты, на тестовом счетет «Открытия» они оба одинаковы и их лучше скопировать из окна ввода заявки.

    Тестируйте и пишите результаты, так быстрее научитесь :)

  12. Сергей
    16 Июнь 2009 в 12:00 | #12

    Потестировал версию 1.3. на учебном счете в «Открытие», инструмент распознает «RIU9» (при «RTS-9.09» тишина) аккаунты проверял и оба одинаковы ,и разные, при открытии позиции ТР меняет свое значение, мессага не выкидывается, цена сделки выставляется, а стопордера нет.

    Евгений Reply:

    Мне уже самому интересно стало)) Завтра на учебном счете протестирую сам.

    Насчет инструмента — буквально вчера пробовал другого робота своего с РИМ9 — не видит, увидел только «RTS-9.09», как-то странно. У нас ведь не могут счета работать по разному.

    Виталий Reply:

    Отзывается только на RTS-9.09 цена сделки есть, количество текущей чистой позиции есть, цена стопа и тп ноль. Брокер Алор

  13. Евгений
    17 Июнь 2009 в 13:58 | #13

    Как обещал — новая версия. Протестировал на учебном счете «Открытия». Проблема заключалась в том, что видимо на учебном/ых счете/ах несогласованно название инструмента: когда мы получаем ТР надо указывать «RIM9» (указал в коде явным образом, можно назначить переменную), а в отправле транзакций «RTS-9.09». Этот код при открытии позиции у меня выставляет два стоп-лимита. Обратите внимание, что при срабатывании какого-то стоп лимита. второй не снимается. Как я говорил раньше этот код — шаблон, который необходимо дорабатывать под себя.

    П.С. Обратите внимание на спонсоров проекта :)

  14. Сергей
    18 Июнь 2009 в 12:28 | #14

    Евгений,потестировал на учебном счете,единственно после выставления стоп-лимитов цена сделки обнуляется,а так же стопы выставляются по результатам одной сделки, а уже следующую сделку,совершенную через некоторое время не обрабатывает(стопы не выставляет, хотя величина чистой позиции изменяется).Большое спасибо за помощь, (сегодня или завтра отправлю на кошелек спонсорскую помощь).А на реальном счете будет ли что-нибудь менятся в коде программы (по кодам торгуемых инструментов?)

  15. Евгений
    18 Июнь 2009 в 12:53 | #15

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

    При торговле на реальном счете скорее всего нужна будет корректировка наименований инструментов и номеров аккаунта.

    За помощь спасибо, но можно не перечислять а ознакомиться с информацией спонсоров :) Например на главной странице.

    Виталий Reply:

    Друзья. У меня так и не получилось попробывать. Ситуация таже. Цена сделки меняется а заявки не ставятся...

    Евгений Reply:

    Счет тестовый? Какой брокер? Коды инструментов менять пробовали? Аккаунт правильный?

    Код 100% рабочий — гарантирую.

  16. Виталий
    18 Июнь 2009 в 20:19 | #16

    Счет реал. Брокер Алор. Работает только с RTS-9.09. Аккаунт правильный. В работоспособности кода я не сомневаюсь, понимаю, что проблема во мне и неспособности его настроить.

    Евгений Reply:

    Как вы определили что работает с RTS-9.09? Попробуйте поставить апостроф перед INSTRUMENT="RTS-9.09" чтоб так получилось: ' INSTRUMENT="RTS-9.09" и запустить робота снова.

  17. Виталий
    18 Июнь 2009 в 21:08 | #17

    Не отображается цена сделки.

    Евгений Reply:

    В смысле не отображается? Если вы поставили апостроф — это не влияет на отображение цены сделки...

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

    Виталий Reply:

    Все сделал.В таблицах квика сделка проходит. Ни каких дополнительно заявок нет и в таблице робота только время идет. Даже не отображается цена. Может ли влиять на портфель то что я пользуюсь приводом кликовым с выводом по DDE

    Евгений Reply:

    DDE никак не влияет. У вас проблема с названием инструмента. Пробуйте варианты с названием. В строке 21 название указано явным образом, можно заменить на переменную.

    Сделайте так:

    INSTRUMENT1="RIU9"

    INSTRUMENT2="RTS-9.09"

    и эти переменные подставляйте в коде вместо INSTRUMENT. Таких мест всего 3: 21 строка, 50, 88. Я просто не знаю как брокер «Алор» выставляетс требования к названиям. Например у меня в реал «БКС», так везде надо указывать «RIU9», а на «Открытии» по другому немного.

  18. Виталий
    18 Июнь 2009 в 21:21 | #18

    Внутри кода нужно, что то менять помимо размера стоплосса и тейпрофита. Вот к примеру мне нужно 80 и 40, я правильно понял, что я просто их подставляю в соответствующие строчки?

    Евгений Reply:

    Да, просто подставить. Менять нудно только аккаунты и код инструмента.

  19. Сергей
    19 Июнь 2009 в 12:16 | #19

    программа хорошая, но нужно, как то вопрос с проскальзыванием решать на стопе.

    Евгений Reply:

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

    В случае с нашим роботом — это шаблон, который показывает алгоритм выставления заявок, который надо подгонять под себя. Задавайте в форуме конкретный вопрос, будем совместно разбирать. Удачи! :)

  20. dimapv
    23 Сентябрь 2009 в 23:37 | #20

    Defender 1.7 что-то неработает. в таблицу выводится только время, все остальное по нулям. есть где-то описание, как прогу правильно подключить? Хотя, думаю, что дело в коде... демо счет в БКС.

    Евгений Reply:

    Думаю проблема в наименовании инструмента. В коде два варианта, попробуйте оба варианта.

  21. olegpronin777
    18 Ноябрь 2009 в 22:57 | #21

    Хотел бы поинтересоваться, на тестовом счете реально ли запустить вообще какой-нибудь бот? Какой именно следует вводить инструмент?

    Евгений Reply:

    Не только можно. но и нужно!

    Я настоятельно рекомендую начинать использовать любого робота вначале на тестовом счете. Разница между тестовым счетом и реальным:

    1. Виртуальность денег и расчетов

    2. Небольшая разница в котировках

    В остальном это такой же квик.

  22. olegpronin777
    20 Ноябрь 2009 в 11:38 | #22

    я ранее никогда не пользовался роботами, да и не пробовал программировать на qpile. Сейчас ситуация такая, что зарегистировал виртуальный счет прям на сайте quik по акциям Лукойла. Привинчиваю instrument=lokh, account свой также, если это необходимо. Почему-то ни один робот не работает.

    Евгений Reply:

    Лукойл на ММВБ — LKOH, а не «лох» :)

    Проверьте также код площадки.

  23. dimmi
    15 Декабрь 2009 в 17:20 | #23

    Столкнулся с такой проблемой! Все цены расчитывает, все показывает, НО, ставит только одну заявку! Ставит ту котороя первее, т.е. если в коде сначала пропишсать всё для короткой позы, то и поставиться заявка толька для короткой! Вторая никак не хочет работать! Как можно справиться с данной проблемой?

    Евгений Reply:

    Не понял вопроса...Зачем в коде прописывать что-то для направления сделки?

    Отправка транзакций в коде идет друг за другом. и если выставлется одна то 100% выставится и вторая.

  24. dimmi
    15 Декабрь 2009 в 19:44 | #24

    Нет я ничего не прописывал) У меня ставиться одна заявка и всё! Вторую жду 5-10 минут, безтолку((

    Евгений Reply:

    Ничего не прописывать вы не могли — код бумаги то все равно прописывали? Смотрите настройки.

  25. dimmi
    15 Декабрь 2009 в 20:42 | #25

    Ну я имел ввиду код программы не менял! Только инструмент и всё в этом роде. Вот сейчас все перепроверил, запустил! ЕСть позиция, одну стоп-заявку ставит, а вторую нет((

    Евгений Reply:

    Возможно баланса не хватает на две заявки.

  26. dimmi
    18 Декабрь 2009 в 12:53 | #26

    а вот ещё такой вопрос! есть позиция, робот ее стопит, но во время этого я добираю еще один лот. его уже не трогает. почему? он же должен повторять свои действия?

    Евгений Reply:

    Читайте внимательнее код. Робот Дефендер выставлет заявки один раз, то очем вы говорите — это активный трейлинг-стоп: www.hirobot.ru/200908torg...ishhet-xozyaina/

  27. ivo-skorpion
    1 Февраль 2010 в 23:24 | #27

    Евгений — Вы Гений!!! Большое спасибо Вам, за Ваших роботов!

    Я если, честно сомневался, что такое возможно!

    Всем кто ещё не зарегистрировался, советую! Евгений настоящий профессионал, поможет решить любую проблему!

  28. lslava70
    10 Февраль 2010 в 14:39 | #28

    Зачем убивать ранее выставленные стопы? Я могу выставить стоп-заявку, в нужном мне направлении и заниматься своими делами, и если она выполнена Defender должен её защитить.

    Евгений Reply:

    Не понял, расшифруйте.

  29. Flint73
    26 Февраль 2010 в 17:37 | #29

    Не могу заставить робот заработать.

    Указал INSTRUMENT="GAZP" для теста на реальном счету

    STOPLOSS=10'

    TPROFIT=10'

    Заявка в стакане проходит, но ни тейпрофит ни стопов в заявки не попадает.

    Евгений Reply:

    Привет.

    GAZP — это код акции на ММВБ, а весь робот ориентирован на ФОРТС.

    Vlad Reply:

    А для ММВБ его можно приспособить ?

    Евгений Reply:

    Конечно! Нужно переделать блок определения текущей позиции, ее берем из таблиц лимитов.

    Vlad Reply:

    Переделал.

    При запуске пишет ошибку

    line:130. Unknown lexema.['========ФУНКЦИЯ ПОСТАНОВКИ ТЕЙКПРОФИТА]

    Евгений Reply:

    Просмотрите внимательно эту строку, где то синтаксическая ошибка. Это простой комментарий. Может символа апострофа в начале строки не хватает?

  30. Shiko621
    1 Март 2010 в 14:59 | #30

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

    Евгений Reply:

    Такой контроль уже существует в блоке:

    '========= КОНТРОЛЬ КОЛИЧЕСТВА СТОП-ЗАЯВОК

    если текпоза=0 а колво стопов не равно нулю — удалить все стопы. я думаю вы слишком близко ставите стоп.

    Shiko621 Reply:

    Добрый день. Я имею ввиду, что когда текпоза=0 а колво стопов не равно 0 — удалить все стопы. Они удаляются, а вот простая заявка (тейк-профит) -нет. Я и хотел уточнить, что нужно сделать, чтобы вообще все заявки убирались?

    Евгений Reply:

    Точно.

    Добавил блок удаления активных заявок, и его вызов из старой функции. ПРобуйте.

    Shiko621 Reply:

    Добрый день. И снова я со своими заявками. Посмотрите пожалуйста ещё раз код. Он все равно не снимает активные заявки после срабатывания стоп-приказа, а вот когда выходишь из позиции самостоятельно, тогда снимает.

    Евгений Reply:

    Добавил еще блоки. Обязательно разберитесь в изменениях, применено элегантное решение фильтрации активных заявок.

  31. Flint73
    1 Март 2010 в 18:11 | #31

    Ок

  32. alex_davyd
    3 Март 2010 в 15:10 | #32

    Евгений добрый вечер ,а как сделать стопзаявку с разной СТОПЦЕНОЙ И ЦЕНОЙ.побовал по разному не получается,

    Евгений Reply:

    В функции отправки транзакции формируйте цену стопзаявки отдельно, относительно стопцены, передаваемой в функцию.

    alex_davyd Reply:

    «PRICE», (FPRICE+(0*SIGN))&"" ,правильно

    Евгений Reply:

    При любом значении SIGN вы получите ноль, т.к. на него умножение.

    TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «STOPPRICE», FPRICE&"«)

    IF FDIRECTION=»B"

    FPRICE=FPRICE+100

    ELSE

    FPRICE=FPRICE-100

    END IF

    TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"")

    faust Reply:

    пара опечаток в коде — рабочий будет такой:

    TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "STOPPRICE", FPRICE&"") IF FDIRECTION="B" FPRICE=FPRICE+100 ELSE FPRICE=FPRICE-100 END IF TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"")

  33. alegnom
    15 Июль 2010 в 13:40 | #33

    Добрый день.

    А как сделать срок действия стоп-приказа не до «сегодня», а до «отмены»?

    Евгений Reply:

    Привет.

    Для этого в функции отправки транзакции «стопзаявка» нужно добавить:

    TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «EXPIRY_DATE», «GTC»)

    Евгений Reply:

    Только с правильными кавычками.

  34. Александр
    20 Июль 2010 в 01:01 | #34

    Глупый вопрос, как в quik посмотреть свой счет чтобы прописать его в роботе?

    Евгений Reply:

    Привет.

    Взять можно из таблицы «Ограничения по счетам» из первой строки (посмотрите может быть иной номер строки):

    ACCOUNTFORTS=GET_VALUE(GET_ITEM("FUTURES_CLIENT_LIMITS",1), "TRDACCID")

    Александр Reply:

    Спасибо, отлично работает.

Необходимо войти на сайт, чтобы написать комментарий.