Торговый робот для QUIK «Пробойный». Часть четвертая
Функции нужны для того, чтоб исполнять определенные задачи, которые часто встречаются в алгоритме, либо просто чтобы вынести определенный код отдельно от основного алгортима. Вызываются функции по своему имени, при необходимости при их вызове мы может передавать какие-либо параметры в функцию. Для начала, немного теории о функциях (подпрограммах) в QPILE. Конструктивно как они выглядят мы уже знаем:
FUNC название(параметр1,параметр2,...,параметрN) код подпрограммы END FUNC
ORDER(0,LOTS,OP,"LIMIT",TRID)
Это функция из третьей части нашего робота. ORDER — имя, и в скобках мы передаем параметры, обозначенные в описании самой функции:
FUNC ORDER(FPRICE,FLOTS,FDIRECTION,FTYPE,FTRID)
Мы передаем цену, количество лотов, направление, тип заявки, и идентификационный номер транзакции.
Правильное использование функций значительно упрощает программирование, а также визуальное восприятие кода. Я всегда стараюсь правильно организовать код, чтоб если понадобится через год опять его поднять и разобраться — можно было сразу понять что куда.
Итак, вернемся к четвертой части нашего робота для QUIK «Пробойный». Код:
Код на QPILE доступен только зарегистрированным пользователям.
Постарайтесь разобраться в каждой строчке кода. Тут есть уже знакомые нам функции получения котировок из графика QUIK, функции перевода даты и времени в текстовый формат и пр. Если Вы разберетесь с данным кодом, потом сможете менять условия и построить своего собственного робота.
В следующий раз мы обсудим как открывать учебный счет и приступим к тестированию!

