Автор |
Сообщение |
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
Скорость, мне кажется, не столь важна, поскольку HFT робота на ами писать всё равно смысла нет, а для всех остальных задач задержка в секунду-две особой роли не сыграет, я думаю
Так что буду разбираться с циклами... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Форвардный тест будет делаться медленно |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Функция ApplyStop() работает только в тестере. Если её просто добавить в код индикатора который рисует стрелки, то ничего не изменится. Для того чтобы активизировать стопы в индикаторе надо использовать функцию Equity(). |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
Да, спасибо, с ApplyStop уже понял
Итак, покопав форум, и использовав выложенный код, реализовал трейлинг стоп:
Код: |
Sell = SellSignal;
Buy = BuySignal;
Short = ShortSignal;
Cover = CoverSignal;
position = 0;
Stop=200;
Take=500;
for(i = 1; i < BarCount; i++)
{
if(position == 0)
{
if(BuySignal[i]) // условия лонга
{
Buy[i] = 1; // покупка
position = 1; // длинная позиция
PriceBuy = BuyPrice[i]; // цена покупки
PriceStop = PriceBuy - Stop; // первоначальный стоп лонга
}
else if(ShortSignal[i]) // условия шорта
{
Short[i] = 1; // продажа
position = -1; // короткая позиция
PriceShort = ShortPrice[i]; // цена шорта
PriceStop = PriceShort + Stop; // первоначальный стоп шорта
}
}
else if(position == 1) // в противном случае, если лонг
{
if(SellSignal[i]) // условия закрытия лонга
{
Sell[i] = 1; // закрытие лонга
position = 0; // система не в позиции
}
if(Close[i-1] > PriceBuy + Take) // перенос стопа в безубыток
{
PriceStop = PriceBuy + Take - 100;
}
if(Close[i-1] < PriceStop) // проверка срабатывания стопа
{
Sell[i] = 1; // закрытие лонга
position = 0;
}
}
else if(position == -1) // в противном случае если шорт
{
if(CoverSignal[i]) // условия закрытия шорта
{
Cover[i] = 1; // закрытие шорта
position = 0; // система не в позиции
}
if(Close[i-1] < PriceShort - Take) // перенос стопа в безубыток
{
PriceStop = PriceShort - Take + 100;
}
if(Close[i-1] > PriceStop) // срабатывание стопа при шорте
{
Cover[i] =1; //закрытие шорта
position = 0;
}
}
}
|
Но он срабатывает только после закрытия свечи, а мне бы хотелось чтобы он срабатывал сразу же, как только достигнута нужная цена, поскольку движения иногда бывают очень резкие и если ждать закрытия свечи, можно неплохо пролететь за 5 минут (использую 5 минутный таймфрейм).
Так вот каким образом это можно реализовать? Загрузить тиковую историю, но как из неё читать текущую цену?
P.S. Стрелки теперь рисует как надо |
|
|
Посмотреть профиль Отправить личное сообщение |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Мне видится очень нереалистичным тесты систем, которые входят/выходят внутри бара из-за того, что мы не знаем как там вела себя цена. Поэтому схема братия сигнала с уже сформировавшегося (закрытого) бара выглядит логичной. Типа по клоузу сигнал, по опену вход/выход. Можно конечно возразить что нарезать бары можем как угодно. Поэтому есть маза после тестов системы сдвигать свечки на пол-бара вперед-назад и проводить еще один тест, после чего справнивать результаты. Если сильно отличаются - есть повод задуматься.
С тиками никогда не работал, так как пока не занимаюсь созданием высокоскоростных систем. А для не скоростных систем не вижу проблем. Ну ушла цена далеко от стопа - ну и что. Бывает Форвардный тест всему голова. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MSH писал(а): |
Да, спасибо, с ApplyStop уже понял
Итак, покопав форум, и использовав выложенный код, реализовал трейлинг стоп:
Код: |
Sell = SellSignal;
Buy = BuySignal;
Short = ShortSignal;
Cover = CoverSignal;
position = 0;
Stop=200;
Take=500;
for(i = 1; i < BarCount; i++)
{
if(position == 0)
{
if(BuySignal[i]) // условия лонга
{
Buy[i] = 1; // покупка
position = 1; // длинная позиция
PriceBuy = BuyPrice[i]; // цена покупки
PriceStop = PriceBuy - Stop; // первоначальный стоп лонга
}
else if(ShortSignal[i]) // условия шорта
{
Short[i] = 1; // продажа
position = -1; // короткая позиция
PriceShort = ShortPrice[i]; // цена шорта
PriceStop = PriceShort + Stop; // первоначальный стоп шорта
}
}
else if(position == 1) // в противном случае, если лонг
{
if(SellSignal[i]) // условия закрытия лонга
{
Sell[i] = 1; // закрытие лонга
position = 0; // система не в позиции
}
if(Close[i-1] > PriceBuy + Take) // перенос стопа в безубыток
{
PriceStop = PriceBuy + Take - 100;
}
if(Close[i-1] < PriceStop) // проверка срабатывания стопа
{
Sell[i] = 1; // закрытие лонга
position = 0;
}
}
else if(position == -1) // в противном случае если шорт
{
if(CoverSignal[i]) // условия закрытия шорта
{
Cover[i] = 1; // закрытие шорта
position = 0; // система не в позиции
}
if(Close[i-1] < PriceShort - Take) // перенос стопа в безубыток
{
PriceStop = PriceShort - Take + 100;
}
if(Close[i-1] > PriceStop) // срабатывание стопа при шорте
{
Cover[i] =1; //закрытие шорта
position = 0;
}
}
}
|
Но он срабатывает только после закрытия свечи, а мне бы хотелось чтобы он срабатывал сразу же, как только достигнута нужная цена, поскольку движения иногда бывают очень резкие и если ждать закрытия свечи, можно неплохо пролететь за 5 минут (использую 5 минутный таймфрейм).
Так вот каким образом это можно реализовать? Загрузить тиковую историю, но как из неё читать текущую цену?
P.S. Стрелки теперь рисует как надо |
Если надо по цене стопа, то меняй
Код: |
if(Close[i-1] < PriceStop) |
на
Код: |
if(Low[i-1] < PriceStop) |
И еще надо будет дописать там цену исполнения
Код: |
Sell[i] = 1; // закрытие лонга
SellPrice[i] = PriceStop; |
Для шорта аналогично |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
spitfire, форвардный тест - полностью согласен, он покажет влияние "запаздывающего" стопа и возможные потери в связи с этим.
Но малоли что ещё в будущем может произойти на рынке
Да и потом хотелось бы максимально снизить потери, если это возможно, конечно
Олег, спасибо, отлично
Только вопрос - сработает ли этот код в роботе? Ведь если мы смотрим прошлый бар, и активируем стоп именно по цене стопа, то он может просто не исполниться - на текущем баре цена могла уйти далеко
Может, всё-таки, нужно как-то использовать тики для более точной работы?
И тогда снова встаёт вопрос с настройкой таймфреймов
Или, может, протестировать стратегию с предложенной тобой поправкой, а робота уже реализовать непосредственно в квике, который сможет отслеживать каждый тик без задержек (или не сможет?) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Nero Wolfe
Зарегистрирован: 17.03.2010
Сообщения: 174
|
Чтобы нарисовать стрелки именно при срабатывании стопов надо:
Цитата: |
For visual conformation of ApplyStop function, add the following lines below your ApplyStop formula in Indicator Builder:
Equity(1); // THIS EVALUATES STOPS
Plot(Sell==4,"ApplyStop Sell",colorRed,1|styleOwnScale);
Plot(Cover==4,"ApplyStop Cover",colorGreen,1|styleOwnScale); |
|
_________________ Если вас грызет совесть, выбейте ей зубы, и пусть она вас нежно обсасывает. |
|
Посмотреть профиль Отправить личное сообщение |
|
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
В коде, кстати, забыл добавить строчку:
Код: |
PriceBuy = PriceBuy + Take;
|
Чтобы трейлинг работал именно как трейлинг и смещался за ценой несколько раз |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MSH писал(а): |
Только вопрос - сработает ли этот код в роботе? Ведь если мы смотрим прошлый бар, и активируем стоп именно по цене стопа, то он может просто не исполниться - на текущем баре цена могла уйти далеко
Может, всё-таки, нужно как-то использовать тики для более точной работы?
И тогда снова встаёт вопрос с настройкой таймфреймов
Или, может, протестировать стратегию с предложенной тобой поправкой, а робота уже реализовать непосредственно в квике, который сможет отслеживать каждый тик без задержек (или не сможет?) |
В роботе SellPrice не надо. В роботе просто Sell[i] = L[i] < StopPrice
В принципе можно даже вместо Low[i] поставить Close[i] и надо убрать для стопа сдвиг сигнала. Тогда как только на текущем баре цена станет ниже уровня стопа робот сразу ( с паузой 1сек) отправит заявку на закрытие. Причем заявка будет "по рынку", а цена по которой она исполнится будет зависеть от рыночной ситуации. Ликвидность, спред... Скорее всего исполниться хуже цены стопа. Это называется скользяк. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
Олег, большое спасибо, теперь возникла ясность в голове. А-то я всё думал как робот заявку подавать будет - по рынку или по конкретной цене и как сделать так, чтобы эта цена не уехала и заявка не повисла
Чтобы учесть скользяк в тестере, можно просто "ухудшить" цены входа\выхода на определённое кол-во пунктов, например на 50 (фьюч РТС), верно? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Проще в комишн прописать... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
Спасибо, Олег, действительно прописать в комишн это самый простой и оптимальный вариант
Прописываю 50 пунктов по фьючерсу РТС (28 рублей + комиссия биржи и брокера).
Кто сколько закладывает? 50 пунктов - это нормально?
А-то у меня без скользяка профит 5000%, а со скользяком 50%. Уж больно жирная разница получается... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
spitfire
Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow
|
Чет 50 пунктов на 1 сторону сделки это слишком дофига.. Я прописываю 5п комес + 25п проскальзывание |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
MSH
Зарегистрирован: 13.07.2011
Сообщения: 16
|
Наверное зависит от размера позиции...
Но ведь задержка будет как минимум 1 сек. За 1 сек. цена легко уходит на 50 пунктов, мне кажется...
Или ошибаюсь? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|