Торговый робот для QUIK — Defender
«Defender» — в переводе «Защитник» и имя легендарного внедорожника. Я выбрал это название для торгового робота потому, что его две основные и единственные функции выставлять тэйкпрофит и стоплосс в виде стоп-заявок при открытии вручную позиции. Т.е. открываем длинную позу по определенному инструменту, как только заявка исполняется полностью — наш торговый робот отправляет в систему два стопордера на продажу с ценой стопа — N пунктов от цены совершения сделки для стопа, и + N пунктов соответственно для тэйкпрофита. Все параметры этого торгового робота настраиваемые. Меньше слов — больше кода (редакция кода от 3 марта 2010 года):
Код на QPILE доступен только зарегистрированным пользователям.
Сразу предупреждаю, торгового робота я не проверял, возможно понадобятся доработки «под себя», и если Вы внимательные читатели моих уроков
вы без труда справитесь с этими доработками. Скачать торговый робот можно в виде файла. Кстати, посмотрите предложения спонсоров, встречаются очень интересные!
Спасибо за код:)
Пордскажите ,пожалуйста, безопасный способ тестировать роботов на текущих торгах. Как-то страшно открывать и чужой и свой код на реальном счете, вдруг какой портак и появятся убытки или куча каких-нибудь неадыкватных заявок. Вчера прочитала на quik.ru как один чел тестировал свой код и у него программа выставила 12 тыс заявок — его счет заблокировал брокер потом.
Вариант конечно оставить маленькую сумму на площадке на которой тестируешь робота, но вот с брокером это косяков не решает.
Самый безопасный — это открыть учебный счет. Да там котировки несколько отличаются от реальных, но тем не менее алгоритмы можно проверить. Что касается торгов на РТС вот ссылка: www.rts.ru/a14068 там перечень компаний которые оказывают услуги по предоставлению учебного доступа. От себя рекомендую БК «Открытие», у них можно попросить определенный инструмент, лимит. и пр. Я всегда всех роботов вначале тестирую на их учебных счетах. Удачи!
Евгений Reply:
июня 5, 2009 at 13:52
ой, не в ту ветку отправил.
П.С. 12 тыс. заявок — это круто:)
по-моему,при TP<0 (т.е при короткой позиции) STOP логичнее прибавить к PRICE,а ТЭЙК отнять.))
Евгений Reply:
июня 6, 2009 at 18:47
Согласен, логичнее
:):) На самом деле код написал минут за 15, на это внимания не обратил. Щас поправлю.
ругается на 40 строку, unknow identifier TP
Евгений Reply:
июня 9, 2009 at 11:51
После TPROFIT=200 вставьте TP=0
Евгений, а можно в двух словах: какие преимущества у выставления 2-х лимитных заявок перед стопом со связанной заявкой?
Евгений Reply:
июня 9, 2009 at 11:51
да никаких, кому как удобнее.
про ТР=0 уже догадался , но скрипт все равно не работает, ошибка пропала, время в таблицу и дату выводит а заявки не ставит
да, действительно, defender,не выставляет заявки, посмотрите Евгений, в чем проблема, программа нужная для начинающих
Выложил новую версию.
Добавил в таблицу параметры цена сделки — появляется тогда, когда есть хоть одно сделка.
Цена для стопа и цена для тэйкпрофита — появляются тогда. когда робот отработал одно из условий. Особое внимание на правильность заполнения полек с аккаунтами, их можно взять из окна ввода новой заявки, или из таблицы ограничений по счетам (ФОРТС). Бывает так, что в коде аккаунта есть буква «О» а при переписывании ее меняют на ноль — проблема.
ругается на строку 6 — неверный формат описания портфеля, — отсутствует символ завершения формулы расчета ?
Евгений Reply:
июня 11, 2009 at 13:21
Проверьте версию своего Квика, скорее всего она старая.
5.12.0.130
Евгений Reply:
июня 11, 2009 at 13:48
Очень странно. Сейчас подгрузил в свой квик — не ругаецца, все нормально. Проверьте, может скопировали из окна неправильно? В окне кода есть справа вверху первая кнопка «view source» -она открывает код в текстовом редакторе, оттуда скопируйте... БОльше ничего предположить не могу. Отпишитесь по результату.
Сергей Reply:
июня 15, 2009 at 12:00
Здравствуйте,Евгений!Загрузил, -работает. Но по прежнему, время, дату,текущие чистые позиции ставит,а вот расчитывать цену стопа и тейкпрофита ставить не хочет (ноль стоит), проверил заполнение полек аккаунта, -все верно.На вашем квике эта программа работает?, — выставляет стопы и тейкпрофиты?
Евгений Reply:
июня 15, 2009 at 13:48
Эти цены (тэйк и стоп) он заполняет тогда, когда текпоз не равен нулю, иначе говоря это цены уже ВЫСТАВЛЕННЫХ лимитов стопов и тейкпрофита.
Евгений Reply:
июня 15, 2009 at 13:56
И еще. В квике есть огромный функционал условных заявок, это в т.ч. и стоплосс, и тэйкпрофит со следящей функцией, и с уловиями привязки к определенной заявке. Это пример торгового робота — лишь пример организации построения алгоритмической схемы на QPILE, которую по аналогии можно доработать под свои нужды. Даже в этом рассматриваемом случае более эффективно вместо лимита для стоп-лосса нужно использовать классическую стопзаявку Квика.
Проект HI ROBOT — образовательный, и задача которую я ставлю перед собой это донести основы и технические решения стандартных вопросов, которые возникают при программировании торговых роботов.
Сергей Reply:
июня 15, 2009 at 14:11
ну да, я понимаю так,совершаю сделку текпоз=1 по определенной цене, которая указывается в цене сделке, а в поле стопа и тейка должны отображаться цены с учетом дельты, которая указана в коде программы?но при тестировании при текпоз=1 цены стопа и тейка ноль.Извините Евгений за назойливость, но хочется разобраться.
Евгений Reply:
июня 15, 2009 at 14:25
Не надо извинений — тут как раз рабочий процесс))
Уже нашел у себя ошибку: переменные PRICETPROFIT=0 и PRICEFORSTOP=0 — надо делать глобальными, ибо они каждый раз при итерации обнуляются. Обнулять их нужно в блоке где обнуляется FLAG.
Вы тестировали в реале? Заявки выставляет, мессаги пишет?
Сергей Reply:
июня 15, 2009 at 14:30
Тестирую на учебном счете,при совершении сделки, заявки не выставляет ни стоп, ни тейк.
Евгений Reply:
июня 15, 2009 at 14:32
А мессагу MESSAGE («ВЫСТАВЛЯЮ СТОП И ТЭЙКПРОФИТ»,1) выкидывает?
Сергей Reply:
июня 15, 2009 at 14:34
нет
Евгений Reply:
июня 15, 2009 at 20:48
А при открытии позиции ТР в таблице меняет свое значение? Если меняет значит ОБЯЗАТЕЛЬНО выкинет мессагу. Каким инструментом работаете?
Вообще я на днях перепишу весь код, с учетом замечаний и вместо лимитов поставлю условные заявки, так будет правильнее.
Выложил версию 1.3. Теперь выставляются стопордера, это более правильно. Учтен ряд замечаний. Если вы используете тестовый счет, то у например «Открытия» инструмент должен называться не «RIU9» а «RTS-9.09» иначе не работает. Обязательно правильно настроить аккаунты, на тестовом счетет «Открытия» они оба одинаковы и их лучше скопировать из окна ввода заявки.
Тестируйте и пишите результаты, так быстрее научитесь
Потестировал версию 1.3. на учебном счете в «Открытие», инструмент распознает «RIU9» (при «RTS-9.09» тишина) аккаунты проверял и оба одинаковы ,и разные, при открытии позиции ТР меняет свое значение, мессага не выкидывается, цена сделки выставляется, а стопордера нет.
Евгений Reply:
июня 16, 2009 at 12:47
Мне уже самому интересно стало)) Завтра на учебном счете протестирую сам.
Насчет инструмента — буквально вчера пробовал другого робота своего с РИМ9 — не видит, увидел только «RTS-9.09», как-то странно. У нас ведь не могут счета работать по разному.
Виталий Reply:
июня 16, 2009 at 17:10
Отзывается только на RTS-9.09 цена сделки есть, количество текущей чистой позиции есть, цена стопа и тп ноль. Брокер Алор
Как обещал — новая версия. Протестировал на учебном счете «Открытия». Проблема заключалась в том, что видимо на учебном/ых счете/ах несогласованно название инструмента: когда мы получаем ТР надо указывать «RIM9» (указал в коде явным образом, можно назначить переменную), а в отправле транзакций «RTS-9.09». Этот код при открытии позиции у меня выставляет два стоп-лимита. Обратите внимание, что при срабатывании какого-то стоп лимита. второй не снимается. Как я говорил раньше этот код — шаблон, который необходимо дорабатывать под себя.
П.С. Обратите внимание на спонсоров проекта
Евгений,потестировал на учебном счете,единственно после выставления стоп-лимитов цена сделки обнуляется,а так же стопы выставляются по результатам одной сделки, а уже следующую сделку,совершенную через некоторое время не обрабатывает(стопы не выставляет, хотя величина чистой позиции изменяется).Большое спасибо за помощь, (сегодня или завтра отправлю на кошелек спонсорскую помощь).А на реальном счете будет ли что-нибудь менятся в коде программы (по кодам торгуемых инструментов?)
Робот после обнуления позиции и отсутствии активных заявок, при открытии новой также будет выставлять два стоп лимита.
При торговле на реальном счете скорее всего нужна будет корректировка наименований инструментов и номеров аккаунта.
За помощь спасибо, но можно не перечислять а ознакомиться с информацией спонсоров
Например на главной странице.
Виталий Reply:
июня 18, 2009 at 17:17
Друзья. У меня так и не получилось попробывать. Ситуация таже. Цена сделки меняется а заявки не ставятся...
Евгений Reply:
июня 18, 2009 at 19:52
Счет тестовый? Какой брокер? Коды инструментов менять пробовали? Аккаунт правильный?
Код 100% рабочий — гарантирую.
Счет реал. Брокер Алор. Работает только с RTS-9.09. Аккаунт правильный. В работоспособности кода я не сомневаюсь, понимаю, что проблема во мне и неспособности его настроить.
Евгений Reply:
июня 18, 2009 at 20:32
Как вы определили что работает с RTS-9.09? Попробуйте поставить апостроф перед INSTRUMENT="RTS-9.09" чтоб так получилось: ' INSTRUMENT="RTS-9.09" и запустить робота снова.
Не отображается цена сделки.
Евгений Reply:
июня 18, 2009 at 21:15
В смысле не отображается? Если вы поставили апостроф — это не влияет на отображение цены сделки...
Давайте с начала: загружаете свежую версию робота, открываете окна заявки, сделки и стопзаявки. Вручную открываете позу по указанному в коде инструменту, что происходит в таблице робота и в таблицах квика?
Виталий Reply:
июня 18, 2009 at 22:07
Все сделал.В таблицах квика сделка проходит. Ни каких дополнительно заявок нет и в таблице робота только время идет. Даже не отображается цена. Может ли влиять на портфель то что я пользуюсь приводом кликовым с выводом по DDE
Евгений Reply:
июня 19, 2009 at 20:57
DDE никак не влияет. У вас проблема с названием инструмента. Пробуйте варианты с названием. В строке 21 название указано явным образом, можно заменить на переменную.
Сделайте так:
INSTRUMENT1="RIU9"
INSTRUMENT2="RTS-9.09"
и эти переменные подставляйте в коде вместо INSTRUMENT. Таких мест всего 3: 21 строка, 50, 88. Я просто не знаю как брокер «Алор» выставляетс требования к названиям. Например у меня в реал «БКС», так везде надо указывать «RIU9», а на «Открытии» по другому немного.
Внутри кода нужно, что то менять помимо размера стоплосса и тейпрофита. Вот к примеру мне нужно 80 и 40, я правильно понял, что я просто их подставляю в соответствующие строчки?
Евгений Reply:
июня 19, 2009 at 20:51
Да, просто подставить. Менять нудно только аккаунты и код инструмента.
программа хорошая, но нужно, как то вопрос с проскальзыванием решать на стопе.
Евгений Reply:
июня 19, 2009 at 21:00
Вопрос с проскальзыванием можно решить только одним методом — выставлять лимит по нужной цене и всеми средствами дожидаться его полного исполнения. Это либо исполнять заявку по существующей котировке в противоположной части стакана с нужным количеством, либо самоубийственно ждать исполнения своей заявки.
В случае с нашим роботом — это шаблон, который показывает алгоритм выставления заявок, который надо подгонять под себя. Задавайте в форуме конкретный вопрос, будем совместно разбирать. Удачи!
Defender 1.7 что-то неработает. в таблицу выводится только время, все остальное по нулям. есть где-то описание, как прогу правильно подключить? Хотя, думаю, что дело в коде... демо счет в БКС.
Евгений Reply:
сентября 24, 2009 at 12:27
Думаю проблема в наименовании инструмента. В коде два варианта, попробуйте оба варианта.
Хотел бы поинтересоваться, на тестовом счете реально ли запустить вообще какой-нибудь бот? Какой именно следует вводить инструмент?
Евгений Reply:
ноября 19, 2009 at 19:10
Не только можно. но и нужно!
Я настоятельно рекомендую начинать использовать любого робота вначале на тестовом счете. Разница между тестовым счетом и реальным:
1. Виртуальность денег и расчетов
2. Небольшая разница в котировках
В остальном это такой же квик.
я ранее никогда не пользовался роботами, да и не пробовал программировать на qpile. Сейчас ситуация такая, что зарегистировал виртуальный счет прям на сайте quik по акциям Лукойла. Привинчиваю instrument=lokh, account свой также, если это необходимо. Почему-то ни один робот не работает.
Евгений Reply:
ноября 21, 2009 at 0:21
Лукойл на ММВБ — LKOH, а не «лох»
Проверьте также код площадки.
Столкнулся с такой проблемой! Все цены расчитывает, все показывает, НО, ставит только одну заявку! Ставит ту котороя первее, т.е. если в коде сначала пропишсать всё для короткой позы, то и поставиться заявка толька для короткой! Вторая никак не хочет работать! Как можно справиться с данной проблемой?
Евгений Reply:
декабря 15, 2009 at 19:29
Не понял вопроса...Зачем в коде прописывать что-то для направления сделки?
Отправка транзакций в коде идет друг за другом. и если выставлется одна то 100% выставится и вторая.
Нет я ничего не прописывал) У меня ставиться одна заявка и всё! Вторую жду 5-10 минут, безтолку((
Евгений Reply:
декабря 15, 2009 at 19:57
Ничего не прописывать вы не могли — код бумаги то все равно прописывали? Смотрите настройки.
Ну я имел ввиду код программы не менял! Только инструмент и всё в этом роде. Вот сейчас все перепроверил, запустил! ЕСть позиция, одну стоп-заявку ставит, а вторую нет((
Евгений Reply:
декабря 15, 2009 at 20:47
Возможно баланса не хватает на две заявки.
а вот ещё такой вопрос! есть позиция, робот ее стопит, но во время этого я добираю еще один лот. его уже не трогает. почему? он же должен повторять свои действия?
Евгений Reply:
декабря 18, 2009 at 17:54
Читайте внимательнее код. Робот Дефендер выставлет заявки один раз, то очем вы говорите — это активный трейлинг-стоп: www.hirobot.ru/200908torg...ishhet-xozyaina/
Евгений — Вы Гений!!! Большое спасибо Вам, за Ваших роботов!
Я если, честно сомневался, что такое возможно!
Всем кто ещё не зарегистрировался, советую! Евгений настоящий профессионал, поможет решить любую проблему!
Зачем убивать ранее выставленные стопы? Я могу выставить стоп-заявку, в нужном мне направлении и заниматься своими делами, и если она выполнена Defender должен её защитить.
Евгений Reply:
февраля 10, 2010 at 18:30
Не понял, расшифруйте.
Не могу заставить робот заработать.
Указал INSTRUMENT="GAZP" для теста на реальном счету
STOPLOSS=10'
TPROFIT=10'
Заявка в стакане проходит, но ни тейпрофит ни стопов в заявки не попадает.
Евгений Reply:
февраля 27, 2010 at 18:44
Привет.
GAZP — это код акции на ММВБ, а весь робот ориентирован на ФОРТС.
Vlad Reply:
апреля 1, 2010 at 9:50
А для ММВБ его можно приспособить ?
Евгений Reply:
апреля 1, 2010 at 22:37
Конечно! Нужно переделать блок определения текущей позиции, ее берем из таблиц лимитов.
Vlad Reply:
апреля 14, 2010 at 15:23
Переделал.
При запуске пишет ошибку
line:130. Unknown lexema.['========ФУНКЦИЯ ПОСТАНОВКИ ТЕЙКПРОФИТА]
Евгений Reply:
апреля 14, 2010 at 23:03
Просмотрите внимательно эту строку, где то синтаксическая ошибка. Это простой комментарий. Может символа апострофа в начале строки не хватает?
Добрый день, Евгений. Подскажите, что нужно сделать, чтобы после того, как сработал стоп-лосс заявка по тейк-профиту тоже снялась? Потому как при быстром развороте рынка она исполняется в ненужную сторону
Евгений Reply:
марта 1, 2010 at 19:58
Такой контроль уже существует в блоке:
'========= КОНТРОЛЬ КОЛИЧЕСТВА СТОП-ЗАЯВОК
если текпоза=0 а колво стопов не равно нулю — удалить все стопы. я думаю вы слишком близко ставите стоп.
Shiko621 Reply:
марта 2, 2010 at 12:27
Добрый день. Я имею ввиду, что когда текпоза=0 а колво стопов не равно 0 — удалить все стопы. Они удаляются, а вот простая заявка (тейк-профит) -нет. Я и хотел уточнить, что нужно сделать, чтобы вообще все заявки убирались?
Евгений Reply:
марта 2, 2010 at 18:51
Точно.
Добавил блок удаления активных заявок, и его вызов из старой функции. ПРобуйте.
Shiko621 Reply:
марта 2, 2010 at 23:02
Добрый день. И снова я со своими заявками. Посмотрите пожалуйста ещё раз код. Он все равно не снимает активные заявки после срабатывания стоп-приказа, а вот когда выходишь из позиции самостоятельно, тогда снимает.
Евгений Reply:
марта 3, 2010 at 20:09
Добавил еще блоки. Обязательно разберитесь в изменениях, применено элегантное решение фильтрации активных заявок.
Ок
Евгений добрый вечер ,а как сделать стопзаявку с разной СТОПЦЕНОЙ И ЦЕНОЙ.побовал по разному не получается,
Евгений Reply:
марта 3, 2010 at 19:40
В функции отправки транзакции формируйте цену стопзаявки отдельно, относительно стопцены, передаваемой в функцию.
alex_davyd Reply:
марта 5, 2010 at 22:17
«PRICE», (FPRICE+(0*SIGN))&"" ,правильно
Евгений Reply:
марта 6, 2010 at 20:10
При любом значении 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:
марта 30, 2010 at 11:22
пара опечаток в коде — рабочий будет такой:
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&"")deff Reply:
марта 25, 2011 at 20:11
все равно одинаковые стоп цену и цену выставляет
Евгений Reply:
марта 25, 2011 at 21:43
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «STOPPRICE», FPRICE&"«)
IF FDIRECTION=»B"
FPRICE=FPRICE+100
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"«)
END IF
IF FDIRECTION=»S"
FPRICE=FPRICE-100
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"")
END IF
Это ж просто
bolvin Reply:
мая 17, 2011 at 13:56
Подскажите что не работает стоп заявка выставляется
равнозначной
FUNC STOPORDER (FPRICE,FLOTS,FDIRECTION,FTRID)
NEW_GLOBAL («TRANS_PARAMS», "")
NEW_GLOBAL («TRANS_RESULT», "")
TRANS_PARAMS = "« TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „TRANS_ID“, TRID&»")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACTION», «NEW_STOP_ORDER»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «CLASSCODE», «SPBFUT»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «SECCODE», INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACCOUNT», ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «OPERATION», FDIRECTION&"«)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „STOPPRICE“, FPRICE&»«)
IF FDIRECTION=»B" FPRICE=FPRICE+100
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"«)
END IF
IF FDIRECTION=»S" FPRICE=FPRICE-100
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"«)
END IF
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „QUANTITY“, FLOTS&»")
TRANS_RESULT = SEND_TRANSACTION (300, TRANS_PARAMS)
RESULT=GET_VALUE (TRANS_RESULT, «DESCRIPTION») MESSAGE (RESULT,1)
END FUNC
Евгений Reply:
мая 19, 2011 at 19:38
Код правильный, проверьте правильный ли файл вы загрузили в квик.
Добрый день.
А как сделать срок действия стоп-приказа не до «сегодня», а до «отмены»?
Евгений Reply:
июля 15, 2010 at 19:23
Привет.
Для этого в функции отправки транзакции «стопзаявка» нужно добавить:
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «EXPIRY_DATE», «GTC»)
Евгений Reply:
июля 15, 2010 at 19:23
Только с правильными кавычками.
Глупый вопрос, как в quik посмотреть свой счет чтобы прописать его в роботе?
Евгений Reply:
июля 20, 2010 at 18:29
Привет.
Взять можно из таблицы «Ограничения по счетам» из первой строки (посмотрите может быть иной номер строки):
ACCOUNTFORTS=GET_VALUE(GET_ITEM("FUTURES_CLIENT_LIMITS",1), "TRDACCID")Александр Reply:
июля 20, 2010 at 19:33
Спасибо, отлично работает.
Злравствуйте!
В вашем роботе стопзаявка выставляется с одинаковыми стопценой и ценой. Как сделать, чтобы цена отличалась от стопцены, т.е. исполнялась по рынку?
Евгений Reply:
августа 18, 2010 at 9:37
Привет.
В функции постановки стопзаявки в параметре:
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"") ' СТОПЗАЯВКА ВЫСТАВЛЯЕТСЯ С ОДИНАКОВЫМИ СТОПЦЕНОЙ И ЦЕНОЙ.
FPRICE в зависимости от направления нужно увеличивать или уменьшать, т.е. надо добавить условие, определяющее направление.
Dolphin Reply:
августа 18, 2010 at 11:22
Могли бы дописать эту строчку, если вам труда не составит. Сам я далеко не программист(
Евгений Reply:
августа 19, 2010 at 10:27
В блоке переменных заведите переменную:
RAZNICA=100
Она будет отвечать за разницу между ценой и стопценой в стопзаявке. Она будет измеряться в РУБЛЯХ!
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "STOPPRICE", FPRICE&"") IF FDIRECTION="B" FPRICE=FPRICE+RAZNICA ELSE FPRICE=FPRICE-RAZNICA END IF TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"")И функция целиком:
'========= ФУНКЦИЯ ПОСТАНОВКИ СТОППРИКАЗА FUNC STOPORDER(FPRICE,FLOTS,FDIRECTION,FTRID) NEW_GLOBAL("TRANS_PARAMS", "") NEW_GLOBAL("TRANS_RESULT", "") TRANS_PARAMS = "" TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", TRID&"") TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "NEW_STOP_ORDER") TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", "SPBFUT") TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT) TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT) TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "OPERATION", FDIRECTION&"") TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "STOPPRICE", FPRICE&"") IF FDIRECTION="B" FPRICE=FPRICE+RAZNICA ELSE FPRICE=FPRICE-RAZNICA END IF TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"") TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "QUANTITY", FLOTS&"") TRANS_RESULT = SEND_TRANSACTION (300, TRANS_PARAMS) RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION") MESSAGE (RESULT,1) END FUNCВ итоге вам нужно объявить новую переменную, и заменить старую функцию той что выше. Можно отдельные строки поменять, можно целиком функцию.
Dolphin Reply:
августа 19, 2010 at 17:09
Спасибо, попробую.
bolvin Reply:
мая 16, 2011 at 22:38
что такое FTRID
Евгений Reply:
мая 19, 2011 at 19:36
Идентификатор транзакции — обязательный параметр.
ACCOUNT="SPBFUT" ' ПРОПИСЫВАЕМ АККАУНТ НА ФОРТС
А если нет этого акаунта? Работа через Квик-джуниор
Евгений Reply:
августа 31, 2010 at 18:06
Аккаунт в любом случае есть, его можно посмотреть в окне ручного ввода заявки.
А с акциями ММВБ робот что не работает?
Евгений Reply:
сентября 19, 2010 at 17:32
Привет.
Для того чтоб «Дефендер» умел работать с акциями ММВБ нужно учесть нюансы описанные в публикации: www.hirobot.ru/2010/04/os...botov-dlya-mmvb/
Евгений, добрый день! Для минимизации убытков возможно ли выставление плавающего стоп-лосса, который двигается за ценой? Если да, то какие параметры нужно указать в функции выставления стоп-заявки. Очень жду Вашего ответа.
Евгений Reply:
сентября 19, 2010 at 17:31
Привет.
Функция скользящего стоплосса реализована в коммерческой версии «Трейлинг-стоп» и как вариант «Тейкпрофит и трейлинг-стоп». www.hirobot.ru/200908torg...ishhet-xozyaina/
работает хоть? а то никто не сказал ничего, одни баги и вопросы у людей.
Евгений Reply:
сентября 19, 2010 at 17:33
Конечно работает! Скачайте и проверьте!
Доброго времени суток, устанавливаю робота впервые, есть ли где нибудь инструкция по переменным в этом роботе, поменял только инструмент, счет и размер стопа и профита в рублях.
а с остальными что делать что они означают спасибо! буду пробовать на реале БКС фортс,
не понял где проскальзывание ставить?
Евгений Reply:
января 12, 2011 at 23:50
Привет.
А остальное и не надо менять. Проскальзывание отдельно не настраивается, но можно отдельно рассчитывать цену в стопзаявке в функции отправки стопзаявок.
код рабочий. есть вопрос : можно написать так что бы выставлялось не стоплосс и заявка на покупку/продажу, а стоплосс и тейкпрофит одной заявкой. Спасибо , удачи
Евгений Reply:
января 18, 2011 at 17:04
Можно, это называется «Стоп со связанной заявкой» в Квике. Посмотрите раздел 6 руководства по квику, там в конце есть таблицы формирования блока отправки транзакций на сервер посредством QPILE.
SURROGAZ Reply:
января 18, 2011 at 20:56
что то я не нашел решения. сможете изменить ?
Евгений Reply:
января 25, 2011 at 0:26
Там все просто:
Стоп-заявка со связанной заявкой
РАО ЕЭС, покупка 15 лотов по цене 8,500, стоп-цена >= 8,000, и лимитированная заявка по 6,000 ACTION=NEW_STOP_ORDER; STOP_ORDER_KIND=WITH_LINKED_LIMIT_ORDER; ACCOUNT= NL0080000043; TRANS_ID=16; CLASSCODE=EQBR; SECCODE=EESR; OPERATION=B; QUANTITY=15; CLIENT_CODE=1001; STOPPRICE=8.0; PRICE=8.5; LINKED_ORDER_PRICE=6.0; KILL_IF_LINKED_ORDER_PARTLY_FILLED=NO;
Это схема постановки требуемой вами пары заявок. Подробнее об этом в 6 разделе руководства. Для модификации Дефендера надо в блоке «функция постановки стопприказа» изменить текущую схему параметров на эту. Только естественно заранее рассчитывать нужные параметры: стопцена, цена, и цена лимита. По сути меняется тип приказа, и добавляется два новых параметра:LINKED_ORDER_PRICE и KILL_IF_LINKED_ORDER_PARTLY_FILLED=NO;
Первая как раз цена связанного лимита. А второй тип исполнения лимита — подробнее в руководстве.
ДЕНЬ ДОБРЫЙ. КАК ИЗМЕНИТЬ КОД ТАК ЧТО БЫ ВЫСТАВЛЯЛОСЬ НЕ В ПУНКТАХ А В ПРОЦЕНТАХ? А ЦЕНА ВЫСТАВЛЕНИЯ ЗАЯВКИ СООТВЕТСТВЕННО В РУБЛЯХ.
СПАСИБО.
Евгений Reply:
апреля 4, 2011 at 19:00
Привет.
STOPLOSS=5 ' % для стоплосса
TPROFIT=3 ' % для тейкпрофита
LAST=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"LAST"),"PARAM_VALUE")+0
STEP=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"SEC_PRICE_STEP"),"PARAM_VALUE")+0
STOPLOSS=CEIL (LAST*STOPLOSS/100/STEP)*STEP
TPROFIT=CEIL (LAST*TPROFIT/100/STEP)*STEP
STEP нужен для правильного формирования цены с учетом минимального шага по настроенному инструменту.
и ещё на одном счете но на разных инструментах должно работать?
Евгений Reply:
апреля 4, 2011 at 19:03
Можно.
'========= ФУНКЦИЯ ПОСТАНОВКИ СТОППРИКАЗА
FUNC STOPORDER (FPRICE,FLOTS,FDIRECTION,FTRID)
NEW_GLOBAL («TRANS_PARAMS», "")
NEW_GLOBAL («TRANS_RESULT», "")
TRANS_PARAMS = "«
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „TRANS_ID“, TRID&»")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACTION», «NEW_STOP_ORDER»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «CLASSCODE», «SPBFUT»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «SECCODE», INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACCOUNT», ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «OPERATION», FDIRECTION&"«)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „STOPPRICE“, FPRICE&»«)
IF FDIRECTION=»B"
FPRICE=FPRICE+RAZNICcA
ELSE FPRICE=FPRICE-RAZNICcA
END IF
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"«)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „QUANTITY“, FLOTS&»")
TRANS_RESULT = SEND_TRANSACTION (300, TRANS_PARAMS)
RESULT=GET_VALUE (TRANS_RESULT, «DESCRIPTION»)
MESSAGE (RESULT,1)
END FUNC
вопрос...... на одном счете 2 робота на разных инструмента, у одного цена в стоп заявке с учетом разницы у другого без.
сам блок одинаковый. Может сталкивались с такой фигнёй и подскажите в чем ошибка? Спасибо
Евгений Reply:
апреля 6, 2011 at 22:33
Удалите оба робота из Квика и загрузите их туда заново. Предварительно проверьте оба кода чтоб они были точно последней вашей редакции.
причем прикольный момент, кто из робота раньше открывает сделку тот и ставит цену + разницу... соревнование блин
Евгений Reply:
апреля 6, 2011 at 22:33
И обновите Квик.
КАК МНЕ НАПИСАТЬ РОБОТА, который бы передвигал уровень стопа по скользящей средней. Параметры входа период ЕМА, таймфрейм RI и количество контрактов ?? Чтобы можно было самому открыться, потом, например, чтобы стоп двигался в сторону движения цены за 37 периодной ема на 15 минутном тайм фрейме, чтобы эти параметры можно было менять при этом.
Евгений Reply:
апреля 25, 2011 at 18:57
Можно на основе «Дефендера». Найдите на сайте как получить данные из индикатора Мувинг. И добавляйте условие: каждую итерацию проверять цену стопа и мувинг. Если последний выше цены стопа (рассматриваем лонг) то снять активный стоп и поставить стоп на новом уровне.
Подскажите, если размер стопа определяем в %, как добиться кратности 5
'========= ПОСТАНОВКА СТОПОВ
IF STOPLOSS>0
IF TP>0 AND STOPORDERCOUNT=0 AND ORDERCOUNT=0
STOPPRICE=abs (TRADEPRICE-CEIL (LAST*STOPLOSS/100/STEP))
LOTS=ABS (TP)
DIRECTION="S"
IF READ_MESSAGES=1
MESSAGE («ADX:ПОСТАНОВКА СТОП-ТЕЙКПРОФИТА НА ПРОДАЖУ „&LOTS&“ ЛОТОВ»,1)
END IF
STOPORDER (STOPPRICE,LOTS,DIRECTION)
END IF
IF TP<0 AND STOPORDERCOUNT=0 AND ORDERCOUNT=0
STOPPRICE=ABS (TRADEPRICE+CEIL (LAST*STOPLOSS/100/STEP))
LOTS=ABS (TP)
DIRECTION="B"
IF READ_MESSAGES=1
MESSAGE ("ADX:ПОСТАНОВКА СТОП-ТЕЙКПРОФИТА НА ПОКУПКУ "&LOTS&" ЛОТОВ",1)
END IF
STOPORDER (STOPPRICE,LOTS,DIRECTION)
END IF
END IF
Евгений Reply:
апреля 28, 2011 at 18:56
STOPPRICE=CEIL ((TRADEPRICE-TRAILING)/STEP)*STEP
Это строка из другого робота, но тут видно как приводить кратность минимальному шагу.
SURROGAZ Reply:
апреля 28, 2011 at 19:33
в общем незнаю как у кого, у меня в таком варианте выдает размер стопа * шаг. поэтому для ртс, стоп к примеру в 0,5% записывается как 0,1. тогда работает
Евгений Reply:
апреля 28, 2011 at 19:38
Так на шаг потом надо разделить.
размер стопа=CEIL (195675*0.5 (процент)/100/STEP)*STEP=975
совсем забыл, цена в стоп заявке в одном роботе работает как здесь писали, а для ртс только в таком варианте.
в чем отличие не догнал
IF FDIRECTION="B"
FPRICE=FPRICE+RAZNICA
END IF
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», FPRICE&"«)
IF FDIRECTION=»S"
FPRICE=FPRICE-RAZNICA
END IF
STOPPRICE=abs (TRADEPRICE- (CEIL ((LAST*STOPLOSS/100)/STEP))*STEP)
Евгений Reply:
апреля 28, 2011 at 19:49
Если STOPLOSS указан в %, то в принципе верно. Только зачем лишнее ABS?
SURROGAZ Reply:
апреля 28, 2011 at 19:52
принято убрал
и для стопа 0,5%, stoploss стоит 0,1