Главная > Торговый робот > Торговый робот «Пробойный». Часть первая и вторая

Торговый робот «Пробойный». Часть первая и вторая

5 апреля 2009

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

  • инструмент;
  • таймфрейм;
  • номер бара, пробой экстремумов которого является сигналом к отправке транзакции (не забывайте, что текущий бар у нас с номером один. Подробнее о функции получения котировок читайте здесь;
  • размер стоплосса;
  • текущая позиция. Это целочисленно значение, равное полю «Текущая чистая позиция» из таблицы QUIK «Позиции по клиентским счетам». Например значение: -10 равно открытой короткой позиции на 10 лотов, и.т.д.;
  • текущая цена. Мы ее получаем из таблицы QUIK «Текущая таблица параметров». Дело в том. что в этом месте она обновляется быстрее других, а значит это самая проверенная информация;
  • значение прибыли убытка. Пока для справки, а затем мы будем учиться использовать это значение в автоматизации управления капиталом;
  • ситуация в таблице заявок. Если у нас уже висит неисполненная заявка мы об этом должны знать;
  • ситуация в таблице стоп-заявок. Аналогично;
  • HIGH и LOW текущего бара;
  • HIGH и LOW искомого бара, по условию, если HIGH текущего бара выше чем искомого, значение HIGH а значит и уровень пробоя вверх принимается бОльшее значение. Для LOW тоже самое.
  • текущее положение рынка, т.е. можно ли вообще торговать, может сейчас ночь или выходной?

Все эти данные мы получаем с помощью данного кода:

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

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

Да, и еще хотел добавить, посмотрите, в правой части сайта, есть кнопочка «Дай пять!». С помощью нее, можно отправить мне Яндекс-денег. Если кому-то мои уроки и коды будут полезны — позолотите ручку! ;)

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

  1. Pulsarr
    29 Апрель 2009 в 04:16 | #1

    Женя, в строке 69 нет ошибки ?

    Евгений Reply:

    Конечно есть, спасибо что обратили внимание. Должно быть так: IF (CURRENTLOW=0)

  2. Pulsarr
    29 Апрель 2009 в 20:21 | #2

    Нет, должно быть

    IF CURRENTLOW<LOW

    Евгений Reply:

    Исправил отрезок прямо в тексте выложенного кода. В комментариях код некорректно отображается.

  3. User
    21 Май 2009 в 20:54 | #3

    не поможите разобраться в этом коде? — не определяет открытую позицию.

    В вашей прогрмме тоже есть подобный блок.

    Ваша «ТР» — здесь «CurPos»

    n= GET_NUMBER_OF («FUTURES_CLIENT_HOLDINGS»)

    FOR i FROM 1 TO n

    fu=GET_ITEM («FUTURES_CLIENT_HOLDINGS», i)

    IF GET_VALUE (fu, «TRDACCID») = Account and GET_VALUE (fu, «SEC_SHORT_NAME») = Sec_Code

    CurPos = GET_VALUE (fu, «TOTAL_NET»)+0

    VMargin= 0+GET_VALUE (fu, «VARMARGIN»)

    END IF

    END FOR 'i

    n= GET_NUMBER_OF («FUTURES_CLIENT_LIMITS»)

    Евгений Reply:

    Первое что бросается в глаза, цикл должен начинаться с 0 а не с единицы — номер первой строки во всех таблица QUIK — ноль. Скорее всего проблема в этом.

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

    Да, и еще, добавьте ноль:

    n= GET_NUMBER_OF («FUTURES_CLIENT_HOLDINGS»)+0

    чтобы гарантированно получить число.

    Евгений Reply:

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

  4. alex_davyd
    28 Февраль 2010 в 20:54 | #4

    Евгений добрый вечер,а здесь все правильно

    IF CURRENTHIGH>HIGH

    HIGH=CURRENTHIGH

    END IF

    IF (CURRENTLOW0),или все таки(CURRENTLOW=0)

    LOW=CURRENTLOW

    END IF

    а при замене ISREALTIME на функцию ПРОВЕРКА СОЕДИНЕНИЯ С СЕРВЕРОМ,этот блок убираем полностьюб или SSTATUS надо оставить

    ISREALTIME=0 ' А МОЖНО ЛИ СЕЙЧАС ТОРГОВАТЬ?

    SSTATUS=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"STATUS"),"PARAM_VALUE")+0 ' УЗНАЕМ СТАТУС ИНСТРУМЕНТА

    IF (PRICE0) AND (HIGH0) AND (LOW0) AND (SSTATUS=1) ' ЕСЛИ ЦЕНА, ХАЙ, ЛОУ НЕ РАНЫ НУЛЮ, СТАТУС=1 (ТОРГУЕТСЯ)

    ISREALTIME=1 ' ЗНАЧИТ ПРЕПЯТСТВИЙ ДЛЯ ТОРГОВЛИ НЕТ!

    END IF

    alex_davyd Reply:

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

    IF (CURRENTLOW0),или все таки(CURRENTLOW=0)

    LOW=CURRENTLOW

    END IF

    alex_davyd Reply:

    странно опять не правильно отобразилось

  5. Евгений
    28 Февраль 2010 в 21:07 | #5

    Isrealtime и sstatus убираем совсем из всего кода, в т.ч. и из проверок. Т.к. новая проверка проверяет все это.

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

  6. alex_davyd
    28 Февраль 2010 в 21:33 | #6

    с хаем все понятно с ловом не все понятно

    IF (CURRENTLOW0),

    я убрал полностью Isrealtime и sstatus,вставил функцию ПРОВЕРКА СОЕДИНЕНИЯ,пишет ошибку в OHLC (1),таблица пустая ,в отладке все значения отбражаются кроме LOW,HIGH там нули стоят

    alex_davyd Reply:

    опять строчка, лов отобразился некоректно

    Евгений Reply:

    С лоу все тоже самое.

  7. alex_davyd
    28 Февраль 2010 в 21:47 | #7

    AND (CURRENTLOW>0)вот здесь не понятно,почему больше 0,мы же прировняли нижнею границу пробоя к текущему лоу,

    alex_davyd Reply:

    плиз неправильно выразился,мы же создали условие CURRENTLOW меньше лоу,а потом прировняли нижнею границу пробоя к текущему лоу,

    Евгений Reply:

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

  8. alex_davyd
    28 Февраль 2010 в 23:22 | #8

    Евгений я для чего переменная NEW_GLOBAL («FIRSTRUN»,1),мы же ее в этом коде не используем,или это вырезка с другой программы

    Евгений Reply:

    Если не используем удаляйте

  9. alex_davyd
    1 Март 2010 в 15:16 | #9

    Евгений добрый вечер,удалил полностью Isrealtime ,вставил функцию ПРОВЕРКА СОЕДИНЕНИЯ С СЕРВЕРОМ, пишет Unknown (or illegally called) function[OHLC(1)]

    alex_davyd Reply:

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

    Евгений Reply:

    На тестовом счете в открытии RIH0 называется RTS-3.10, т.е. вместо кода бумаги надо указывать краткое наименование.

    Евгений Reply:

    смотрите в какой строке ошибка, думаю это из-за название бумаги. см.ниже.

    alex_davyd Reply:

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

  10. alex_davyd
    1 Май 2010 в 09:39 | #10

    Евгений,поздровляю вас с праздником весны и труда,

    что обозначает THEN и для чего она нужна , встроке IF N>0 THEN в блоке ПОДСЧЕТА СТОПЗАЯВОК

    Евгений Reply:

    THEN это необязательная часть функции IF. Атавизм, можно не использовать.

  11. alex_davyd
    6 Май 2010 в 10:43 | #11

    Евгений,поздровляю вас днем великой Победы,

    почему в блоке ПОДСЧЕТА СТОПЗАЯВОК цикл наченается с 1,а не с 0

    FOR I FROM 1 TO N.

    Евгений Reply:

    Верно подмечено, надо с нуля.

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