CoFiTe home
Добро пожаловать, Гость. Пожалуйста Зарегистрируйтесь или Авторизуйтесь Поиск | Активные темы |

Описание шаблона SpreaderAdvanced. Опции
SergeyKS
#1 Оставлено : 26 июля 2012 г. 14:20:16
Ранг: Advanced Member

Группы: Administrators, BrokerRepresentative, TestLoginGenerator, Developers, Finance, Publications, VIP, Registered

Зарегистрирован: 11.05.2012
Сообщений: 48
Торговый алгоритм.

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


Данный алгоритм представляет скорее не торговую стратегию, а ее часть. И для более успешной работы шаблон можно дополнить, добавив фильтры волатийности и тренда. Либо в зависимости от тренда задавать направление позиции (лонг или шорт).


Реализация алгоритма в RobotLab.

Рассмотрим реализацию описанного выше алгоритма, с помощь визуального редактора роботов RobotLab. Готовая схема включает в себя следующие логические блоки:



Инициализация.

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

Описание переменных:
Account - в данной переменной будет храниться значение счета, с которого будет производиться торговля.
Instrument - в данной переменной будет храниться значение инструмента, по которому будут открываться и закрываться позиции.
MinSpread - в данной переменной будет храниться значение минимального расстояния спреда.
TakeProfit - в данной переменной будет храниться значение тейк-профита
Lots - в данной переменной будет храниться значение кол-ва лотов, которым будет производиться торговля.
StopLimit - в данной переменной будет храниться конечное значение стоп-лоса.
StartStopLevel - в данной переменной будет храниться начальное значение уровня стоп-лоса.
StopPeriod - в данной переменной будет храниться значение промежутка времени, за которое будет изменяться стоп-лосс с начального до конечного.
PriceStep - в данной переменной будет храниться значение шага цены (пипс).



Запуск спредера.
В данном блоке мы выставляем заявки открывающие позицию.
Для выставления их на нужные ценовые уровни получается стакан (OrderBook) и берутся цены лучше покупки и продажи. Далее проверяется размер спреда, если он больше чем величина: «Максимальное_схождение» + 2 шага цены, то для цены выставления заявок берутся цены бида и аска ± шаг цены инструмента (т.е. наши заявки будут гарантировано лучшими и первыми исполнятся в случае появления на бирже рыночной заявки). Если же это не так, то за цены заявок берется середина спреда ± половина «Максимального_схождения». Далее по вычисленным ценам (sellPrice и buyPrice) выставляется пара заявок OrderBuy и OrderSell. После выставления заявок мы записываем в переменную OpenTime текущее время, которое потребуется для вычисления величины стопа.



Удержание заявок лучшими.
В данном блоке проверяется являются ли наши заявки лучшими. А также происходит их перевыставление в случае необходимости.

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

Рассмотрим логику ее работы на примере покупки:
Если цена лучшей заявки совпадает с ценой заявки OrderBuy, то вычитаем оставшееся число лотов OrderBuy из объема заявок по лучшей цене, в случае нулевого результата наша заявка будет являться лучшей (и лучшая цена без учета нашей заявки – вторая строчка стакана (OrderBook.Buy(1).Price)), в случае ненулевого – нет (лучшая цена – цена нашей заявки или первая строчка стакана (OrderBook.Buy(0).Price)).

Эта проверка осуществляется с помощью следующего логического выражения в условии:
((OrderBook.Buy(0).Volume - OrderBuy.RemainingLots) = 0) and ((OrderBook.Buy(0).Price = OrderBuy.Price))

После определения лучших цен покупки и продажи (BestBuy и BestSell) необходимо вычислить величину ближе, которой заявки не могут подойти друг к другу. Эта необходимость обусловлена наличием двух параметров отвечающих за сближение заявок: минимального схождения (для случая пары активных заявок) и тейк-профита (для случая открытой позиции). Значение вычисленной величины хранится в переменной MinProfit.

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