Добрый день. А можно более подробно прокомментировать строчки 8-9. А то никак не могу врубиться. что мы тут делаем.
Это функция получения котировок по номеру бара.
в 7 строке мы получаем текущей значение «минут», например 49;
в 8 строке мы округляем значение минут до нашего интервала(например 5-ти минутки): 5*округлениевниз(49/5)=45:
в 9 строке мы получаем целочисленное значение окончания цикла, которое зависит от установок DAYTOFIND (сколько дней назад ищем котировки)
подробнее об этом процессе читайте в статье: www.hirobot.ru/2009/03/ka...iz-grafika-quik/
Скажите, пожалуйста, а что такое (' ДЕЛАЕМ ПСЕВДОМАРКЕТ)?
Евгений Reply:
мая 25, 2009 at 15:59
На рынке ФОРТС нет понятия маркетной, или рыночной заявки, но ее можно имитировать путем завышения, или занижения цены, в зависимости от того, какую операцию нам нужно сделать. Таким образом торговая система, при исполнении таких заявок, собирает нужное нам кол-во лотов по стакану. Обычно я к цене LAST добавляю или отнимаю определенное кол-во пунктов.
При загрузке портфеля выдает ошибку при расчете:
Unknown identifier CLASSCODELIST [CANDLE=GET_CANDLE(CLASSCODELIST,INSTRUMENT, "", INTERVAL & "", "PRICE", TEXTDATA, TEXTTIME)]
там не может быть ошибки в функции OHLC, в самом цикле?
Евгений Reply:
мая 25, 2009 at 16:01
CLASSCODELIST="SPBFUT" вставьте эту строку в начало программы, где определяется инструмент. Забыл...
Спасибо, вроде все по
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», (FPRICE+(1000*SIGN))&"")
а 1000 — это не круто для маркетного отступа?
или он не здесь задается?
Кстати, с High, Low тоже самое:
Unknown identifier HIGH [CURRENTHIGH=HIGH]"
Может в другом месте их задать надо?
Евгений Reply:
мая 25, 2009 at 19:18
1000, или иное значение зависит от лимитов дневной цены.
Что то я действительно не понял, а как правильно задать переменные —
HIGH и LOW?
Снова при расчете портфеля выдает ошибку:
Unknown identifier
HIGH [CURRENTHIGH=HIGH]
кусок из кода:
OHLC (1) '...ДЛЯ ОПРЕДЕЛЕНИЯ ТЕКУЩЕГО ЗНАЧЕНИЯ HIGH И LOW
CURRENTHIGH=HIGH ' ПРИСВАИВАЕМ ПЕРЕМЕННЫМ ЗНАЧЕНИЯ ТЕКУЩИХ HIGH И LOW
CURRENTLOW=LOW
OHLC (CANDLETOFIND) ' ЗАПРАШИВАЕМ КОТИРОВКИ БАРА ПО УСЛОВИЮ
IF CURRENTHIGH>HIGH
HIGH=CURRENTHIGH
END IF
IF (CURRENTLOW0)
LOW=CURRENTLOW
Евгений Reply:
мая 25, 2009 at 19:22
OHLC (CANDLETOFIND) — это убираем;
в начале программы, где определяются переменные, укажите:
HIGH=0
LOW=0
п.с. эти коды — вырезки из более мощной системы, может чего «недорезал»
Евгений, добрый день.
Скачал в апреле робота «пробойный», стал его изменять, а вот сейчас понадобилось сравнить с оригиналом твоим и не вижу, где он выложен.
Еще вопрос: если впоследствии обнаруживаются ошибки в кодах роботов, ты их правишь? или они выложены по состоянию на момент выхода статьи?
Евгений Reply:
июня 7, 2009 at 15:54
Привет. Ошибки правлю, пишите где. С сайта ничего не удалял, просто «пробойный» в объединенном виде не выкладывал, его надо собирать по частям в публикациях. Вообще я преследую цель научить, а не дать «халяву», прошу прощения за выражение, поэтому выкладываю коды от 99% до 100% готовности, каждый дорабатывает под себя. Я уверен что даю 100% нужной для этого информации.
А, точно. Я его и собрал из кусочков.
У меня при копировании со странички вылезли & в тексте робота, убирал руками.
Добрый день Евгений.
FUNC ORDER (FPRICE,FLOTS,FDIRECTION,FTYPE,FTRID) ' ФУНКЦИЯ ОТПРАВКИ ТРАНЗАКЦИЙ В ТОРГОВУЮ СИСТЕМУ 198.
199.IF FTYPE="LIMIT" 200.
201.FPRICE=PRICE
203.END IF
Для чего введен префикс F в формальных параметрах и откуда взялся PRICE в строке 201
И еще. Почему не используете регистр для имен переменных?
QPILE это позволяет.
Евгений Reply:
октября 8, 2009 at 21:49
Привет.
Префикс F введен чтоб не путаться в переменных, можно не использовать но мне так удобнее, и я знаю что с этим префиксом переменные я использую внутри функции отправки транзакций.
FPRICE=PRICE — это атавизм от более навороченной функции. Насколько я помню при вызове этой функции мы вместо цены передаем ноль, а внутри функции уже присваиваем FPRICE значение цены последней сделки. Я уже не помню для чего я делал таким образом... В этом случае можно вообще ничего не передавать, а внутри функции вместо FPRICE использовать сразу переменную PRICE. Если PRICE — это цена последней сделки нашего инструмента.
Насчет регистра не понял... Наверное имеете в виду почему все прописными буквами пишу? Мне так удобнее код читать.
Добрый день Евгений.
Я так и не понял. Price это какая-то глобальная переменная?
201.FPRICE=PRICE
Сохранит ли FPRICE присвоенное значение после выхода из функции?
Про регистр Вы все правильно поняли. Не используете — жаль. Это существенно избавляет от ошибок в листинге еще до отладки. Для QPILE с его отладчиком и редактором крайне важно!
Евгений Reply:
октября 9, 2009 at 19:38
PRICE — в самом начале робота этой переменной должна присваиваться цена последней сделки из табл текпарам для нашего инструмента. FPRICE будет сохранять присвоенное значени пока мы его сами не поменяем.
Спасибо, понял — попробую.
Евгений, объясните, пожалуйста, функцию FUNC KILLALLSTOP.
Не очень поимаю зачем там ключ с цифрой 3
N3=GET_NUMBER_OF («STOP_ORDERS»)
и в номере транзакции что означает amp
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «TRANS_ID», «0»&TIME)
Евгений Reply:
ноября 22, 2009 at 18:46
amp — это дурацкий движок блога вписывает вместо «&»
N3 — ничего не значит, это переменная.
pocemon Reply:
ноября 22, 2009 at 20:18
Спасибо.
Евгений я собрал все разделы робота в одно целое и у меня вылетает ошибка, я напишу полностью что вылетает:
"Произошла ошибка при загрузке формулы расчета портфеля «PROBOY», идентификатор организации «ALL_FIRMS» сообщение об ошибке "File: (null), line: 513. END iif missing "
уже час ковыряюсь и не могу разобраться в чем дело. Помогите пожалуйста)
Евгений Reply:
декабря 18, 2009 at 17:56
Где то пропустили оператор END IF. Посчитайте количество «начал» операторов условия IF и их окончаний.
Евгений Reply:
декабря 18, 2009 at 17:57
В догонку: час — это ничто... Я годы потратил чтоб разбираться в этом языке. Не сдавайтесь и не паникуйте раньше времени
chelny07 Reply:
декабря 18, 2009 at 18:00
спасибо сейчас буду смотреть)
chelny07 Reply:
декабря 18, 2009 at 18:35
Евгений еще вопросик? теперь ошибка: Unknown identifier DATE [ TRID=DATE&TIME] С этим что делать? Я так понимаю не хватает переменной чтоли?
Евгений Reply:
декабря 18, 2009 at 18:45
Да.
Объясните значение
OUTPUT=SET_VALUE (OUTPUT,"GO",GO)
PARAMETER GO;
PARAMETER_TITLE GO;
PARAMETER_DESCRIPTION GO;
PARAMETER_TYPE NUMERIC (10,0);
END
программа выдавала ошибку, убрав эти параметры, она заработала
Евгений Reply:
декабря 24, 2009 at 18:19
GO — гарантийное обеспечение. В первоначальной версии был модуль расчета позиции в % от доступного капитала. Скоро выложу функцию.
KentAVP Reply:
декабря 25, 2009 at 14:31
С остальными ошибками разобрался. Quik теперь выдает мне сообщение «MUST BUY FIRST» или «MUST SELL FIRST».
Уже который час мучаюсь, объясните как решить эту проблему?
Евгений Reply:
декабря 25, 2009 at 23:12
Эти сообщения робот выдает при отправке транзакции, если сделка не проходит то:
1. неверный код инструмента
2. нулевое либо не положительное кол-во лотов
3. неверная цена
Расширенная диагностика MESSAGE (RESULT,1) должна написать в чем конкретно причина.
KentAVP Reply:
декабря 26, 2009 at 10:58
у меня пожалуй еще вопрос.
есть строки
SIGN=-1
IF FDIRECTION="B"
SIGN=1
END IF
Получается для OPERATION будет определен только параметр B, а где параметр S?
может для SIGN=-1 сделать также, т.е.
FDIRECTION="S"
SIGN=-1
END IF
FDIRECTION="B"
SIGN=1
END IF
Евгений Reply:
декабря 26, 2009 at 20:58
Нет, в первоначальном блоке все верно. Просто это элегантное решение, подсказанное мне моим другом.
Изначально переменная SIGN=-1 и лишь в том случае если у нас покупка переменная меняет знак, а если продажа то условие не срабатывает и переменная остается отрицательной! Ускорение работы программы, пусть небольшое но все же.
KentAVP Reply:
декабря 28, 2009 at 12:18
Я сделал, как Вы сказали. За сообщением «MUST SELL FIRST» шло следющее «110000». Это очень походит на значение TIME, в тот момент времени, когда я работал.
Как исправить эту ошибку
Евгений Reply:
декабря 28, 2009 at 19:18
Отследите по коду, какой оператор посылает это сообщение. Расширенная диагностика что пишет? Полистайте окно сообщений. Проследите отладчиком значения переменных.
KentAVP Reply:
января 13, 2010 at 12:45
не могли бы вы помочь пожалуйста? у меня счетчик TP постоянно на нуле, даже при открытой позиции. с чем это может быть связано?
Евгений Reply:
января 13, 2010 at 19:30
1. Неверный код инструмента (если рынок ФОРТС, то у разных брокеров инструменты либо короткие коды либо длинные: RIH0 или RTS-3.10, попробуйте оба кода)
2. Если площадка ФОРТС — неверная строка в таблице Позиции клиента
3. Если ММВБ — неверная строка в таблице лимитов по бумагам.
...
Напишите код получения ТП с указанием инструмента и площадки.
KentAVP Reply:
января 13, 2010 at 19:35
INSTRUMENT="SRH0"
LOTS=2
CLASSCODELIST="SPBFUT"
STOPLOSS=10
INTERVAL=10
DAYTOFIND=30
CANDLETOFIND=2
NEW_GLOBAL («FIRSTRUN»,1)
NEW_GLOBAL («FLAGSTOP»,1)
NEW_GLOBAL («FLAGSELL»,1)
NEW_GLOBAL («FLAGBUY»,1)
TP=0
N=GET_NUMBER_OF («FUTURES_CLIENT_HOLDINGS»)+0
IF N>0
FOR I FROM 0 TO N
IF GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS», I), «SEC_SHORT_NAME»)=INSTRUMENT
TP=GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS»,I), «TOTAL_NET»)+0
END IF
END FOR
END IF
насчет кода. но ведь портфель определяет SRH0. и цены, и данные котировок. сделка совершается по алгоритму, но TP остается на нуле, из-за этого программа посылает снова и снова заявки по условию, хотя не должны
Евгений Reply:
января 13, 2010 at 20:11
Попробуйте поменять «SEC_SHORT_NAME» на «SECCODE»
KentAVP Reply:
января 13, 2010 at 20:30
спасибо,проблема решена!
я наверное надоел вам со своими сообщениями
) но вот у меня вопрос. я первоначально поставил настройки для SRH0, и потом захотел поменять на SiH0. из квика удалил портфель и заново его загрузил, то есть обновленный.
так вот для SiH0 пишет что неизвестный параметр HIGH в строке CURRENTHIGH=HIGH. очень странно вернув настройки для SRH0 все работает снова.
с чем может быть это связано?
Евгений Reply:
января 14, 2010 at 17:20
Попробуйте SIH0 т.е. написать код инструмента ПРОПИСНЫМИ буквами.
KentAVP Reply:
января 14, 2010 at 17:33
пробовал, не помогает. самое интересное, другие контракты работают, например, GZH0, RIH0, а доллар не работет... странно...
Евгений Reply:
января 14, 2010 at 22:07
Может попробовать длинный код?
KentAVP Reply:
января 23, 2010 at 7:46
проблема решена.
надо между заголовком и телом программы добавить:
USE_CASE_SENSITIVE_CONSTANTS
Добрый день Евгений,пока не удалил OUTPUT=SET_VALUE (OUTPUT,"MONEYCURRENTBALANCE",MONEYCURRENTBALANCE),робот не загружался,в сообщении квик пишет"Unknown identifier MONEYCURRENTBALANCE" не может индефицировать,в коментариях подобной проблемы не нашел, не могу понять что это ,и для чего нужно в масиве
Евгений Reply:
февраля 16, 2010 at 19:36
MONEYCURRENTBALANCE — это предполагалось получение входящего баланса, приравняйте ее к нулю в начале программы.
появилась новая проблема,Unknown identifier DATE [ TRID=DATE&TIME],а куда и какую переменную надо вставитьнепонятно,
Евгений Reply:
февраля 16, 2010 at 19:36
Ну следовательно нет такой переменной как DATE, приравняйте к ней текущую дату. Учитесь решать задачи!
спасибо теперь все понятно,так я и учюсь ,пока не совсем бывает понятно условия,пыхчу ,мучаюсь, я ведь с нуля, но ведь интересно,очень позновательный у вас ресурс,
вот я и собрал, не понял как получилось ,но работает,одна маленькая подсказка и все работает,провозился целый день и все сразу стало понятно,задачки восновном на логику
Добрый день Евгений,собрал то я собрал,все работает в портфеле все отоброжается,но кагда наступает условие слелки,квик пишет"НЕ указан тип транзикации",я просмотрел все комментарии,просмотрел весь блок отправки транзикации,поменял в строке"TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «SECCODE», INSTRUMENT),INSTRUMENT на RTS-3.10,я видел у вас такой пример в описаниях функции,хотя от переменны мест слогаемых сумма не меняется,
А с отсутсвием переменной DATE,решил задачку вот так
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM («SERVERTIME»)
SERVERDATE=GET_INFO_PARAM («TRADEDATE»)
TIMESERV=SUBSTR (SERVERTIME,0,2)&SUBSTR (SERVERTIME,3,2)&SUBSTR (SERVERTIME,6,7)
TIME=TIMESERV+0
DATE=SUBSTR (SERVERDATE,6,4)&SUBSTR (SERVERDATE,3,2)&SUBSTR (SERVERDATE,0,2)
TRID=TIME&DATE
Евгений Reply:
февраля 17, 2010 at 19:13
Дата — все верно.
Есть два формата написания кода инструмента. точнее код один, но некоторые брокеры вместо когда принимают краткое название бумаги. отсюда некоторая путаница.
да я обэтом знаю и всегда меняю,уменя учебный счет в Окрытии,там принято RTS-3.10,а реал уменя атон там RIHO, я пробывл и так и так,но уменя бот все видит ,работает,подсвечивает таблицу, все параметры отраженны в портфеле,но когда должна быть сделка ,квик выдает сообщение «„НЕ указан тип транзикации“, я так думаю квик не может определить bay или sell.
вот первый блок для открытия;
PROGRAM
CLASSCODELIST=»SPBFUT"
INSTRUMENT="RTS-3.10" ' ИНСТРУМЕНТ
LOTS=1 ' ОПЕРАЦИОННОЕ КОЛИЧЕСТВО ЛОТОВ
STOPLOSS=100 ' РАЗМЕР СТОПЛОССА В ПУНКТАХ ФОРТС
INTERVAL=60' ТАЙМФРЕЙМ НА ГРАФИКЕ
DAYTOFIND=30 ' СКОЛЬКО ДНЕЙ НАЗАД ИСКАТЬ СВЕЧИ
CANDLETOFIND=2 ' НОМЕР НУЖНОГО НАМ БАРА, ПРОБОЙ ЭКСТРЕМУМОВ КОТОРОГО ЯВЛЯЕТСЯ СИГНАЛОМ К ПОКУПКЕ/ПРОДАЖЕ
NEW_GLOBAL («FIRSTRUN»,1) ' ПЕРЕМЕННЫЕ КОТОРЫЕ ПРИГОДЯТСЯ НАМ ПОЗЖЕ
NEW_GLOBAL («FLAGSTOP»,1)
NEW_GLOBAL («FLAGSELL»,1)
NEW_GLOBAL («FLAGBUY»,1)
HIGH=0
LOW=0
MONEYCURRENTBALANCE=0
TP=0 ' ОБНУЛЯЕМ СЧЕТЧИК ТЕКУЩЕЙ ПОЗИЦИИ,
я думаю проблема в нутри в этой функции FUNC ORDER (FPRICE,FLOTS,FDIRECTION,FTYPE,FTRID),где мы передаем цену, количество лотов, направление, тип заявки, и идентификационный номер транзакции,я прям по строчке просмотрел весь блок отправки транзакций,но пока не хватает знаний и опыта, я пересмортрел все ваши предыдущии статьи и нашел отличие в строчке , TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «SECCODE», INSTRUMENT)в место INSTRUMENT стоял код инсрумента,но это ж без разницы код инструмента у нас прописан в начале программы,
Добрый день Евгений,наверно функция FUNC ORDER (FPRICE,FLOTS,FDIRECTION,FTYPE,FTRID) не причем там я все что нужно все правильно прописал,квик выдает сообщение «„НЕ указан тип транзакации“,а транзакции у на это ввод заявок,снятие заявок ,итп,значит транзакции у меня проходят,толко квик не может понять направление выстовления заявки,наверное не хватает строчки вот здесь:
TRID=TIME&DATE
OP="« ' ЗАДАЕМ ТЕКСТОВУЮ ПЕРЕМЕННУЮ ОПЕРАЦИИ
квик не видет,текстовую ПЕРЕМЕННУЮ,не может понять что это „B“или»S".
Я извеняюсь за назойливость,кроме вас спросить больше не у кого,а разобратся в купайле надо я вери в будущее квика.
Евгений Reply:
февраля 18, 2010 at 22:15
Тип транзакции это
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACTION», «NEW_ORDER»)
перед строкой
IF FTYPE="STOP"
п.с. как нибудь соберусь перепишу этого робота...
Евгений ,ситуация патовая загружаю пробойного на реал,и учебный счета, различие лиш только в коде инструмента и ACCOUNT,на реале в графе ISREALTIME значение 1,припятсвий торговать нету,а на учебном счету значение 0,до обеда точнее до14.00 ,было тоже 1.
Евгений Reply:
февраля 18, 2010 at 22:13
Удаляйте функцию ISREALTIME, вот ее хороший заменитель:
'========= ПРОВЕРКА СОЕДИНЕНИЯ С СЕРВЕРОМ
IF IS_CONNECTED ()<>1
RETURN
END IF
Я добовлял сегодня функцию ПРОВЕРКА СОЕДИНЕНИЯ С СЕРВЕРОМ,я ее нашел в мувинге,только я думал у нее чуть другая функция,а при удалении ISREALTIME, статус изменится он тоже=0,я через отладку посмотрел,
Евгений Reply:
февраля 19, 2010 at 10:16
ISREALTIME надо совсем удалить и из проверок в т.ч.
Добрый день Евгений,попробовал я удалить ISREALTIME ,не получилось,таблица пустая,квик выдоет сообщениее «MUST SELL FIRST,прошелся отладчиком RESULD показывает толко время, вернулся к функция ISREALTIME зароботала,стопы перестали выстовлятся, у меня была открытая позиция бот ее закрыл по стопу,
может позволите я выложу код полностью и мы в месте разбирем ошибку.
Евгений Reply:
февраля 19, 2010 at 21:47
выкладывай.
Евгений добрый вечер,если добавить строчку
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «TYPE», «L»),после строки
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACTION», «NEW_ORDER»)в этом вродебы и есть моя проблема под названием «НЕ указан тип транзикации» ,квик не понимает какая завка лимитированная или рыночная ,сечас у меня до понедельника нет доступа к учебному счету,или с этой строки достаточно IF FTYPE="LIMIT"
Добрый день Евгений,помогите разобратся с STOPORDERCOUNT1 (KEY),по условию у нас должно после реверса стоп снятся , и выстовится согласно направлению,а также при изменени велечины HIGH, LOW стоп должен удалятся и вновь выстовлятся на пункты заданые в STOLOSS,сейчас получается если STOPORDERCOUNT1 стоп выстовляется,STOPORDERCOUNT0 стоп удаляется и выстовляется согласно напровлению,но если стоп сработает то при новом открытии позиции надо заново подстовлять 1 вручную,
FUNC KILLALLSTOP (KEY)
N=GET_NUMBER_OF («STOP_ORDERS»)
IF N>0
FOR I FROM 1 TO N
IF GET_VALUE (GET_ITEM («STOP_ORDERS», I), «STATUS»)="ACTIVE"
добавил IF N>0,но нечего недало
Евгений Reply:
мая 1, 2010 at 21:46
Ничего не понял...
Функцию KILLALLSTOP вызываем в случаях:
1. Цена стопа плюс(минус) стоплосс меньше(больше) HIGH (LOW). Это как раз при новом часе когда экстремумы обновляются.
2. Направление стопа неверно (после реверса)
3. Колво лотов в активной стоп заявке не равно текчистпозу.
4. Количество автивных стопов больше одного
5. Если нет открытой позиции.
Эти случаи реализованы в коммерческой версии «Пробойного», попробуйте описать их в своем роботе.
это я не правильно вопрос задал, надо было задать в каких случаях вызываем функцию KILLALLSTOP,теперь все понятно и ясно, описал их в своем скрипте.
Доброго времени суток.
Ребят, подскажите, как ведет себя пробойник на утренних гепах?
И в общем интересует следующий вопрос: кде-то краем уха слышал про стартегию определения закрытия утренних гепов, есть ли идеи на этот счет?
Евгений Reply:
июня 21, 2010 at 18:17
Я тоже слышал о подобных стратегиях. Но тут как бы два момента:
1. Чтоб полностью реализовать потенциал гэпа — надо входить вечером и выходить через 15-20 мин после начала сессии. Но это маловероятный и шарлотанский подход. За ночь и утро до сессии может много чего поменяться.
2. с первой секунды начала сессии бомбардировать заявками в нужную сторону со скоростью 600-1000 заявок в секунду на весь депо. Задача чтоб сервер сожрал хоть одну заявку. Он ее исполнит а тысячи остальных автоматически отклоняются, т.к. не хватает денег. А потом, через 15-20 минут выходим и собираем сливки. Главкное угадать направление и иметь такого робота. минус — на купайле такого не построишь.
В «Пробойном» по понятным причинам таких механизмов нет, но в коммерческой версии есть функция закрытия позиций принудительно в конце сессии, а также настраиваемое время утреннего первого старта, например в 11.00 после всяческих гэпов. Таким образом «Пробойный» пропускает утренний гэп как таковой.
Ну на самом деле под закрытием я понимаю именно «закрытие» гэпа в сторону, противоположную его открытию, т.е. ликвидацию разрыва.
Очень часто бывает так, что рынок идет в одном направлении, а утром на внешнем фоне открывается с гэпом в противоположном: народ утром наслушался новостей и того что им втюхивают бравые ребята по рбк и в спешке закрывает открытые ранее позиции, и + выбитые стопы выносят рынок на 2-3 необоснованных %. Далее уже более мудрый народ начинает разворачивать рынок в глобальное русло. (Если честно, самого когда-то именно вот так и ловили по утрам, пока не понял правила данной игры)
Если ловить утренний гэп, то как правило (в зависимости от силы гэпа, т.е. эмоций участников рынка) первое ощущение прозрения (когда уже все успели продать или купить) у народа наступает в 10:45 — 10:50 (сейчас мы говорим про ММВБ), далее 5 мин. наступает момент равновесия, и далее все просто ждут, а что же скажет госпожа Франция (САС40 — кто не знает, открытие в 11:00). Как правило, именно эта равновесная 5-ти минутка и становится переломной.
Описанный сценарий был очень актуален, когда ММВБ открывался наравне с РТС и не было явного индикатора куда и как идти утром. Сейчас РТС четко показывает, как примерно отыграют гэп, но фактор открытия Европы никто не отменяет. Если пробойник работает внутри дня, то думаю стоит подумать, каким образом можно еще увеличить его доходность, пусть даже на основе столь нерегулярных событий как закрытие утреннего гэпа.
Суть вопроса по пробойнику в том, что первая свеча (речь идет по часовому и 30 мин. таймфрейму, да и 15 мин. в данном случае тоже) выходит как правило очень громоздкой, т.е. интервал между хаем и лоу у нее очень существенный (порой может превышать 2-3%).
Я думал по методологии закрытия гепов + отыгрывания новостей в 16:30 по пробоям свечек, в голову приходит только одна идея: играть на разных таймфреймах — начинаем на 5-ти минутках и если цена идет с нами в ногу, плавно переходим к 1 часу (или рабочему таймфрейму, кому как удобно), иначе фиксируемся на первом отработанном событии на выход.
Да и в общем было бы интересно плавно повышать таймфрейм, т.к. многие работают в основном на часе (реже 15 или 30 мин), а потери на неверном входе в случае часового бара получаются весьма весомыми.
Соответственно вопрос: какой возможен вариант переключения таймфрейма у бота? Честно говоря, элегантного решения пока сообразить не могу, хотя идеи есть вести сразу несколько графиков и переключаться между ними. Какие еще варианты можно тут предложить?
Евгений Reply:
июня 21, 2010 at 19:21
Таймфрейм в моих роботах задается пользователем.
Мысли очень любопытные. Напишите в личку — спишемся по эл.почте. Думаю из этой идеи что-то можно выжать.