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

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

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

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

    Sniper60 Reply:

    поправьте меня если я не прав,

    дописываем флаги в начало к уже существующим FLAGSELL и FLAGBYE

    NEW_GLOBAL («FLAGENTER»,0)

    NEW_GLOBAL («CROSS»,0)

    затем к функции ФОРМИРОВАНИЕ ПРИКАЗА дописываем остальную часть

    IF TP0 и т.д.

    правильно?

    соответственно получается как-бы тот же бот, но он после старта не будет сразу же ломиться в рынок с шашкой на голо, а подождёт чёткого сигнала на пересечение =)

    Евгений Reply:

    Привет.

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

    Sniper60 Reply:

    извиняюсь что не по основному коду снова =)

    IF FLAGENTER=1 AND TP=0 ...

    ' ТОРГОВЫЙ МОДУЛЬ

    END

    ' ТОРГОВЫЙ МОДУЛЬ — это часть «ФОРМИРОВАНИЕ ПРИКАЗА» ?

    p.s. может стоит внести этот модуль «ожидания на вход/выход» в новую редакцию робота? потому-как модуль действительно нужный =)

    Евгений Reply:

    Привет.

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

    Sniper60 Reply:

    =)))) да это я в курсе, я имел виду правильность помещения этой модификации в коде, в частности места ' ТОРГОВЫЙ МОДУЛЬ.

    получается что так?

    NEW_GLOBAL («FLAGENTER»,0)

    NEW_GLOBAL («CROSS»,0)

    IF TP0

    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

    '========= ВЫЗОВ ФУНКЦИИ ОТПРАВКИ ТРАНЗАЦИИ

    ...

    код

    ...

    Евгений Reply:

    Да, вроде так.

    В принципе, вызов функции ORDER можно осуществлять из блока «формирование приказа».

    Sniper60 Reply:

    отладчик останавливается на блоке

    '========= ПОЛУЧЕНИЕ ДАННЫХ ИНДИКАТОРА

    MOVING=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX («SMASBER», DATE, TIME),"LINES"),0),"OPEN") +0

    IF MOVING=0

    RETURN

    END IF

    и возвращается на инструмент.

    объясните пожалуйста, так этот блок вставляется всё-таки как отдельный или он заменяется как-то «ФОРМИРОВАНИЕ ПРИКАЗА», потому-как логика странная выходит, сначала робот ожидает пересечения на вход, а потом в следующем блоке тут же получает сигнал на вход слёта

    Евгений Reply:

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

    Блок отложенного входа по первому пересечению работает просто, он первоначально (если текпоза равна нулю) запоминает положение цены и мувинга относительно друг друга, и если их положение меняется — присваивает переменной FLAGENTER=1, а когда она равна единице, ниже уже уходит торговый приказ. Все это не исполняется если есть открытые позиции, в таком случае при смене положений цены и мувинга просто уходит соответствующий приказ. Нарисуйте схему на бумаге, сразу все станет ясно.

  37. Sniper60
    6 Октябрь 2010 в 22:30 | #37

    у меня такой вопросик: тут используется точка входа выхода берётся из

    IF PRICE>MOVING, т.е. на графике, когда свечка пересекает SMA по GET_CANDLE_EX мы получаем либо вход либо выход и т.п.

    так вот к чему Я, если я сменю тип графика со «свечи» на «линии», тем самым я хочу отсечь часть заявок, которые появляются на «вершках и корешках» свечек =) и выставлять ордера лишь по пересечении «Линии» цены и SMA.

    в этом случае достаточно сменить лишь GET_CANDLE_EX на другую функцию(не подскажите какая использует линии? =) ) или придётся заморочить сильнее?

    Евгений Reply:

    Привет.

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

    Но в роботе Moovong не принимаются в расчет отдельно High или Low графика цены, а берется просто текущая котировка, поэтому изменение типа графика ничего не даст. Линия цены все равно будет строиться по котировке «LAST».

  38. Kobalt
    24 Октябрь 2010 в 21:07 | #38

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

    Евгений Reply:

    Попробуйте так:

    TRID=TIME

    Kobalt Reply:

    теперь пишет что превышен лимит, наверное надо местами поменять местами в формировании приказа B и S. А как сделать что бы точность мувинга была с двумя знаками после запятой?

    Евгений Reply:

    PRICEFORORDER=PRICE+100

    Вот это увеличивает текущую котировку на 100 пипсов для псевдомаркета. Естественно, для некоторых инструментов 100 — это много. Уменьшите этот параметр, чтоб цена заявки по выбранному вами инструменту входила в лимит.

    Разрядность после запятой выводимых в таблицу параметров регулируется в форме описания соответствующего поля:

    PARAMETER MOVING;

    PARAMETER_TITLE MOVING;

    PARAMETER_DESCRIPTION MOVING;

    PARAMETER_TYPE NUMERIC (10,0);

    END

    NUMERIC (10,0) — десять это количество знаков до запятой, ноль — после . Поставьте:

    NUMERIC (10,2)

  39. Kobalt
    29 Октябрь 2010 в 00:03 | #39

    Всем доброй ночи! Евгений а не могли бы вы рассказать по подробнее о псевдомаркете. Непойму, зачем он нужен? Если сигналом для покупки или продажи служит положение цены и положение мувинга, так и надо покупать или продовать по нынешней цене например по close. Зачем завышать или занижать цену? Да и по чему часть операций совершилась, а вторая часть так же выдает ошибку превышения лимита(щас стоит PRICEFORORDER=PRICE+1)

    Евгений Reply:

    Привет.

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

    PRICEFORORDER=PRICE+1 — так вы можете не попасть в кратность цены, например при торговле фьючом РТС (минимальный шаг цены=5) система не выполнит такой приказ, т.к. цена не кратна пяти.

  40. Kobalt
    29 Октябрь 2010 в 18:57 | #40

    ORDERCOUNTSELL что отображает?(количество купленных лотов?)

    Евгений Reply:

    Количество активных заявок на продажу по инструменту

    Kobalt Reply:

    а можно сделать для удобства тип у мувинга string (30)? чтоб как у prise было

    Евгений Reply:

    Можно.

  41. Kobalt
    31 Октябрь 2010 в 22:42 | #41

    комментарий выше уже не важен. Евгений посаветуйте как написать функцию котороя отслеживала пересечение МА и ЦЕНЫ, а так же выдавала бы значение в какую сторону было направлено пересечение(т.е. цена пересекла ма или на ма пересеклась с ценой)

    Евгений Reply:

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

  42. Kobalt
    4 Ноябрь 2010 в 22:28 | #42

    Спасибо, уже разобрался))) Теперь такой вопрос — почему после продажи при такой ситуации что цена ниже мувинга, портфель опять пытается продать хотя входа не было

    '========= ФОРМИРОВАНИЕ ПРИКАЗА

    OP="«

    IF TP=0

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

    OP=»B"

    FLAGBYE=0

    FLAGSELL=1

    END IF

    IF PRICE0 AND PRICE<=MOVING

    IF ORDERCOUNT=0 AND FLAGSELL=1

    LOTS=2

    OP="S"

    FLAGSELL=0

    FLAGBYE=1

    END IF

    END IF

    Евгений Reply:

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

  43. Kobalt
    11 Ноябрь 2010 в 08:57 | #43

    ошибка — Не задан лимит пользователя по деньгам. В чем проблема?

    Евгений Reply:

    Денег хватает?

    Kobalt Reply:

    200 тыщь на 2-е акции?!

    Евгений Reply:

    Вот что я нашел в руководстве по QUIK:

    «Не задан лимит по инструменту — Пользователю не установлен лимит по инструменту. Обратитесь к администратору системы QUIK.»

    "Не задан лимит пользователя по деньгам — Администратором системы не установлен лимит пользователя по деньгам. Обратитесь к администратору системы. "

  44. Kobalt
    22 Ноябрь 2010 в 18:57 | #44

    как получать значения moovig-a не каждую секунду, а каждую минуту?

    Евгений Reply:

    Самый простой способ — поставить период расчета портфеля = 60 сек.

    Kobalt Reply:

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

    MAPR=MoovinP-PriceP

    MAR=Mooving-Price

    IF Mooving>Price 'ВЫЧЕСЛЯЕМ РАЗНОСТЬ

    IF MAPR<MAR AND MAPRMAR 'ВЫСТАВЛЯЕМ FLAGVXODA

    FLAGVXODA=1

    END IF

    END IF

    MoovingP=Mooving1

    PriceP=Price

    Евгений Reply:

    Нужно скрестить функцию OHLC и вашего робота. Функция будет получать значения обеих ЕМА на предыдущей, сформированной, свече.

    Kobalt Reply:

    Добрый день Евгений! Хочу поставить что бы портфель пересчитывался каждую секунду, а МА вычеслялось каждую минуту. Что нужно поменять в тайм что бы секунды были по нулям?

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

    Евгений Reply:

    ПРивет.

    Да, попробуйте.

    Kobalt Reply:

    )))) Это понятно что надо пробывать.

    я спрашивал что нужно изменить в функции timeserv для того что бы получать время по минутам, а секунды чтоб были по нулям?

    и кстати — Доступен WordPress 3.0.2! Пожалуйста, сообщите администратору сайта.

    Евгений Reply:

    TIMESERV=SUBSTR (SERVERTIME,0,2)&SUBSTR (SERVERTIME,3,2)&"00"

  45. Sniper60
    8 Декабрь 2010 в 04:02 | #45

    hi, а основной код не будет более модифицироваться? я имею ввиду «редакция кода от 29 января 2010 года».

    может какие-нибудь исправления там или добавления появятся =)

  46. Sniper60
    13 Декабрь 2010 в 14:23 | #46

    после обновления квика (5,18,0,239) вылезает такое сообщение «Неправльно указан идентификатор транзакции ...»

    не подскажите что изменилось такого и как это поправить?

    Евгений Reply:

    Найдите в своем роботе строку:

    TRID=TIME&DATE

    Замените ее на:

    TRID=TIME

    HРазработчики изменили разрядность идентификатора. Перезагрузите робота после изменений в Квик.

  47. Sniper60
    4 Апрель 2011 в 00:47 | #47

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

    в текущем алгоритме идея такая же (LOTS=ABS (TP)*2 ' УДВОЕНИЕ ЛОТОВ ДЛЯ РЕВЕРСА)

    но получается так, что выдаёт сообщение о нехватке средств, т.е. отправляется приказ видимо на сумма Х*2 и он почему-то не проходит на реверс, в чём может быть дело?

    если по простому например вы работаете с 10 лотами (т.е. сумма депо ограничена работой только на 10 лотов и не лотом больше), а с текущим реверсом, чтобы робот нормально перевернул из лонга в шорт, надо работать с 5 лотами, чтобы войти в лимит.

    Евгений Reply:

    Привет.

    Задайте этот вопрос брокеру. У меня если денег хватает на 10 лотов, то встречная заявка/сделка на 20 принимается. если в этот момент нет активного стопа или активного лимитордера, под них тоже происходит блокировка средств. Опять же, если вы работаете на ММВБ, там «шорты» отдельная история, которую тоже надо обсудить с брокером.

  48. 3 Октябрь 2011 в 21:30 | #48

    Евгений, подскажите!

    Настроил робота на BRV1 цену бумаги показывает, также как и на графике с двумя цифрами после запятой, а значение movinga — только целые значения, хотя на графике ещё четыре цифры после запятой!!! Объясните, пожалуйста, с чем это может быть связано.

  49. max.pain85
    26 Март 2012 в 12:09 | #49

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

    Евгений Reply:

    Привет.

    В текущей.

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