Далее с помощью 2х условий мы определяем, какие заявки исполнены, а какие нет и, проверяем необходимость перемещения для каждой из заявок.

Рассмотрим логику перемещения заявок на примере перемещения заявки OrderBuy.
1) Условием: (OrderBuy.Price = (OrderSell.Price - MinProfit)) and (OrderBuy.Price <= BestBuy) мы отсеиваем ситуации, при которых наша заявка не лучшая, но в то же время выставлена на расстоянии MinProfit от заявки на продажу (т.е. если мы переместим заявку еще ближе, то получим убыток, либо слишком маленькую прибыль).

2) Вычисляем новую цену заявки BuyPrice как минимальную из (BestBuy + PriceStep) (лучшая цена покупки) и (OrderSell.Price - MinProfit) (цена дороже которой мы покупать не хотим). Кроме схемы которая представлена в шаблоне получить минимальное значение из двух можно методом Math.Min((BestBuy + PriceStep),(OrderSell.Price - MinProfit)).

3)
После вычисления цены BuyPrice мы сравниваем ее с текущей ценой заявки OrderBuy.Price, если они совпадают, то ничего не делаем, если отличаются, то перевыстваляем заявку OrderBuy.

4) Для первыставления заявки необходимо: подать запрос на снятие заявки, дождаться получением заявки статуса исполнена (OrderBuy.IsFilled = true) или снята (OrderBuy.Status = 3), в случае исполнения в процессе снятия ничего не делать, в случае снятия – выставить новую заявку OrderBuy по цене BuyPrice на оставшееся число лотов в старой заявке (OrderVolume = OrderBuy.RemainingLots).



Проверка исполнения заявок.
После перемещения заявки (перед проверкой на стоп) надо проверить исполнены ли обе заявки или нет, если исполнены, то перейти к блоку Запуск Спредера, если нет продолжить работу.



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




Закрытие по Стопу.

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

aleks2012
#2 Оставлено : 22 октября 2012 г. 20:26:22
Ранг: Newbie

Группы: Registered

Зарегистрирован: 24.09.2012
Сообщений: 4
Добрый вечер!
Спасибо за хорошее описание.
Не могли бы подсказать, как в зависимости от тренда задавать направление позиции (лонг или шорт)?
Хотя бы в общих чертах.
SergeyKS
#3 Оставлено : 22 октября 2012 г. 22:47:27
Ранг: Advanced Member

Группы: Administrators, BrokerRepresentative, TestLoginGenerator, Developers, Finance, Publications, VIP, Registered

Зарегистрирован: 11.05.2012
Сообщений: 48
aleks2012 написал:
Добрый вечер!
Спасибо за хорошее описание.
Не могли бы подсказать, как в зависимости от тренда задавать направление позиции (лонг или шорт)?
Хотя бы в общих чертах.


Вопрос скорее в том, как определять тренд, нежели как задавать направление позиции :)
В данном случае, как раз все зависит от метода определения.

Т.е. у Вас в роботе должен быть некоторый кубик индикатор, который определяет направление, и параллельно с ним кубик-робот, который в зависимости от значений кубика открывает позицию. Соответственно в кубике индикатора, должна быть некоторая переменная, которая дает на выходе 1,-1, или 0. А в кубике робота должна быть проверка на то, чтобы пока эта переменная равно 0 - ничего не делаем, если же 1 - открываем лонг, если -1 - открываем шорт.
aleks2012
#4 Оставлено : 23 октября 2012 г. 17:50:47
Ранг: Newbie

Группы: Registered

Зарегистрирован: 24.09.2012
Сообщений: 4
Цитата:
Вопрос скорее в том, как определять тренд

