Торговый робот «Пробойный». Часть первая и вторая
Сегодня мы рассмотрим первую часть кода торгового робота «Пробойный», созданного на основе торговой стратегии «Пробойная». Для начала несколько слов об алгоритме этой части. Для торговли нам необходимы следующие данные:
- инструмент;
- таймфрейм;
- номер бара, пробой экстремумов которого является сигналом к отправке транзакции (не забывайте, что текущий бар у нас с номером один. Подробнее о функции получения котировок читайте здесь;
- размер стоплосса;
- текущая позиция. Это целочисленно значение, равное полю «Текущая чистая позиция» из таблицы QUIK «Позиции по клиентским счетам». Например значение: -10 равно открытой короткой позиции на 10 лотов, и.т.д.;
- текущая цена. Мы ее получаем из таблицы QUIK «Текущая таблица параметров». Дело в том. что в этом месте она обновляется быстрее других, а значит это самая проверенная информация;
- значение прибыли убытка. Пока для справки, а затем мы будем учиться использовать это значение в автоматизации управления капиталом;
- ситуация в таблице заявок. Если у нас уже висит неисполненная заявка мы об этом должны знать;
- ситуация в таблице стоп-заявок. Аналогично;
- HIGH и LOW текущего бара;
- HIGH и LOW искомого бара, по условию, если HIGH текущего бара выше чем искомого, значение HIGH а значит и уровень пробоя вверх принимается бОльшее значение. Для LOW тоже самое.
- текущее положение рынка, т.е. можно ли вообще торговать, может сейчас ночь или выходной?
Все эти данные мы получаем с помощью данного кода:
Код на QPILE доступен только зарегистрированным пользователям.
Теперь у нас есть все для разработки механизма торговли и отправки транзакций. В следующей части мы рассмотрим механизм условий, для определения действия.
Да, и еще хотел добавить, посмотрите, в правой части сайта, есть кнопочка «Дай пять!». С помощью нее, можно отправить мне Яндекс-денег. Если кому-то мои уроки и коды будут полезны — позолотите ручку!
Женя, в строке 69 нет ошибки ?
Евгений Reply:
апреля 29, 2009 at 19:17
Конечно есть, спасибо что обратили внимание. Должно быть так: IF (CURRENTLOW=0)
Нет, должно быть
IF CURRENTLOW<LOW
Евгений Reply:
апреля 29, 2009 at 20:39
Исправил отрезок прямо в тексте выложенного кода. В комментариях код некорректно отображается.
не поможите разобраться в этом коде? — не определяет открытую позицию.
В вашей прогрмме тоже есть подобный блок.
Ваша «ТР» — здесь «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:
мая 21, 2009 at 21:03
Первое что бросается в глаза, цикл должен начинаться с 0 а не с единицы — номер первой строки во всех таблица QUIK — ноль. Скорее всего проблема в этом.
Второе мне показалось странным, зачем фильтровать найденную строку по номеру счета и секции? фильтруйте по нужному инструменту. так проще. А если торгуете вообще одним инструментом, то эти фильтры вообще не нужны.
Да, и еще, добавьте ноль:
n= GET_NUMBER_OF («FUTURES_CLIENT_HOLDINGS»)+0
чтобы гарантированно получить число.
Евгений Reply:
мая 21, 2009 at 21:04
В догонку: для подобных консультаций есть тема прям на первой странице форума. прошу публиковать вопросы там для других посетителей, у которых могут возникнуть такие же вопросы. а тут бац! а на него уже есть ответ
Евгений добрый вечер,а здесь все правильно
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:
февраля 28, 2010 at 21:00
Евгений плиз, строчку неправильно отобразил я вот так хотел
IF (CURRENTLOW0),или все таки(CURRENTLOW=0)
LOW=CURRENTLOW
END IF
alex_davyd Reply:
февраля 28, 2010 at 21:03
странно опять не правильно отобразилось
Isrealtime и sstatus убираем совсем из всего кода, в т.ч. и из проверок. Т.к. новая проверка проверяет все это.
Насчет CURRENT — представьте что у нас хай нужного бара=100, а текущая цена уже 120 и в этот момент вы включаете робота, поэтому в этом куске приравниваем верхнюю границу пробоя к текущему хаю.
с хаем все понятно с ловом не все понятно
IF (CURRENTLOW0),
я убрал полностью Isrealtime и sstatus,вставил функцию ПРОВЕРКА СОЕДИНЕНИЯ,пишет ошибку в OHLC (1),таблица пустая ,в отладке все значения отбражаются кроме LOW,HIGH там нули стоят
alex_davyd Reply:
февраля 28, 2010 at 21:35
опять строчка, лов отобразился некоректно
Евгений Reply:
февраля 28, 2010 at 21:37
С лоу все тоже самое.
AND (CURRENTLOW>0)вот здесь не понятно,почему больше 0,мы же прировняли нижнею границу пробоя к текущему лоу,
alex_davyd Reply:
февраля 28, 2010 at 22:04
плиз неправильно выразился,мы же создали условие CURRENTLOW меньше лоу,а потом прировняли нижнею границу пробоя к текущему лоу,
Евгений Reply:
марта 1, 2010 at 19:56
Эта проверка на наличие данных как таковых. т.к. если CURRENTLOW равен нулю, то и уровень порогового значения для робота тоже будет ноль. Такая ситуация может быть при переходе с одной свечи на другую, иногда сервер биржи в этот момент присылает ноль.
Евгений я для чего переменная NEW_GLOBAL («FIRSTRUN»,1),мы же ее в этом коде не используем,или это вырезка с другой программы
Евгений Reply:
марта 1, 2010 at 19:56
Если не используем удаляйте
Евгений добрый вечер,удалил полностью Isrealtime ,вставил функцию ПРОВЕРКА СОЕДИНЕНИЯ С СЕРВЕРОМ, пишет Unknown (or illegally called) function[OHLC(1)]
alex_davyd Reply:
марта 1, 2010 at 16:48
странно на реале все работает,на учебном счету в открытии не работает почему неправильное название функции не понятно
Евгений Reply:
марта 1, 2010 at 19:59
На тестовом счете в открытии RIH0 называется RTS-3.10, т.е. вместо кода бумаги надо указывать краткое наименование.
Евгений Reply:
марта 1, 2010 at 20:00
смотрите в какой строке ошибка, думаю это из-за название бумаги. см.ниже.
alex_davyd Reply:
марта 1, 2010 at 20:08
да нет с названием все , нормально,скорее на сервере в открытии проблемы,удалил пробойного через час подгрузил все зароботоло ,
Евгений,поздровляю вас с праздником весны и труда,
что обозначает THEN и для чего она нужна , встроке IF N>0 THEN в блоке ПОДСЧЕТА СТОПЗАЯВОК
Евгений Reply:
мая 1, 2010 at 21:40
THEN это необязательная часть функции IF. Атавизм, можно не использовать.
Евгений,поздровляю вас днем великой Победы,
почему в блоке ПОДСЧЕТА СТОПЗАЯВОК цикл наченается с 1,а не с 0
FOR I FROM 1 TO N.
Евгений Reply:
мая 6, 2010 at 21:36
Верно подмечено, надо с нуля.