Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Таймфреймы, трейлинг, скользяк Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
MSH



Зарегистрирован: 13.07.2011
Сообщения: 16

СообщениеДобавлено: Ср Июл 27, 2011 3:27 pm Ответить с цитатой Вернуться к началу

Скорость, мне кажется, не столь важна, поскольку HFT робота на ами писать всё равно смысла нет, а для всех остальных задач задержка в секунду-две особой роли не сыграет, я думаю Smile
Так что буду разбираться с циклами... Very Happy
Посмотреть профиль Отправить личное сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Ср Июл 27, 2011 3:44 pm Ответить с цитатой Вернуться к началу

Форвардный тест будет делаться медленно
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Июл 27, 2011 5:48 pm Ответить с цитатой Вернуться к началу

Функция ApplyStop() работает только в тестере. Если её просто добавить в код индикатора который рисует стрелки, то ничего не изменится. Для того чтобы активизировать стопы в индикаторе надо использовать функцию Equity().

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MSH



Зарегистрирован: 13.07.2011
Сообщения: 16

СообщениеДобавлено: Ср Июл 27, 2011 6:24 pm Ответить с цитатой Вернуться к началу

Да, спасибо, с ApplyStop уже понял Smile
Итак, покопав форум, и использовав выложенный код, реализовал трейлинг стоп:

Код:

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. Стрелки теперь рисует как надо Wink
Посмотреть профиль Отправить личное сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Ср Июл 27, 2011 8:41 pm Ответить с цитатой Вернуться к началу

Мне видится очень нереалистичным тесты систем, которые входят/выходят внутри бара из-за того, что мы не знаем как там вела себя цена. Поэтому схема братия сигнала с уже сформировавшегося (закрытого) бара выглядит логичной. Типа по клоузу сигнал, по опену вход/выход. Можно конечно возразить что нарезать бары можем как угодно. Поэтому есть маза после тестов системы сдвигать свечки на пол-бара вперед-назад и проводить еще один тест, после чего справнивать результаты. Если сильно отличаются - есть повод задуматься.
С тиками никогда не работал, так как пока не занимаюсь созданием высокоскоростных систем. А для не скоростных систем не вижу проблем. Ну ушла цена далеко от стопа - ну и что. Бывает Smile Форвардный тест всему голова.
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Июл 27, 2011 11:53 pm Ответить с цитатой Вернуться к началу

MSH писал(а):
Да, спасибо, с ApplyStop уже понял Smile
Итак, покопав форум, и использовав выложенный код, реализовал трейлинг стоп:

Код:

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. Стрелки теперь рисует как надо Wink

Если надо по цене стопа, то меняй
Код:
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

СообщениеДобавлено: Чт Июл 28, 2011 10:21 am Ответить с цитатой Вернуться к началу

spitfire, форвардный тест - полностью согласен, он покажет влияние "запаздывающего" стопа и возможные потери в связи с этим.
Но малоли что ещё в будущем может произойти на рынке Smile
Да и потом хотелось бы максимально снизить потери, если это возможно, конечно Very Happy

Олег, спасибо, отлично Smile
Только вопрос - сработает ли этот код в роботе? Ведь если мы смотрим прошлый бар, и активируем стоп именно по цене стопа, то он может просто не исполниться - на текущем баре цена могла уйти далеко Sad
Может, всё-таки, нужно как-то использовать тики для более точной работы?
И тогда снова встаёт вопрос с настройкой таймфреймов Confused
Или, может, протестировать стратегию с предложенной тобой поправкой, а робота уже реализовать непосредственно в квике, который сможет отслеживать каждый тик без задержек (или не сможет?)
Посмотреть профиль Отправить личное сообщение
Nero Wolfe



Зарегистрирован: 17.03.2010
Сообщения: 174

СообщениеДобавлено: Чт Июл 28, 2011 11:09 am Ответить с цитатой Вернуться к началу

Чтобы нарисовать стрелки именно при срабатывании стопов надо:
Цитата:
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

СообщениеДобавлено: Чт Июл 28, 2011 12:28 pm Ответить с цитатой Вернуться к началу

В коде, кстати, забыл добавить строчку:
Код:

PriceBuy = PriceBuy + Take;


Чтобы трейлинг работал именно как трейлинг и смещался за ценой несколько раз Smile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Июл 28, 2011 1:40 pm Ответить с цитатой Вернуться к началу

MSH писал(а):

Только вопрос - сработает ли этот код в роботе? Ведь если мы смотрим прошлый бар, и активируем стоп именно по цене стопа, то он может просто не исполниться - на текущем баре цена могла уйти далеко Sad
Может, всё-таки, нужно как-то использовать тики для более точной работы?
И тогда снова встаёт вопрос с настройкой таймфреймов Confused
Или, может, протестировать стратегию с предложенной тобой поправкой, а робота уже реализовать непосредственно в квике, который сможет отслеживать каждый тик без задержек (или не сможет?)

В роботе SellPrice не надо. В роботе просто Sell[i] = L[i] < StopPrice
В принципе можно даже вместо Low[i] поставить Close[i] и надо убрать для стопа сдвиг сигнала. Тогда как только на текущем баре цена станет ниже уровня стопа робот сразу ( с паузой 1сек) отправит заявку на закрытие. Причем заявка будет "по рынку", а цена по которой она исполнится будет зависеть от рыночной ситуации. Ликвидность, спред... Скорее всего исполниться хуже цены стопа. Это называется скользяк. Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MSH



Зарегистрирован: 13.07.2011
Сообщения: 16

СообщениеДобавлено: Чт Июл 28, 2011 5:09 pm Ответить с цитатой Вернуться к началу

Олег, большое спасибо, теперь возникла ясность в голове. А-то я всё думал как робот заявку подавать будет - по рынку или по конкретной цене и как сделать так, чтобы эта цена не уехала и заявка не повисла Smile
Чтобы учесть скользяк в тестере, можно просто "ухудшить" цены входа\выхода на определённое кол-во пунктов, например на 50 (фьюч РТС), верно? Smile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Июл 28, 2011 5:42 pm Ответить с цитатой Вернуться к началу

Проще в комишн прописать... Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MSH



Зарегистрирован: 13.07.2011
Сообщения: 16

СообщениеДобавлено: Вт Авг 02, 2011 5:36 pm Ответить с цитатой Вернуться к началу

Спасибо, Олег, действительно прописать в комишн это самый простой и оптимальный вариант Very Happy
Прописываю 50 пунктов по фьючерсу РТС (28 рублей + комиссия биржи и брокера).
Кто сколько закладывает? 50 пунктов - это нормально?
А-то у меня без скользяка профит 5000%, а со скользяком 50%. Уж больно жирная разница получается... Confused
Посмотреть профиль Отправить личное сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Вт Авг 02, 2011 5:39 pm Ответить с цитатой Вернуться к началу

Чет 50 пунктов на 1 сторону сделки это слишком дофига.. Я прописываю 5п комес + 25п проскальзывание
Посмотреть профиль Отправить личное сообщение ICQ Number
MSH



Зарегистрирован: 13.07.2011
Сообщения: 16

СообщениеДобавлено: Вт Авг 02, 2011 5:44 pm Ответить с цитатой Вернуться к началу

Наверное зависит от размера позиции...
Но ведь задержка будет как минимум 1 сек. За 1 сек. цена легко уходит на 50 пунктов, мне кажется...
Или ошибаюсь?
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen