Торговый робот для QUIK — Mooving
Как Вы уже наверное догадались, речь идет о торговом роботе, принимающем решения на основе Mooving Average - скользящей средней. Код раскопал у себя в архивах, публикуя в таком виде как он есть, единственное что поменял — название инструмента. Алгоритм простой: используется одна скользящая средняя и если цена выше чем значение МА — покупает, ниже — продает. Мы уже рассматривали эти алгоритмы в статьях «Индикаторы в торговых роботах» и «Как получить котировки из графика QUIK», поэтому не сложно доработать код под себя. Я его делал несколько лета назад, и в этой редации еще не применены универсальные алгоритмы, как например получение котировок из графика при настраиваемом интервале. Главное сам принцип его работы (редакция кода от 29 января 2010 года):
Код на QPILE доступен только зарегистрированным пользователям.
Скачать торговый робот можно в виде файла.
Пробуйте, тестируйте.
Спонсоры у проекта — разные, обратите внимание
Что это означает? у меня quik почему-то ругается " "
span — что это такое?
Евгений Reply:
июля 7, 2009 at 13:43
Это редактор сайта так проставил табуляцию — убрал. по поводу верхнего вопроса — тоже самое. Пробуйте сейчас.
Я уже пробовал делать такую штуку, но возникла проблема... Когда цена будет переходить через скользящую, то за минуту может быть сделано десяток сделок, когда цена колеблется вокруг средней. эти колебания сьедают всю прибыль
Евгений Reply:
июля 12, 2009 at 17:38
В этом случае я считаю надо делать отступ в плюс и минус от значения скользящей, чем он будет больше, тем меньше хаотичных сделок и тем больше нацеленность на большой тренд. Для начала подобные стратегии нужно обязательно отточить в системе теханализа, например MultiCharts.
Торговый робот выложенный в этой статье показывает направление, которое нужно доработать под себя.
@Dr. Livsey
А, например, положение цены закрытия свечки заданного тайминга определено — либо выше, либо ниже МА:о)
Добрый день!
К сожалению, строки 077-079 выдают неизменный результат: 0.
077.CANDLE=GET_CANDLE («EQNE», GAZP, "", «1», «MOVING AVERAGE», SUBSTR (CANDLEDATETIME,0,8), SUBSTR (CANDLEDATETIME,8,6))
078.
079.MOVING=GET_VALUE (CANDLE, «CLOSE»)+0
Как выяснилось из отладчика QUIK строка 077 при различных комбинациях параметров интервала, типа графика (в т.ч. PRICE) неизменно выводит пустой результат. Естественно в строке 079 осуществляется сложение пустоты с 0, в итоге получаем 0.
Более того, из справки QUIK взял пример по функции GET_CANDLE, то же самое
(
Подскажите, пожалуйста, в чем тут дело?
Заранее благодарю.
Rem Reply:
сентября 7, 2009 at 14:02
Вероятно, все дело в параметрах даты и времени. Время в нашем регионе опережает московское на 1 час, соответственно, в запросе указываются временные параметры местного времени, которого еще нет на сервере.
Если дело в этом (и если даже не в этом), прошу оказать помощь новичку.
Кстати, спасибо сайту, с нуля подрос в программировании, теперь самостоятельно могу делать несложные роботы на qpl
Zebra Reply:
января 27, 2010 at 17:25
Уважаемый Rem!
Столкнулся с такой же проблемой — MOVING всегда равен 0. может действительно проблема в моем часовом поясе??? Вам удалось решить эту проблему???
Заранее благодарен
Евгений Reply:
января 27, 2010 at 19:37
Скорее всего неправильно приписан код инструмента. если вы запускаете его на ФОРТС то брокеры используют два стандарта кода: RIH0 и RTS-3.10, в случае с актуальным фьючерсом на индекс РТС. Попробуйте оба варианта.
Zebra Reply:
января 28, 2010 at 15:24
Спасибо Евгений за быстрый ответ! Скорее всего действительно ошибка могла быть, наверное, в этом, но я пытаюсь получить данные по акции Ростелекома об. на ММВБ(на экране выведен график Ростелекома с 20 минутный тайфреймом, индикатор SMA). А саму программу упростил для отладки до максимально простой!
PORTFOLIO_EX ROBOT VER 1.1;
DESCRIPTION ROBOT VER Serg;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
ClassCodeList = «EQBR» ' код класса инструмента
INSTRUMENT = «RTKM» ' название инструмента
PRICE = GET_VALUE (GET_PARAM_EX ( ClassCodeList, INSTRUMENT, «LAST»), «PARAM_VALUE»)+0 ' ТЕКУЩАЯ ЦЕНА
' ОПРЕДЕЛЯЕМ ВРЕМЯ И ДАТУ
DATETIME=GET_VALUE (GET_DATETIME (), «DATETIME»)
DATE=SUBSTR (DATETIME,6,4)&SUBSTR (DATETIME,3,2)&SUBSTR (DATETIME,0,2)
SHORTDATE=SUBSTR (DATETIME,4,1)&SUBSTR (DATETIME,0,2)
TIME=SUBSTR (DATETIME,11,2)&SUBSTR (DATETIME,14,2)&SUBSTR (DATETIME,17,2)
CDATETIME=GET_VALUE (GET_DATETIME (), «DATETIME»)
CANDLEDATETIME=SUBSTR (CDATETIME,6,4)&SUBSTR (CDATETIME,3,2)&SUBSTR (CDATETIME,0,2)&SUBSTR (CDATETIME,11,2)&SUBSTR (CDATETIME,14,2)&"00"
' Функция для обращения к данным «свечек» на графике, а также к значениям индикаторов технического анализа.
' GET_CANDLE (1 — Класс бумаги; 2 — Бумага; 3 — parameter_name; 4 — Интервал; 5 — Название индикатора ТА; 6 — ДАТА; 7 — ВРЕМЯ
CANDLE=GET_CANDLE ( ClassCodeList , INSTRUMENT, "«, „20“, „MOVING AVERAGE“, SUBSTR (CANDLEDATETIME,0,8), TIME)
' ПОСЛЕДНЕЕ ЗНАЧЕНИЕ
MOVING=GET_VALUE (CANDLE, „CLOSE“)+0
IF MOVING = 0 ' Проверка правильности определения кривой
MESSAGE („ SMMA = 0, блин и фака“ , 1)
END IF
OUTPUT=CREATE_MAP ()
OUTPUT=SET_VALUE (OUTPUT,»DATE",DATE)
OUTPUT=SET_VALUE (OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE (OUTPUT,"MOVING",MOVING)
DELETE_ALL_ITEMS ()
ADD_ITEM (1,OUTPUT)
END_PROGRAM
PARAMETER DATE;
PARAMETER_TITLE ДАТА;
PARAMETER_DESCRIPTION ДАТА;
PARAMETER_TYPE STRING (30);
END
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING (30);
END
PARAMETER MOVING;
PARAMETER_TITLE MOVING;
PARAMETER_DESCRIPTION MOVING;
PARAMETER_TYPE NUMERIC (10,0);
END
END_PORTFOLIO_EX
Будет время поглядите, пжл, весь извелся не знаю что предпринять, думаю что ошибка на столько простая, что ...эх... вообщем заранее благодарен
Евгений Reply:
января 28, 2010 at 21:12
А график 20-ти минутный Ростелекома с построенным на нем мувингом открыт?
Zebra Reply:
января 28, 2010 at 21:22
Привет! открыт! время и цена постоянно обновляются. Понимаю, что спрашиваю о не возможном — а у вас мой робот запустился???
с уважением
Евгений Reply:
января 28, 2010 at 21:30
Сейчас не могу запустить — робот торгует.
код бумаги верный, график открыт — значит проблема в дате или времени в запросе данных по индикатору. Оригинальный запрос такой: CANDLE=GET_CANDLE («SPBFUT»,INSTRUMENT, "", «20», «MOVING AVERAGE», SUBSTR (CANDLEDATETIME,0,8), SUBSTR (CANDLEDATETIME,8,6))
У вас немного изменен. Выведите функцией MESSAGE запрашиваемое время и дату (либо посмотрите в отладчике) и сразу все понятно будет.
Rem Reply:
января 28, 2010 at 22:05
Уважаемый Zebra!
Пробовал с утра отправить подробное сообщение с решением вашей (как я понимаю, такой же как и у меня) проблемы, что-то сервер не пропускает...
Коротко говоря, Евгений, при моем к нему обращении, рекомендовал использовать универсальный способ (см. его сообщение от 7 сентября 2009). Примените этот способ и решение будет найдено.
Привет.
Поищи на сайте публикацию «Как получить котировки из квика по номеру бара». Там готовая функция поиска последней котировки с настраиваемым таймфреймом. Примени ее в этом роботе и получишь универсальный вариант.
Rem Reply:
сентября 11, 2009 at 14:22
Ок, спасибо!
Теперь зависаю над привязкой ко времени сервера, чтобы выводимые значения по индикаторам имели точность секунда в секунду. Это предельно важно для скальпинга! Либо время сервера меняется, либо — время на моем компе. Отсюда и расхождения и неточность вывода текущих значений по индикаторам.
Пробовал функцию:
DATETIME=GET_INFO_PARAM (SERVERTIME),
но не пошло...
Что подскажите, какую функцию необходимо использовать в этом случае?
Благодарю заранее.
Евгений Reply:
сентября 11, 2009 at 20:23
Привет.
вот функция получения серверного времени:
SERVERTIME=GET_INFO_PARAM («SERVERTIME»)
TIMESERV=SUBSTR (SERVERTIME,0,2)&SUBSTR (SERVERTIME,3,2)&SUBSTR (SERVERTIME,6,7)
TIME=TIMESERV+0
Единственная проблема по утрам время вчерашнее))
Rem Reply:
сентября 11, 2009 at 21:47
Время это серверное и по вечерам какое-то кривое
Тем не менее, выражаю большое человеческое Спасибо лично Евгению за его проект.
Держи краба пятирублевого :0)
Евгений Reply:
сентября 12, 2009 at 10:04
Спасибо!
В эту функцию можно добавить сравнение текущей даты на компе и серверной даты, тогда можно избежать утренней проблемы. а вечером время кривое после окончания сессии, так что все можно сделать
Удачи!
устанавил робота из mooving.zip портфель успешно устанавливается, затем квик ругается — произошла ошибка при расчете портфеля идентификатор организации "ALL FIRMS сообщение об ошибке File moovin.qpl, line 121 Unknown identifier MONEYCURRENTBALANCE [OUTPUt и т.д.
Подскажите пожалста че делать
Евгений Reply:
сентября 22, 2009 at 17:29
Поправил.
amir279 Reply:
сентября 23, 2009 at 10:05
Спасибо, однако квик ругался снова. Немного поправил, не был «раскрыт» параметр прайс, и были лишние кавычки в начале кода.
Вот, публикую новый код. тока поменял на фьюч гп. жду открытия торгов, чтоб протестировать.
PORTFOLIO_EX ROBOT VER 1.0;
DESCRIPTION ROBOT VER 1.0;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
' ЗАПУСКАЕМ КВИК, СТРОИМ ГРАФИК ИНСТРУМЕНТА RIU9, НАКЛАДЫВАЕМ НА НЕГО ИНДИКАТОР SMA С ПЕРИОДОМ 9
' ПО CLOSE (НЕПРИНЦИПИАЛЬНО). ВЫВОДИМ ТАБЛИЦЫ «ПОЗИЦИИ ПО КЛИЕНТСКИМ СЧЕТАМ», «ОГРАНИЧЕНИЯ
' ПО КЛИЕНТСКИМ СЧЕТАМ»,"ТАБЛИЦА ЗАЯВОК","ТАБЛИЦА СДЕЛОК". В МЕНЮ СВЯЗЬ-СПИСКИ НАСТРАИВАЕМ ПОЛУЧЕНИЕ ДАННЫХ
' ПО НУЖНОМУ ИНСТРУМЕНТУ.
ACCOUNT="SPBFUTXXXX"
INSTRUMENT="GZZ9"
NEW_GLOBAL («FLAGSELL»,1)
NEW_GLOBAL («FLAGBYE»,1)
TP = GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS»,1), «TOTAL_NET»)+0
LOTS=1
PRICE=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"LAST"),"PARAM_VALUE")+0
PROFIT=GET_VALUE (GET_ITEM («FUTURES_CLIENT_LIMITS»,1), «VARMARGIN»)
DATETIME=GET_VALUE (GET_DATETIME (), «DATETIME»)
DATE=SUBSTR (DATETIME,6,4)&SUBSTR (DATETIME,3,2)&SUBSTR (DATETIME,0,2)
SHORTDATE=SUBSTR (DATETIME,4,1)&SUBSTR (DATETIME,0,2)
TIME=SUBSTR (DATETIME,11,2)&SUBSTR (DATETIME,14,2)&SUBSTR (DATETIME,17,2)
N=GET_NUMBER_OF («ORDERS»)
ORDERCOUNT=0
IF N>0 THEN
FOR I FROM 0 TO N
IF GET_VALUE (GET_ITEM («ORDERS», I), «STATUS»)="ACTIVE"
ORDERCOUNT=ORDERCOUNT+1
END IF
END FOR
END IF
ISREALTIME=0
SSTATUS=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"STATUS"),"PARAM_VALUE")+0
IF (PRICE0) AND (SSTATUS=1)
ISREALTIME=1
END IF
TRID=SHORTDATE&TIME
CDATETIME=GET_VALUE (GET_DATETIME (), «DATETIME»)
CANDLEDATETIME=SUBSTR (CDATETIME,6,4)&SUBSTR (CDATETIME,3,2)&SUBSTR (CDATETIME,0,2)&SUBSTR (CDATETIME,11,2)&SUBSTR (CDATETIME,14,2)&"00"
CANDLE=GET_CANDLE («SPBFUT»,INSTRUMENT, "«, „20“, „MOVING AVERAGE“, SUBSTR (CANDLEDATETIME,0,8), SUBSTR (CANDLEDATETIME,8,6))
MOVING=GET_VALUE (CANDLE, „CLOSE“)+0
OP=»«
IF ISREALTIME=1
IF TP=0
IF (PRICE>=MOVING) AND (ORDERCOUNT=0) AND (FLAGBYE=1)
OP=»B"
FLAGBYE=0
FLAGSELL=1
END IF
IF (PRICE<=MOVING) AND (ORDERCOUNT=0) AND (FLAGSELL=1)
OP="S"
FLAGSELL=0
FLAGBYE=1
END IF
END IF
IF (TP=MOVING)
IF (ORDERCOUNT=0) AND (FLAGBYE=1)
LOTS=2
OP="B"
FLAGBYE=0
FLAGSELL=1
END IF
END IF
IF (TP>0) AND (PRICE<=MOVING)
IF (ORDERCOUNT=0) AND (FLAGSELL=1)
LOTS=2
OP="S"
FLAGSELL=0
FLAGBYE=1
END IF
END IF
END IF
IF OP"«
R=ORDER (0,LOTS,OP,»LIMIT",TRID)
PAUSE (3000)
END IF
FUNC PAUSE (PAUSE_TIME)
PST = GET_DATETIME ()
FIRST_SYS_TIME = 0+GET_VALUE (PST, «HOUR»)*3600000 + GET_VALUE (PST, «MIN»)*60000 + GET_VALUE (PST, «SEC»)*1000 + GET_VALUE (PST, «MILLISEC»)
FOR PST_FLAG FROM 0 TO 1
PST = GET_DATETIME ()
SECOND_SYS_TIME = 0+GET_VALUE (PST, «HOUR»)*3600000 + GET_VALUE (PST, «MIN»)*60000 + GET_VALUE (PST, «SEC»)*1000 + GET_VALUE (PST, «MILLISEC»)
DIFF_TIME=(SECOND_SYS_TIME-FIRST_SYS_TIME)
IF DIFF_TIME<= PAUSE_TIME
PST_FLAG = -1
END IF
END FOR
END FUNC
FUNC ORDER (FPRICE,FLOTS,FDIRECTION,FTYPE,FTRID)
IF FTYPE="LIMIT"
FPRICE=PRICE
END IF
SIGN=-1
IF FDIRECTION="B"
SIGN=1
END IF
IF FLOTS+0 0
SET_ROW_COLOR_EX (1,"RGB (0,255,0)", «RGB (0,255,0)», «DEFAULT_COLOR», «DEFAULT_COLOR»)
END IF
IF PROFIT+0 = 0
SET_ROW_COLOR_EX (1,"DEFAULT_COLOR", «DEFAULT_COLOR», «DEFAULT_COLOR», «DEFAULT_COLOR»)
END IF
IF PROFIT+0 < 0
SET_ROW_COLOR_EX (1,"RGB (255,0,0)", "RGB (255,0,0)", "DEFAULT_COLOR", "DEFAULT_COLOR")
END IF
END_PROGRAM
PARAMETER DATE;
PARAMETER_TITLE ДАТА;
PARAMETER_DESCRIPTION ДАТА;
PARAMETER_TYPE STRING (30);
END
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING (30);
END
PARAMETER MOVING;
PARAMETER_TITLE MOVING;
PARAMETER_DESCRIPTION MOVING;
PARAMETER_TYPE NUMERIC (10,0);
END
PARAMETER TP;
PARAMETER_TITLE ТЕКЧИСТПОЗ;
PARAMETER_DESCRIPTION ТЕКЧИСТПОЗ;
PARAMETER_TYPE NUMERIC (10,0);
END
PARAMETER ISREALTIME;
PARAMETER_TITLE ISREALTIME;
PARAMETER_DESCRIPTION ISREALTIME;
PARAMETER_TYPE STRING (30);
END
PARAMETER PRICE;
PARAMETER_TITLE PRICE;
PARAMETER_DESCRIPTION PRICE;
PARAMETER_TYPE STRING (30);
END
PARAMETER PROFIT;
PARAMETER_TITLE ВАР.МАРЖА;
PARAMETER_DESCRIPTION PROFIT;
PARAMETER_TYPE NUMERIC (10,0);
END
END_PORTFOLIO_EX
Евгений, я новичек.Но эта программа у меня не работает. в строке 23 new_global (<>,1) выдает ошибку.
Евгений Reply:
ноября 6, 2009 at 20:45
Отредактировал всю версию.
Заранее извиняюсь, возможно чего-то просто не знаю или не допонимаю, но придется задавать пока глупый вопрос(ы):
В коде поменял инструмент на свой INSTRUMENT="LKOH"
так же ACCOUNT="SPBFUT00XXX" — меняю здесь на номерок из таблицы лимитов по бумагам, колонка «Код клиента».
Подгружаю робота в quik через ctrl+f10, открывается таблица «Портфель %название робота тут!%» с соответствующими в коде колонками.
текущаю дата отображается, тикает время. И все.
Как проверить, что программа работает?
Извиняюсь за глупые вопросы, в этом я совсем новичок, с программированием знаком, но далеко не для quik и торговых систем в целом.
спасибо.
Евгений Reply:
ноября 22, 2009 at 21:29
LKOH — это код бумаги Лукойла на ММВБ.
SPBFUT00XXX — это аккаунт на ФОРТС.
Определитесь где вы хотите торговать и изучайте основы торговли.
olegpronin777 Reply:
ноября 22, 2009 at 21:55
все ясно. Я всего лишь не знал, что подразумевается под account. Надо основы по qpile почитать.То есть для Лукойла достаточно закомментить account и использовать instrument?
торгую на акциях ммвб
забыл добавить, счет у меня тестовый, зарегистрировал на сайте quik, стоит соответственно терминал quik-junior.
Принимайте новичка) и я хотел бы узнать что нужно переделать чтобы запустить этого робота на счете ммвб и торговать акциями сбера. заранее извеняюсь за вопрос который наверняка прост.
Евгений Reply:
декабря 15, 2009 at 19:26
Добро пожаловать!
Изменить нужно:
1. блок расчета текпоза
2. коды инструмента и класса
3. блок подсчета активных заявок
chelny07 Reply:
декабря 16, 2009 at 17:16
вроде запустил но аккаунт все равно выделяет красным, он купил 1 контракт и ничего не делает с ним, тупо купил и все(
Наверное я точно что-то не так делаю
Евгений Reply:
декабря 16, 2009 at 18:50
аккаунт типа «SPBFUT» — это только для ФОРТС. На ММВБ аккаунт другой. Разбирайтесь внимательно, код рабочий, но для ФОРТС.
Здравствуйте Евгений! Подскажите, пожалуйста, что нужно изменить в коде, чтобы убрать реверс, а работать только в лонг?
Евгений Reply:
января 17, 2010 at 18:17
IF (TP>0) AND (PRICE< =MOVING)
IF (ORDERCOUNT=0) AND (FLAGSELL=1)
LOTS=2
OP="S"
FLAGSELL=0
FLAGBYE=1
END IF
END IF
END IF
В этом куске надо LOTS=1, тогда поза будет просто закрываться.
и удалить этот кусок:
IF (PRICE< =MOVING) AND (ORDERCOUNT=0) AND (FLAGSELL=1)
OP="S"
FLAGSELL=0
FLAGBYE=1
END IF
либо закомментарить в нем
' OP="S"
спасибо
Здравствуйте, Евгений!
Я новичёк, ещё пару дней назад, я даже не знал, что такое МТС!
Подскажите, пожалуйста, что и где мне нужно поменять в вашем торговом роботе! Я его загрузил из mooving.zip. Я торгую мартовским фьючерсом на доллар SiH0 на 3-х минутном графике, индикатор Moving Average с параметрами Simple, период 12.
Большое Спасибо!
ivo-skorpion Reply:
января 28, 2010 at 23:49
Извиняюсь, ещё вопрос! Время в роботе обновляется каждые 10 секунд и опаздывают от времени в Квике примерно на 5 секунд, это нормально или могут быть задержки в выставлении заявок? В вопросах выше писали, что есть проблемы со временем и датой, сейчас в этом роботе устранена эта проблема или надо в ручную прописывать? Редактировать робота в Квике можно или нужно редактировать в специальной программе и каждый раз перезагружать в Квик?
ivo-skorpion Reply:
января 29, 2010 at 1:26
Подскажите, как в Notepad++ новые созданные файлы сохранять с расширением qpl, когда нажимаешь -сохранить как- в упор не вижу такого расширения, хотя сами такие файлы читает!
За всё спасибо!
Жду с нетерпением на все вопросы ответа, очень хочется попробовать робота!
Евгений Reply:
января 29, 2010 at 18:52
«Сохранить как...» и вручную прописать расширение .qpl, тогда редактор распознает этот формат.
Евгений Reply:
января 29, 2010 at 18:57
1. Время итерации робота можно установить минимально = 1 секунде, CTRL-F11
2. Редактировать можно любым текстовым редактором, сохраняем. и после каждый раз перезагружаем в квик: CTRL-F10 выбираем файл — загрузить. Этого достаточно чтоб изменения применились.
3. Для автоматической торговли желателен хороший канал связи, когда канал слабый возможны задержки в выставлении заявок.
4. Есть два источника получения времени и даты в квике:
а) с сервера
б) с локального (вашего) компьютера.
можно использовать оба варианта. Разницы особой нет.
Евгений Reply:
января 29, 2010 at 19:44
Сегодня 29 января 2010 года я обновил версию торгового робота «Mooving», в ней применены серверное время и новая функция получения значений индикаторов. Код проверил на своем реальном счете в «БКС» — работает.
Zebra Reply:
января 31, 2010 at 13:19
Евгений!
Большое спасибо за Ваш последний код. Сейчас его немного адаптировал под себя и с нетерпением жду начала торговой сессии. Пока разбирался понял, что мне надо, скажем так, еще многому учиться. Смешно сказать, потратил кучу времени для того что бы найти/понять, что такое «идентификатор графика» и только из вашего комментария разобрался. Я уже задавал вопрос по поводу определения времени, и после долгих мучений нашел рабочий код с использованием вашей функции OHLC — но ваш новый код конечно лучше.
Правда %-), может быть, для красоты можно было бы добавить функцию для вывода треугольничков (продажа/покупка) на график для наглядности, что я и сделал взяв за основу код из NoPasaran!.
Вопрос: при формировании запроса на покупку/продажу выполняется функция «УВЕЛИЧЕНИЕ ЦЕНЫ ПОКУПКИ/ПРОДАЖИ ДЛЯ ПСЕВДОРЫНОЧНОЙ СДЕЛКИ», это сделано для того что бы избежать продажи/покупки при колебаниях цены рядом с SMA и коэффициент 100 просто для примера и для каждой бумаги он будет, что естественно, свой ИЛИ ЖЕ эта функция несет в себе другой пока мне не ведомый смысл???
Еще раз спасибо... Сергей
Евгений Reply:
января 31, 2010 at 19:42
Привет.
1. Треугольнички на графике может делать сам квик — посмотрите в настройках графика, там это есть.
2. Увеличение и уменьшение это сделать для того чтоб заявка обязательно исполнилась. она как бы приобретает свойства «рыночной заявки». 100 поставил для фьюча на РТС. ДЛя универсальности можно этот параметр вынести в настройки в виде переменной. или уще универсализировать — получать минимальный шаг бумаги из таблицы текпараметров и умножать его на переменный коэфф.
Zebra Reply:
января 31, 2010 at 21:25
Евгений, как я и писал мне надо учиться и учиться. буду завтра тестировать.
«Восходящего/нисходящего тренда» — в смысле удачи
Здравствуйте, Евгений!
Я скачал программу Mooving, но она не открывается на моем компьютере; выдается сообщение, что неизвестна программа с помощью которой создан этот файл. Программа Quik на моем компьютере есть. Подскажите, пожайлуста, какая программа нужна для открытия файла mooving_ver11.qpl и где ее можно найти?
С уважением, Сергей
Евгений Reply:
февраля 1, 2010 at 22:05
Привет.
Это обычные текстовые файлы, которые можно редактировать любым текстовым редактором, например блокнотом. Просто .qpl не самое распространенное расширение файла.
На странице www.hirobot.ru/skachat/ самая первая ссылка рекомендуемый мной редактор для таких файлов.
Евгений — Вы Гений!!! Большое спасибо Вам, за Ваших роботов!
Я если, честно сомневался, что такое возможно!
Всем кто ещё не зарегистрировался, советую! Евгений настоящий профессионал, поможет решить любую проблему!
Здравствуйте.
и все же что надо вписывать в поле ACCOUNT=""
для торговли на ммвб, и если не сложно, подскажите, что надо еще изменить.
Я совсем новичок в этот деле, языка Qpile не знаю, но сам когда то владел обычными языками программирования, хотя здесь это врятли поможет:))
Так сказать, чтобы появилось стремление для изучения, надо для начала чтобы вам замечательный робот, сделал пару сделок, а дальше уже будет с чем разбираться.
Спасибо.
Евгений Reply:
февраля 4, 2010 at 19:15
Привет.
Код этих роботов оптимизирован для площадки ФОРТС. Для ММВБ поле аккаунт можно определять автоматически =GET_VALUE (GET_ITEM («DEPO_LIMITS»,1), «TRDACCID»)&""
Но для оптимизации длч ММВБ менять надо не только аккаунт, но и блок расчета текущей позиции, блок подсчета количества активных заявок.
Сон Reply:
февраля 6, 2010 at 1:11
Спасибо что ответили:)
Запустить робота у меня получилось, он сделал пару мелких сделок, после чего я его отключил и начал разбираться с кодом...
получить заявки на покупку и продажу можно и из таблицы заявок,
а вот чистые позиции думаю можно только в какой то из этих таблиц
FIRM_HOLDING Текущие позиции по бумагам
ACCOUNT_BALANCE Текущие позиции по счетам
но описания этих двух таблиц я нигде не нашел :- (
FOR I FROM 0 TO GET_NUMBER_OF («ORDERS»)
IF GET_VALUE (GET_ITEM («ORDERS», I), «SECCODE»)=INSTRUMENT
'TP=GET_VALUE (GET_ITEM («ACCOUNT_BALANCE»,I), «TOTAL_NET»)+0
IF GET_VALUE (GET_ITEM («ORDERS»,I), «OPERATION») = «BUY» AND GET_VALUE (GET_ITEM («ORDERS»,I), «STATUS»)="ACTIVE"
ORDERCOUNTBUY=GET_VALUE (GET_ITEM («ORDERS»,I), «QUANTITY»)+0
END IF
IF GET_VALUE (GET_ITEM («ORDERS»,I), «OPERATION») = «SELL» AND GET_VALUE (GET_ITEM («ORDERS»,I), «STATUS»)="ACTIVE"
ORDERCOUNTSELL=GET_VALUE (GET_ITEM («ORDERS»,I), «QUANTITY»)+0
END IF
ORDERCOUNT=ORDERCOUNTBUY+ORDERCOUNTSELL
END IF
END FOR
конечно же без «TP» весь этот опрос таблицы заявок теряет смысл, и надо брать данные из одной таблицы где все эти значения есть.
Прошу помочь в поиске нужной таблицы и ее параметров:)
Евгений Reply:
февраля 6, 2010 at 10:07
Привет.
1. ТР получаем из таблицы DEPO_LIMITS из поля текущий баланс. Описание всех таблиц есть в руководстве по языку.
2. ORDERCOUNT вам нужен в общем виде, без деления на активные покупку и продажу. Есго можно получить из таблицы заявок, прогоняя по ней цикл и подсчитывая активные заявки.
Сон Reply:
февраля 7, 2010 at 14:06
Привет.
спасибо, разобрался.
по логике все должно работать, но судя по графикам бумаг, будет много неправильных сделок с одной линией, пока прекращаю с moving'ами, надо ТА почитать сперва...и делать с более сложными сигналами.
p.s
перешел на defender'a.
Привет, Евгений.
подходящей темы не нашел где задать вопрос, по квику вопрос.
в квике нельзя сделать индикатор на основе данных другого индикатора?
уже все перечитал и перенажимал, не получается:(
например конверт, или среднюю от rsi. Не программно же его делать:)
Евгений Reply:
февраля 17, 2010 at 19:11
Привет.
Для таких вопросов есть тема «Вопросы и ответы». Надо бы ее закрепить на первой странице...
Если в квике нет готового КОНЕЧНОГО индикатора — то только делать программно. Ничего в этом страшного нет
Сон Reply:
февраля 17, 2010 at 21:00
плохо что нет в квике такой возможности,
написал функцию(в принципе, подобие OHLC, только время не 24 часа а торговый день) для вычисления средней от индикатора...
думаю для большой программы прибавление еще и подобных циклов плохо:)
если еще учесть что будет несколько бумаг, хорошая информативная табличка, то можно и выйти за 1 секунду по времени выполнения.
хотя подобная функция нужна только 1 раз за интервал:)
Евгений Reply:
февраля 18, 2010 at 22:16
Пробуйте. Купайл достаточно мощный при правильной организации циклов.
Евгений, подскажите пожалуйста, а для чего в коде робота нужна функция паузы, и что означают все эти числа, которые в ней присутствуют!
Евгений Reply:
февраля 27, 2010 at 18:49
Пауза нужна для того. чтоб после отправки транзакции робот какое то время ничего не делал, т.к. бывают тормоза с интернетом. и заявка отправляется еще раз. Это самый простой способ избежать повторной отправки приказа, самый правильный это цикл по отправке транцакции. с конечной проверкой результата. если сервер не ответил — то еще раз и т.д.
Уважаемый Евгений, запустил данного робота на рынке ММВБ. Робот выставил 15 заявок на покупку подрят через каждые 10с. Почитав комментарии узнал что данный робот подходит только для Фортс. Не могли бы вы помочь в переделке робота для ММВБ?
Так же возник вопрос в какой именно номент подается сигнал на покупку-продажу? Я так пологаю что в момент пересечения двух МА, это так?
Готов учиться и сотрудничать, есть мысли по составлению прибыльного алгоритма на пересечении двух МА
Евгений Reply:
марта 26, 2010 at 18:45
Да. Робот отследив сигнал от индикаторы честно постарался исполнить свой долг, но т.к. на ММВБ иной блок подсчета текущей позиции он все слал и слал заявки. Чтоб переделать его под ММВБ нужно переписать этот блок.
Мувинг — это пример работы с индикаторами, он использует одну кривую и отслеживает текущую котировку. Если котировка выше мувинга — покупаем. и наоборот. по двум мувингам работает коммерческая версия «ЕМА», посмотрите на главной странице.
Kobalt Reply:
марта 31, 2010 at 9:55
Где можно посмотреть пример блока для ММВБ?
Евгений Reply:
марта 31, 2010 at 19:12
Примера на сайте нету, но там ничего сложного, получаем значение текущего баланса из таблиц лимитов.
Kobalt Reply:
апреля 1, 2010 at 11:46
Не могли бы вы дать описание данного блока что бы можно было переписать код по аналогии фортс ммвб
Евгений Reply:
апреля 1, 2010 at 22:45
в выходные планирую опубликовать статейку, заодно если не забуду выложу блок подсчета текпозы на ММВБ.
Kobalt Reply:
апреля 17, 2010 at 16:33
ждем блока тек. позиции))
Евгений, моя задача сделать так, что бы при запуске МУвинг не сразу открывал позу а при пересечении с ценой.
Я сделал так:
IF TP=0 AND ORDERCOUNT=0 AND PRICEMOVING
FLAG=1
END IF
END IF
КВИК на первой строке ругается...
Евгений Reply:
марта 29, 2010 at 21:09
NEW_GLOBAL («FLAG»,1)
MOOVING= ФУНКЦИЯ ПОЛУЧЕНИЯ МУВИНГА
PRICE= ФУНКЦИЯ ПОЛУЧЕНИЯ ТЕКУЩЕЙ КОТИРОВКИ
IF MOOVING>PRICE AND FLAG=1
FLAG=2
RETURN
END IF
IF MOOVING< =PRICE AND FLAG=1
FLAG=3
RETURN
END IF
IF FLAG=2 AND MOOVING< =PRICE
ОТСЛЕДИЛИ ПЕРЕСЕЧЕНИЕ СВЕРХУ ВНИЗ
FLAG=4
END IF
IF FLAG=3 AND MOOVING>PRICE
ОТСЛЕДИЛИ ПЕРЕСЕЧЕНИЕ СНИЗУ ВВЕРХ
FLAG=4
END IF
Saboteur Reply:
апреля 1, 2010 at 19:58
Доброе время суток!!! Скачал Вашего робота мувинг. Вроде работает намолотил в первый день около 50 сделок
Сейчас регулирую паузой, вроде получается. Подскажите пожалуйста в какую часть кода вставлять этот фрагмент. В програмировании не силен. Заранее спаибо
Евгений Reply:
апреля 1, 2010 at 22:44
Этот фрагмент нужно не только «вставить» но и правильно согласовать с остальным кодом. Функция этого фрагмента после запуска робота ожидать пересечения, что не сразу вставать в позу.
Задал переменную
NEW_GLOBAL («FLAG»,1)
Вставляю скопированный фрагмент, вроде нормально.
После отправки комментария, фрагмент отображается некорректно...
Ок, вошли.
Если собираемся выходить (например по Тейкпрофиту), то
IF TP0
FLAG=0
PRICEFORSTOP=1
PRICETPROFIT=1
END IF
??
Евгений Reply:
марта 29, 2010 at 21:22
главное флаг приравнять к единице, чтоб после выхода процедура распознавания пересечения снова работала.
ksm77 Reply:
марта 29, 2010 at 21:25
Это если ТР равно 0.
А если ТР не равно 0, то FLAG=0?
Евгений Reply:
марта 29, 2010 at 21:29
Вы не совсем поняли код который я написал, на бумажке попробуйте каждое действие виртуально продумать, почему именно так а не иначе. Тогда сами найдете ответ на свой вопрос.
Ок, спавибо
Добрый вечер!
Да, все работает, однако в первый раз программа купила 3 лота (с промежутком в несколько секунд), потом 1 лот, в следующий раз 2 (второй спустя пару секунд). В чем может быть проблема?
Евгений Reply:
марта 30, 2010 at 22:25
Причина может быть в плохой связи с сервером: робот отправляет заявку — сервер не отвечает, робот отправляет еще раз — сервер потом исполняет все скопом. Чтоб защититься надо увеличить паузу PAUSE (10) до 10 сек например в функции отправки транзакций.
Евгений, еще вопрос.
Я взял Функцию ордер из Дефендера и Мувинга
Расшифруйте пожалуйста, особенно — , «LIMIT»,TRID
ORDER (PRICETPROFIT,LOTS,"B",TRID)
ORDER (PRICEFORORDER,LOTS,OP,"LIMIT",TRID)
У меня выход не работает, пытаюсь разобраться...
Евгений Reply:
марта 30, 2010 at 22:22
ORDER (PRICEFORORDER,LOTS,OP,"LIMIT",TRID) это, точнее PRICEFORORDER,LOTS,OP,"LIMIT",TRID — списо к параметров, с которыми вызывается функция, надо смотреть одновременно и функцию и оператор с параметрами ее вызова.
«LIMIT» — параметр лимитированной заявки — атавизм, можно не смотреть, TRID — уникальный идентификационный номер транзакции. который формируется из даты и времени выше по коду.
Евгений добрый вечер!
Программа входит при пересечении цены и скользящей.
При выходе «в ручную» программа сразу же открывает позицию не дожидаясь пересечения.
Что я не учел?
Евгений Reply:
марта 31, 2010 at 19:12
первый и главный принцип программирования: ОБНУЛЯЙТЕ ПЕРЕМЕННЫЕ!!!
При отправке транзакции на вход, сразу задавайте значение флагу такое, чтоб робот начинал отслеживать пересечение с самого начала.
Евгений Добрый день
есть два компа оба в Финаме на одном Муфинг работает а на другом рисует 0
Всю голову сломал че делать то
Евгений Reply:
апреля 2, 2010 at 20:11
На втором компе идентификатор в графике прописан?
Webam Reply:
апреля 3, 2010 at 0:05
на обоих все идентично может это зависит от версий Quik?
Евгений Reply:
апреля 3, 2010 at 20:13
Ну если совсем старая версия, то обновите. Но думаю не в этом дело. Еще раз все проверяйте. если брокер один и тот же и тип счетов тоже — должно быть все одинаково.
Здравствуйте Евгений! Вопрос. Для уменьшения потерь при шуме возникла идея увеличить цену например на 50 для сбера. Смысл такой если цена пробила мувинг и скользнула еще на 50 она дальше пойдет. Маловероятно что отскочит. Достаточно ли изменения строчЕк
IF PRICE+50>MOVING AND ORDERCOUNT=0 AND FLAGBYE=1
и второй такой же для формирования противоположного приказа?
Спасибо.
Евгений Reply:
апреля 20, 2010 at 20:38
Несколько иначе: IF PRICE>MOVING+50 AND ORDERCOUNT=0 AND FLAGBYE=1
если цена выше чем мувинг+50.
И для элегантности можно завести отдельную переменную для этих 50 пунктов.
Saboteur Reply:
апреля 20, 2010 at 20:56
Не до элегантности. Лишь бы работало. Это мои первые шаги на ниве освоения КПИЛЕ. И первые победы. Спасибо за ответ.
Здравствуйте Евгений! НЕ РАБОТАЕТ... Все время выдает сообщение «у фирмы нет прав на выполнение транзакций по данному классу» пока не понял откуда ноги растут. Может Вы подскажете?
Евгений Reply:
апреля 22, 2010 at 20:43
У вас есть аккаунт на ФОРТС? Правильно ли вписываете его в текст робота (лучше скопировать из окна ввода заявки)?
Какие таблицы нужно выводить при торговле на ммвб для отслежывания работы робота?
Евгений Reply:
апреля 30, 2010 at 20:49
В принципе нужен только график правильно настроенный.
1. Т. е. нужно было просто заменить FUTURES_CLIENT_HOLDINGS на DEPO_LIMITS так?
FOR I FROM 0 TO GET_NUMBER_OF («DEPO_LIMITS»)
IF GET_VALUE (GET_ITEM («DEPO_LIMITS», I), «SECCODE»)=INSTRUMENT
TP=GET_VALUE (GET_ITEM («DEPO_LIMITS»,I), «TOTAL_NET»)+0
ORDERCOUNTBUY=GET_VALUE (GET_ITEM («DEPO_LIMITS»,I), «OPEN_BUYS»)+0
ORDERCOUNTSELL=GET_VALUE (GET_ITEM («DEPO_LIMITS»,I), «OPEN_SELLS»)+0
ORDERCOUNT=ORDERCOUNTBUY+ORDERCOUNTSELL
END IF
END FOR
2. И где посмотреть описание DEPO_LIMITS?
3. По какому принципу работает код?-После пересечения МА и цены будут совершаться покупки, а после обратного пересечения будут совершаться продажи акций или в МОМЕНТ пересечения должна совершиться одна покупка, а при повторном обратном пересечении одна продажа. Я хочу добиться работы как описано во втором варианте
Евгений Reply:
апреля 30, 2010 at 20:50
Нет, не достаточно только поменять название таблицы, там еще и поля разные, внимательно еще разок прочитайте публикацию про нюансы ММВБ.
Здравствуйте!!! Вопрос: а как сделать так, чтобы только по клозе открывалась сделка? (Пример: Цена пересекла мувинг и свеча ЗАКРЫЛАСЬ ниже мувинга). Спасибо.
Евгений Reply:
мая 3, 2010 at 22:18
Привет.
Для этого вам нужно вставить в вашего робота блок OHLC, отслеживать начало новой свечи, как только она появилась — получать OHLC предыдущей свечи, и если CLOSE и т.д. по вашему алгоритму. Модуль OHLC — смотрите новый www.hirobot.ru/2010/04/ka...grafika-2-chast/
Здравствуйте Евгений!!! Спасибо Вам за ваш сайт еще раз. Попробовал мувинга скрестить с ОХЛС и получилось!!! Правда пришлось разбираться в обоих кодах, а я не програмщик, как я уже говорил. Пока работает. Еще раз спасибо. Как только слитую часть депо отработаю благодарность не заставить себя ждать.
Здравствуйте Евгений!!! Подскажите пожалуйста как остановить выполнение Moovinga сразу после срабатывания стопа или профита (желательно конечно профита
)). Чтобы не выставлял заявок до нового пересечения Moovinga и цены. Спасибо
Евгений Reply:
мая 26, 2010 at 21:38
Привет.
Где то я писал уже это на сайте в комментах...
Для этого нужно сделать блок отслеживания положения котировки относительно мувинга при нулевой позиции, вот логика:
NEW_GLOBAL («FLAGENTER»,0)
NEW_GLOBAL («CROSS»,0)
IF TP<>0
FLAGENTER=0
CROSS=0
END
IF TP=0 AND FLAGENTER=0
IF MOOVING>PRICE
CROSS=1
END
IF MOOVING
CROSS=2
END
IF MOOVING>PRICE AND CROSS=2
FLAGENTER=1
END
IF MOOVING
FLAGENTER=1
END
END
IF FLAGENTER=1 AND TP=0 ...
' ТОРГОВЫЙ МОДУЛЬ
END
что-то в этом роде...