Главная > Торговые стратегии, Торговый робот > Торговый робот для QUIK — Mooving

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

17 июня 2009

moovingКак Вы уже наверное догадались, речь идет о торговом роботе, принимающем решения на основе Mooving Average - скользящей средней. Код раскопал у себя в архивах, публикуя в таком виде как он есть, единственное что поменял — название инструмента. Алгоритм простой: используется одна скользящая средняя и если цена выше чем значение МА — покупает, ниже — продает. Мы уже рассматривали эти алгоритмы в статьях «Индикаторы в торговых роботах» и «Как получить котировки из графика QUIK», поэтому не сложно доработать код под себя. Я его делал несколько лета назад, и в этой редации еще не применены универсальные алгоритмы, как например получение котировок из графика при настраиваемом интервале. Главное сам принцип его работы (редакция кода от 29 января 2010 года):

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

Скачать торговый робот можно в виде файла.

Пробуйте, тестируйте.

Спонсоры у проекта — разные, обратите внимание :)

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

  1. Olesya
    7 Июль 2009 в 11:46 | #1

    Что это означает? у меня quik почему-то ругается " "

  2. Olesya
    7 Июль 2009 в 11:47 | #2

    span — что это такое?

    Евгений Reply:

    Это редактор сайта так проставил табуляцию — убрал. по поводу верхнего вопроса — тоже самое. Пробуйте сейчас.

  3. Dr. Livsey
    12 Июль 2009 в 15:33 | #3

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

    Евгений Reply:

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

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

  4. indikator
    14 Июль 2009 в 11:17 | #4

    @Dr. Livsey

    А, например, положение цены закрытия свечки заданного тайминга определено — либо выше, либо ниже МА:о)

  5. Rem
    7 Сентябрь 2009 в 12:50 | #5

    Добрый день!

    К сожалению, строки 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:

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

    Если дело в этом (и если даже не в этом), прошу оказать помощь новичку.

    Кстати, спасибо сайту, с нуля подрос в программировании, теперь самостоятельно могу делать несложные роботы на qpl :)

    Zebra Reply:

    Уважаемый Rem!

    Столкнулся с такой же проблемой — MOVING всегда равен 0. может действительно проблема в моем часовом поясе??? Вам удалось решить эту проблему???

    Заранее благодарен

    Евгений Reply:

    Скорее всего неправильно приписан код инструмента. если вы запускаете его на ФОРТС то брокеры используют два стандарта кода: RIH0 и RTS-3.10, в случае с актуальным фьючерсом на индекс РТС. Попробуйте оба варианта.

    Zebra Reply:

    Спасибо Евгений за быстрый ответ! Скорее всего действительно ошибка могла быть, наверное, в этом, но я пытаюсь получить данные по акции Ростелекома об. на ММВБ(на экране выведен график Ростелекома с 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:

    А график 20-ти минутный Ростелекома с построенным на нем мувингом открыт?

    Zebra Reply:

    Привет! открыт! время и цена постоянно обновляются. Понимаю, что спрашиваю о не возможном — а у вас мой робот запустился???

    с уважением

    Евгений Reply:

    Сейчас не могу запустить — робот торгует.

    код бумаги верный, график открыт — значит проблема в дате или времени в запросе данных по индикатору. Оригинальный запрос такой: CANDLE=GET_CANDLE («SPBFUT»,INSTRUMENT, "", «20», «MOVING AVERAGE», SUBSTR (CANDLEDATETIME,0,8), SUBSTR (CANDLEDATETIME,8,6))

    У вас немного изменен. Выведите функцией MESSAGE запрашиваемое время и дату (либо посмотрите в отладчике) и сразу все понятно будет.

    Rem Reply:

    Уважаемый Zebra!

    Пробовал с утра отправить подробное сообщение с решением вашей (как я понимаю, такой же как и у меня) проблемы, что-то сервер не пропускает...

    Коротко говоря, Евгений, при моем к нему обращении, рекомендовал использовать универсальный способ (см. его сообщение от 7 сентября 2009). Примените этот способ и решение будет найдено.

  6. Евгений
    7 Сентябрь 2009 в 19:18 | #6

    Привет.

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

    Rem Reply:

    Ок, спасибо!

    Теперь зависаю над привязкой ко времени сервера, чтобы выводимые значения по индикаторам имели точность секунда в секунду. Это предельно важно для скальпинга! Либо время сервера меняется, либо — время на моем компе. Отсюда и расхождения и неточность вывода текущих значений по индикаторам.

    Пробовал функцию:

    DATETIME=GET_INFO_PARAM (SERVERTIME),

    но не пошло... :(

    Что подскажите, какую функцию необходимо использовать в этом случае?

    Благодарю заранее.

    Евгений Reply:

    Привет.

    вот функция получения серверного времени:

    SERVERTIME=GET_INFO_PARAM («SERVERTIME»)

    TIMESERV=SUBSTR (SERVERTIME,0,2)&SUBSTR (SERVERTIME,3,2)&SUBSTR (SERVERTIME,6,7)

    TIME=TIMESERV+0

    Единственная проблема по утрам время вчерашнее))

    Rem Reply:

    Время это серверное и по вечерам какое-то кривое :)

    Тем не менее, выражаю большое человеческое Спасибо лично Евгению за его проект.

    Держи краба пятирублевого :0)

    Евгений Reply:

    Спасибо!

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

    Удачи!

  7. amir279
    18 Сентябрь 2009 в 15:15 | #7

    устанавил робота из mooving.zip портфель успешно устанавливается, затем квик ругается — произошла ошибка при расчете портфеля идентификатор организации "ALL FIRMS сообщение об ошибке File moovin.qpl, line 121 Unknown identifier MONEYCURRENTBALANCE [OUTPUt и т.д.

    Подскажите пожалста че делать

    Евгений Reply:

    Поправил.

    amir279 Reply:

    Спасибо, однако квик ругался снова. Немного поправил, не был «раскрыт» параметр прайс, и были лишние кавычки в начале кода.

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

    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

  8. 5 Ноябрь 2009 в 20:34 | #8

    Евгений, я новичек.Но эта программа у меня не работает. в строке 23 new_global (<>,1) выдает ошибку.

    Евгений Reply:

    Отредактировал всю версию.

  9. olegpronin777
    22 Ноябрь 2009 в 20:43 | #9

    Заранее извиняюсь, возможно чего-то просто не знаю или не допонимаю, но придется задавать пока глупый вопрос(ы):

    В коде поменял инструмент на свой INSTRUMENT="LKOH"

    так же ACCOUNT="SPBFUT00XXX" — меняю здесь на номерок из таблицы лимитов по бумагам, колонка «Код клиента».

    Подгружаю робота в quik через ctrl+f10, открывается таблица «Портфель %название робота тут!%» с соответствующими в коде колонками.

    текущаю дата отображается, тикает время. И все.

    Как проверить, что программа работает?

    Извиняюсь за глупые вопросы, в этом я совсем новичок, с программированием знаком, но далеко не для quik и торговых систем в целом.

    спасибо.

    Евгений Reply:

    LKOH — это код бумаги Лукойла на ММВБ.

    SPBFUT00XXX — это аккаунт на ФОРТС.

    Определитесь где вы хотите торговать и изучайте основы торговли.

    olegpronin777 Reply:

    все ясно. Я всего лишь не знал, что подразумевается под account. Надо основы по qpile почитать.То есть для Лукойла достаточно закомментить account и использовать instrument?

    торгую на акциях ммвб

  10. olegpronin777
    22 Ноябрь 2009 в 20:44 | #10

    забыл добавить, счет у меня тестовый, зарегистрировал на сайте quik, стоит соответственно терминал quik-junior.

  11. chelny07
    15 Декабрь 2009 в 16:27 | #11

    Принимайте новичка) и я хотел бы узнать что нужно переделать чтобы запустить этого робота на счете ммвб и торговать акциями сбера. заранее извеняюсь за вопрос который наверняка прост.

    Евгений Reply:

    Добро пожаловать!

    Изменить нужно:

    1. блок расчета текпоза

    2. коды инструмента и класса

    3. блок подсчета активных заявок

    chelny07 Reply:

    вроде запустил но аккаунт все равно выделяет красным, он купил 1 контракт и ничего не делает с ним, тупо купил и все(

    Наверное я точно что-то не так делаю

    Евгений Reply:

    аккаунт типа «SPBFUT» — это только для ФОРТС. На ММВБ аккаунт другой. Разбирайтесь внимательно, код рабочий, но для ФОРТС.

  12. ksm77
    16 Январь 2010 в 20:41 | #12

    Здравствуйте Евгений! Подскажите, пожалуйста, что нужно изменить в коде, чтобы убрать реверс, а работать только в лонг?

    Евгений Reply:

    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"

  13. ksm77
    17 Январь 2010 в 21:46 | #13

    спасибо

  14. ivo-skorpion
    28 Январь 2010 в 23:40 | #14

    Здравствуйте, Евгений!

    Я новичёк, ещё пару дней назад, я даже не знал, что такое МТС!

    Подскажите, пожалуйста, что и где мне нужно поменять в вашем торговом роботе! Я его загрузил из mooving.zip. Я торгую мартовским фьючерсом на доллар SiH0 на 3-х минутном графике, индикатор Moving Average с параметрами Simple, период 12.

    Большое Спасибо!

    ivo-skorpion Reply:

    Извиняюсь, ещё вопрос! Время в роботе обновляется каждые 10 секунд и опаздывают от времени в Квике примерно на 5 секунд, это нормально или могут быть задержки в выставлении заявок? В вопросах выше писали, что есть проблемы со временем и датой, сейчас в этом роботе устранена эта проблема или надо в ручную прописывать? Редактировать робота в Квике можно или нужно редактировать в специальной программе и каждый раз перезагружать в Квик?

    ivo-skorpion Reply:

    Подскажите, как в Notepad++ новые созданные файлы сохранять с расширением qpl, когда нажимаешь -сохранить как- в упор не вижу такого расширения, хотя сами такие файлы читает!

    За всё спасибо! :) Жду с нетерпением на все вопросы ответа, очень хочется попробовать робота! :)

    Евгений Reply:

    «Сохранить как...» и вручную прописать расширение .qpl, тогда редактор распознает этот формат.

    Евгений Reply:

    1. Время итерации робота можно установить минимально = 1 секунде, CTRL-F11

    2. Редактировать можно любым текстовым редактором, сохраняем. и после каждый раз перезагружаем в квик: CTRL-F10 выбираем файл — загрузить. Этого достаточно чтоб изменения применились.

    3. Для автоматической торговли желателен хороший канал связи, когда канал слабый возможны задержки в выставлении заявок.

    4. Есть два источника получения времени и даты в квике:

    а) с сервера

    б) с локального (вашего) компьютера.

    можно использовать оба варианта. Разницы особой нет.

    Евгений Reply:

    Сегодня 29 января 2010 года я обновил версию торгового робота «Mooving», в ней применены серверное время и новая функция получения значений индикаторов. Код проверил на своем реальном счете в «БКС» — работает.

    Zebra Reply:

    Евгений!

    Большое спасибо за Ваш последний код. Сейчас его немного адаптировал под себя и с нетерпением жду начала торговой сессии. Пока разбирался понял, что мне надо, скажем так, еще многому учиться. Смешно сказать, потратил кучу времени для того что бы найти/понять, что такое «идентификатор графика» и только из вашего комментария разобрался. Я уже задавал вопрос по поводу определения времени, и после долгих мучений нашел рабочий код с использованием вашей функции OHLC — но ваш новый код конечно лучше.

    Правда %-), может быть, для красоты можно было бы добавить функцию для вывода треугольничков (продажа/покупка) на график для наглядности, что я и сделал взяв за основу код из NoPasaran!.

    Вопрос: при формировании запроса на покупку/продажу выполняется функция «УВЕЛИЧЕНИЕ ЦЕНЫ ПОКУПКИ/ПРОДАЖИ ДЛЯ ПСЕВДОРЫНОЧНОЙ СДЕЛКИ», это сделано для того что бы избежать продажи/покупки при колебаниях цены рядом с SMA и коэффициент 100 просто для примера и для каждой бумаги он будет, что естественно, свой ИЛИ ЖЕ эта функция несет в себе другой пока мне не ведомый смысл???

    Еще раз спасибо... Сергей

    Евгений Reply:

    Привет.

    1. Треугольнички на графике может делать сам квик — посмотрите в настройках графика, там это есть.

    2. Увеличение и уменьшение это сделать для того чтоб заявка обязательно исполнилась. она как бы приобретает свойства «рыночной заявки». 100 поставил для фьюча на РТС. ДЛя универсальности можно этот параметр вынести в настройки в виде переменной. или уще универсализировать — получать минимальный шаг бумаги из таблицы текпараметров и умножать его на переменный коэфф.

    Zebra Reply:

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

    «Восходящего/нисходящего тренда» — в смысле удачи

  15. sergey54
    31 Январь 2010 в 23:43 | #15

    Здравствуйте, Евгений!

    Я скачал программу Mooving, но она не открывается на моем компьютере; выдается сообщение, что неизвестна программа с помощью которой создан этот файл. Программа Quik на моем компьютере есть. Подскажите, пожайлуста, какая программа нужна для открытия файла mooving_ver11.qpl и где ее можно найти?

    С уважением, Сергей

    Евгений Reply:

    Привет.

    Это обычные текстовые файлы, которые можно редактировать любым текстовым редактором, например блокнотом. Просто .qpl не самое распространенное расширение файла.

    На странице www.hirobot.ru/skachat/ самая первая ссылка рекомендуемый мной редактор для таких файлов.

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

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

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

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

  17. Сон
    4 Февраль 2010 в 17:17 | #17

    Здравствуйте.

    и все же что надо вписывать в поле ACCOUNT=""

    для торговли на ммвб, и если не сложно, подскажите, что надо еще изменить.

    Я совсем новичок в этот деле, языка Qpile не знаю, но сам когда то владел обычными языками программирования, хотя здесь это врятли поможет:))

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

    Спасибо.

    Евгений Reply:

    Привет.

    Код этих роботов оптимизирован для площадки ФОРТС. Для ММВБ поле аккаунт можно определять автоматически =GET_VALUE (GET_ITEM («DEPO_LIMITS»,1), «TRDACCID»)&""

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

    Сон Reply:

    Спасибо что ответили:)

    Запустить робота у меня получилось, он сделал пару мелких сделок, после чего я его отключил и начал разбираться с кодом...

    получить заявки на покупку и продажу можно и из таблицы заявок,

    а вот чистые позиции думаю можно только в какой то из этих таблиц

    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:

    Привет.

    1. ТР получаем из таблицы DEPO_LIMITS из поля текущий баланс. Описание всех таблиц есть в руководстве по языку.

    2. ORDERCOUNT вам нужен в общем виде, без деления на активные покупку и продажу. Есго можно получить из таблицы заявок, прогоняя по ней цикл и подсчитывая активные заявки.

    Сон Reply:

    Привет.

    спасибо, разобрался.

    по логике все должно работать, но судя по графикам бумаг, будет много неправильных сделок с одной линией, пока прекращаю с moving'ами, надо ТА почитать сперва...и делать с более сложными сигналами.

    p.s

    перешел на defender'a.

  18. Сон
    16 Февраль 2010 в 22:29 | #18

    Привет, Евгений.

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

    в квике нельзя сделать индикатор на основе данных другого индикатора?

    уже все перечитал и перенажимал, не получается:(

    например конверт, или среднюю от rsi. Не программно же его делать:)

    Евгений Reply:

    Привет.

    Для таких вопросов есть тема «Вопросы и ответы». Надо бы ее закрепить на первой странице...

    Если в квике нет готового КОНЕЧНОГО индикатора — то только делать программно. Ничего в этом страшного нет :)

    Сон Reply:

    плохо что нет в квике такой возможности,

    написал функцию(в принципе, подобие OHLC, только время не 24 часа а торговый день) для вычисления средней от индикатора...

    думаю для большой программы прибавление еще и подобных циклов плохо:)

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

    хотя подобная функция нужна только 1 раз за интервал:)

    Евгений Reply:

    Пробуйте. Купайл достаточно мощный при правильной организации циклов.

  19. 27 Февраль 2010 в 13:04 | #19

    Евгений, подскажите пожалуйста, а для чего в коде робота нужна функция паузы, и что означают все эти числа, которые в ней присутствуют!

    Евгений Reply:

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

  20. Kobalt
    26 Март 2010 в 14:34 | #20

    Уважаемый Евгений, запустил данного робота на рынке ММВБ. Робот выставил 15 заявок на покупку подрят через каждые 10с. Почитав комментарии узнал что данный робот подходит только для Фортс. Не могли бы вы помочь в переделке робота для ММВБ?

    Так же возник вопрос в какой именно номент подается сигнал на покупку-продажу? Я так пологаю что в момент пересечения двух МА, это так?

    Готов учиться и сотрудничать, есть мысли по составлению прибыльного алгоритма на пересечении двух МА

    Евгений Reply:

    Да. Робот отследив сигнал от индикаторы честно постарался исполнить свой долг, но т.к. на ММВБ иной блок подсчета текущей позиции он все слал и слал заявки. Чтоб переделать его под ММВБ нужно переписать этот блок.

    Мувинг — это пример работы с индикаторами, он использует одну кривую и отслеживает текущую котировку. Если котировка выше мувинга — покупаем. и наоборот. по двум мувингам работает коммерческая версия «ЕМА», посмотрите на главной странице.

    Kobalt Reply:

    Где можно посмотреть пример блока для ММВБ?

    Евгений Reply:

    Примера на сайте нету, но там ничего сложного, получаем значение текущего баланса из таблиц лимитов.

    Kobalt Reply:

    Не могли бы вы дать описание данного блока что бы можно было переписать код по аналогии фортс ммвб

    Евгений Reply:

    в выходные планирую опубликовать статейку, заодно если не забуду выложу блок подсчета текпозы на ММВБ.

    Kobalt Reply:

    ждем блока тек. позиции))

  21. ksm77
    29 Март 2010 в 21:03 | #21

    Евгений, моя задача сделать так, что бы при запуске МУвинг не сразу открывал позу а при пересечении с ценой.

    Я сделал так:

    IF TP=0 AND ORDERCOUNT=0 AND PRICEMOVING

    FLAG=1

    END IF

    END IF

    КВИК на первой строке ругается...

    Евгений Reply:

    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:

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

    Евгений Reply:

    Этот фрагмент нужно не только «вставить» но и правильно согласовать с остальным кодом. Функция этого фрагмента после запуска робота ожидать пересечения, что не сразу вставать в позу.

  22. ksm77
    29 Март 2010 в 21:04 | #22

    Задал переменную

    NEW_GLOBAL («FLAG»,1)

  23. ksm77
    29 Март 2010 в 21:11 | #23

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

    После отправки комментария, фрагмент отображается некорректно...

  24. ksm77
    29 Март 2010 в 21:20 | #24

    Ок, вошли.

    Если собираемся выходить (например по Тейкпрофиту), то

    IF TP0

    FLAG=0

    PRICEFORSTOP=1

    PRICETPROFIT=1

    END IF

    ??

    Евгений Reply:

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

    ksm77 Reply:

    Это если ТР равно 0.

    А если ТР не равно 0, то FLAG=0?

    Евгений Reply:

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

  25. ksm77
    29 Март 2010 в 21:30 | #25

    Ок, спавибо

  26. ksm77
    30 Март 2010 в 21:02 | #26

    Добрый вечер!

    Да, все работает, однако в первый раз программа купила 3 лота (с промежутком в несколько секунд), потом 1 лот, в следующий раз 2 (второй спустя пару секунд). В чем может быть проблема?

    Евгений Reply:

    Причина может быть в плохой связи с сервером: робот отправляет заявку — сервер не отвечает, робот отправляет еще раз — сервер потом исполняет все скопом. Чтоб защититься надо увеличить паузу PAUSE (10) до 10 сек например в функции отправки транзакций.

  27. ksm77
    30 Март 2010 в 21:11 | #27

    Евгений, еще вопрос.

    Я взял Функцию ордер из Дефендера и Мувинга

    Расшифруйте пожалуйста, особенно — , «LIMIT»,TRID

    ORDER (PRICETPROFIT,LOTS,"B",TRID)

    ORDER (PRICEFORORDER,LOTS,OP,"LIMIT",TRID)

    У меня выход не работает, пытаюсь разобраться...

    Евгений Reply:

    ORDER (PRICEFORORDER,LOTS,OP,"LIMIT",TRID) это, точнее PRICEFORORDER,LOTS,OP,"LIMIT",TRID — списо к параметров, с которыми вызывается функция, надо смотреть одновременно и функцию и оператор с параметрами ее вызова.

    «LIMIT» — параметр лимитированной заявки — атавизм, можно не смотреть, TRID — уникальный идентификационный номер транзакции. который формируется из даты и времени выше по коду.

  28. ksm77
    31 Март 2010 в 16:31 | #28

    Евгений добрый вечер!

    Программа входит при пересечении цены и скользящей.

    При выходе «в ручную» программа сразу же открывает позицию не дожидаясь пересечения.

    Что я не учел?

    Евгений Reply:

    первый и главный принцип программирования: ОБНУЛЯЙТЕ ПЕРЕМЕННЫЕ!!! :) При отправке транзакции на вход, сразу задавайте значение флагу такое, чтоб робот начинал отслеживать пересечение с самого начала.

  29. Webam
    2 Апрель 2010 в 15:53 | #29

    Евгений Добрый день

    есть два компа оба в Финаме на одном Муфинг работает а на другом рисует 0

    Всю голову сломал че делать то

    Евгений Reply:

    На втором компе идентификатор в графике прописан?

    Webam Reply:

    на обоих все идентично может это зависит от версий Quik?

    Евгений Reply:

    Ну если совсем старая версия, то обновите. Но думаю не в этом дело. Еще раз все проверяйте. если брокер один и тот же и тип счетов тоже — должно быть все одинаково.

  30. Saboteur
    19 Апрель 2010 в 21:43 | #30

    Здравствуйте Евгений! Вопрос. Для уменьшения потерь при шуме возникла идея увеличить цену например на 50 для сбера. Смысл такой если цена пробила мувинг и скользнула еще на 50 она дальше пойдет. Маловероятно что отскочит. Достаточно ли изменения строчЕк

    IF PRICE+50>MOVING AND ORDERCOUNT=0 AND FLAGBYE=1

    и второй такой же для формирования противоположного приказа?

    Спасибо.

    Евгений Reply:

    Несколько иначе: IF PRICE>MOVING+50 AND ORDERCOUNT=0 AND FLAGBYE=1

    если цена выше чем мувинг+50.

    И для элегантности можно завести отдельную переменную для этих 50 пунктов.

    Saboteur Reply:

    Не до элегантности. Лишь бы работало. Это мои первые шаги на ниве освоения КПИЛЕ. И первые победы. Спасибо за ответ.

  31. Saboteur
    22 Апрель 2010 в 20:38 | #31

    Здравствуйте Евгений! НЕ РАБОТАЕТ... Все время выдает сообщение «у фирмы нет прав на выполнение транзакций по данному классу» пока не понял откуда ноги растут. Может Вы подскажете?

    Евгений Reply:

    У вас есть аккаунт на ФОРТС? Правильно ли вписываете его в текст робота (лучше скопировать из окна ввода заявки)?

  32. Kobalt
    29 Апрель 2010 в 09:48 | #32

    Какие таблицы нужно выводить при торговле на ммвб для отслежывания работы робота?

    Евгений Reply:

    В принципе нужен только график правильно настроенный.

  33. Kobalt
    29 Апрель 2010 в 14:49 | #33

    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:

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

  34. Saboteur
    3 Май 2010 в 17:50 | #34

    Здравствуйте!!! Вопрос: а как сделать так, чтобы только по клозе открывалась сделка? (Пример: Цена пересекла мувинг и свеча ЗАКРЫЛАСЬ ниже мувинга). Спасибо.

    Евгений Reply:

    Привет.

    Для этого вам нужно вставить в вашего робота блок OHLC, отслеживать начало новой свечи, как только она появилась — получать OHLC предыдущей свечи, и если CLOSE и т.д. по вашему алгоритму. Модуль OHLC — смотрите новый www.hirobot.ru/2010/04/ka...grafika-2-chast/

  35. Saboteur
    13 Май 2010 в 21:17 | #35

    Здравствуйте Евгений!!! Спасибо Вам за ваш сайт еще раз. Попробовал мувинга скрестить с ОХЛС и получилось!!! Правда пришлось разбираться в обоих кодах, а я не програмщик, как я уже говорил. Пока работает. Еще раз спасибо. Как только слитую часть депо отработаю благодарность не заставить себя ждать.

  36. Saboteur
    26 Май 2010 в 17:26 | #36

    Здравствуйте Евгений!!! Подскажите пожалуйста как остановить выполнение Moovinga сразу после срабатывания стопа или профита (желательно конечно профита :) )). Чтобы не выставлял заявок до нового пересечения Moovinga и цены. Спасибо

    Евгений Reply:

    Привет.

    Где то я писал уже это на сайте в комментах...

    Для этого нужно сделать блок отслеживания положения котировки относительно мувинга при нулевой позиции, вот логика:

    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

    что-то в этом роде...

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