Именно это я и имел в виду)
Так как все данные мы берем из стакана, а не из графика, никакие стандартные индикаторы теханализа работать не будут и после ряда удачных сделок мы неминуемо словим стоп на движухе, который перекроет всю прибыль(
а укорачивание стопов приведет к их более частому срабатыванию.
Есть какой-нибудь способ "отделить зерна от плевел", т.е. боковик от тренда?
SergeyKS
#5 Оставлено : 24 октября 2012 г. 9:19:49
Ранг: Advanced Member

Группы: Administrators, BrokerRepresentative, TestLoginGenerator, Developers, Finance, Publications, VIP, Registered

Зарегистрирован: 11.05.2012
Сообщений: 48
aleks2012 написал:
Цитата:
Вопрос скорее в том, как определять тренд

Именно это я и имел в виду)
Так как все данные мы берем из стакана, а не из графика, никакие стандартные индикаторы теханализа работать не будут и после ряда удачных сделок мы неминуемо словим стоп на движухе, который перекроет всю прибыль(
а укорачивание стопов приведет к их более частому срабатыванию.
Есть какой-нибудь способ "отделить зерна от плевел", т.е. боковик от тренда?


Так, подождите, а почему мы берем данные из стакана?

Есть кубик "Свечи", находящийся в самом низу в панели индикаторов RobotLab. Он получает в себя бары за указанный промежуток времени. Вы можете обращаться к нему как к .Open , .Low, .High, .Close, и соответственно получать требующиеся данные в массив баров.
Т.е. Создаете массив баров (bars[]) и используете кубик "Свечи", и в выходных параметрах ему указываете "Все значения" - bars[]. Соответственно в массиве у нас окажутся свечки за промежуток, который укажите.

Так же в RobotLab все индикаторы строятся от всех сделок, т.е. от того же графика, а не от стакана. Поэтому если Вы будете использовать индикаторы тех. анализа, все будет работать :)

Другое дело определить тренд с помощью индикатора, ведь все они запаздывают, и именно это запоздание и мешает получать профит :)
kukareka@hotmail.com
#6 Оставлено : 27 февраля 2013 г. 10:21:56
Ранг: Newbie

Группы: Registered

Зарегистрирован: 27.02.2013
Сообщений: 4
Поправьте, пожалуйста, картинки в описании робота.

PS
Странно, что в качестве моего имени на форуме сгенерировался мой почтовый адрес.
А я не хочу так явно его светить. И имя нельзя поменять.
worldmen
#7 Оставлено : 13 марта 2013 г. 17:07:59
Ранг: Newbie

Группы: Registered

Зарегистрирован: 19.10.2012
Сообщений: 1
Здравствуйте, подскажите пожалуйста как можно написать значения, например: предыдущего минимума, или текущего максимума,или допустим 10 предыдущих свечей?
SergeyKS
#8 Оставлено : 14 марта 2013 г. 10:13:26
Ранг: Advanced Member

Группы: Administrators, BrokerRepresentative, TestLoginGenerator, Developers, Finance, Publications, VIP, Registered

Зарегистрирован: 11.05.2012
Сообщений: 48
worldmen написал:
Здравствуйте, подскажите пожалуйста как можно написать значения, например: предыдущего минимума, или текущего максимума,или допустим 10 предыдущих свечей?


Для обращение к предыдущему значению элемента массива Bars[], будет выглядеть так "Bars(1).Price", где
Bars() -массив,
(1) - элемент массива,
.Price-обращение к цене.
andreuforever@gmail.com
#9 Оставлено : 16 января 2015 г. 18:36:35
Ранг: Newbie

Группы: Registered

Зарегистрирован: 04.01.2015
Сообщений: 2
Здравствуйте уважаемые разработчики. RobotLab очень интересен. Опыта программирования у меня никакого, пока разбираюсь. Подскажите пожалуйста, каким образом присвоить переменной диапазон значений цены от open до close? Это вообще возможно? Что-то в мануале ничего не нашел. И каким образом, можно убрать из логина наименование почты?
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.

YAFPro Theme Created by Jaben Cargman (Tiny Gecko)
Форум YAF 1.9.301 | YAF © 2003-2009, Yet Another Forum.NET
Страница сгенерирована за 0,214 секунды.