Стратегии и роботы > Робот не закрывает позицию по времени.

Обсуждение, описание стратегий и роботов, идеи для стратегий
Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение Геннадий » 07 мар 2016, 07:56

Спасибо за информацию по оформлению изображений. В учебном центре не обратил внимание на слово вебинар :)

Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение Геннадий » 08 мар 2016, 06:09

Хочу выяснить один вопрос. Например я вчера запустил робота и он вошел в сделку. В конце сессии я закрыл терминал. Сегодня с открытием сессии я запустил этого же робота. Вопрос - робот увидит открытую им вчерашнюю сделку и будет на нее реагировать или он начнет работу с ноля?

Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение Геннадий » 08 мар 2016, 07:36

Помогите выяснить причину косой работы робота. Создал робота на открытие шорта. Открытие осуществляется с помощью стохастического осциллятора. Закрытие: 1. Если цена опускается ниже цены открытия+1000 (профит). 2. Цена поднимается на 300 пунктов выше цены входа (стоп). Проблема в том, что в случае 1. Сделка закрывается, но почему то через день. В случае 2. всё работает нормально (закрытие стопа). Не пойму причину.

Код: Выделить всё

/**Стратегия основана на определении моментов  пересечения сглаженной линии D SO и сигнальной линии SO (система "SO"). Особенности:
- сигнал на продажу выдается, если сглаженная линия D индикатора SO пересекает сигнальную линию SO сверху вниз;
- сигнал на закрытие шорта выдается при профите 1000, и при стопе -300;
- при тестировании цена сделки фиксируется как цена закрытия бара, на котором появился сигнал.
- в роботе заявка выставляется после закрытия бара, на котором появился сигнал.
Developed by GG;
Algorithm = ОСЦИЛЛЯТОР;**/

function Initialize()
{
   StrategyName = "GenGal_SQ";
   AddParameter("PK", 37, "", 1);
   AddParameter("PD", 31, "", 1);
   AddParameter("Psig", 10, "", 1);
   AddInput("Input1", Inputs.Candle, 30, true, "SiH6=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
}
function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (SO(Input1, PK, PD, Psig).GetValue("D", 0) < SO(Input1, PK, PD, Psig).GetValue("Signal", 0)) )
   {
      EnterShort();
   }
/// ПРАВИЛО 2
   if ( ((Input1.Close  < (AverPrice()-1000)) && AverPrice() > 0))
   {
      CloseShort();
   }
/// ПРАВИЛО 3
   if ( ((Input1.Close  > (AverPrice()+300)) && AverPrice() > 0))
   {
      CloseShort();
   }
}
Вложения
Ashampoo_Snap_2016.03.08_14h32m05s_002_.png
Показан случай срабатывания стопа и получения профита.

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение evge » 09 мар 2016, 07:31

Геннадий писал(а):Помогите выяснить причину косой работы робота


В первом правиле добавьте условие, проверку текущей позиции и должно всё заработать.

Например так:

CurrentPosition() == 0;

Код: Выделить всё

...if ( (SO(Input1, PK, PD, Psig).GetValue("D", 0) < SO(Input1, PK, PD, Psig).GetValue("Signal", 0)) && CurrentPosition() == 0)...


Вот такие вот нюансы работы стратегий в АД4 на сегодняшний день.
Правила выполняются не по порядку и в некоторых ситуациях например правило 1 будет иметь приоритет выше правила 2,3 ... Т.е. у вас здесь выполняются условия одновременно в правиле 2 (закрыть шорт) и в правиле 1 (открыть шорт). Победило правило 1, поэтому шорт остался открытым, т.е. ничего не произошло (т.к. шорт уже был открыт ранее).

Тоже самое может произойти и со стопом, он может не выполниться по той же причине. Вам повезло, правило 1 не сработало в тот момент когда сработал стоп.

Не могу это всё проверить сейчас, поэтому попробуйте сами. Думаю поможет.
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение evge » 09 мар 2016, 07:45

Ещё я конечно может чего не понимаю, но почему вы через цену открытия определяете стоп \ профит?

Есть же функция НПУ - CurrentPL() проверяете её на >=1000 и на <=-300.

и правила сократятся до:

Код: Выделить всё

   /// ПРАВИЛО 2
   if ( (CurrentPosition() < 0) && (CurrentPL() >= 1000) )
   {
      CloseShort();
   }

   /// ПРАВИЛО 3
   if ( (CurrentPosition() < 0) && (CurrentPL() <= -300) )
   {
      CloseShort();
   }

заодно проверка на открытую позицию в шорт будет.
никогда такого не было и вот опять

Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение Геннадий » 09 мар 2016, 15:47

Вы оказались совершенно правы насчет добавки условия проверки позиции. В моем варианте всё заработало чётко.
Но вот ваше второе предложение дало неоднозначный результат. При тестировании я взял участок графика, показанный ранее. Слева на графике результаты по вашему предложению, справа - мой старый вариант, но с добавлением предложенного вами условия проверки позиции. В вашем варианте (слева) стоп сработал раньше, чем -300. В моем варианте (справа) стоп не сработал (движение было по условию меньше -300) и получен профит +1000. Таким образом левый вариант "не добирает" стоп и профит, чаще открывает позиции. Почему так, не знаю.
Мой окончательный вариант:

Код: Выделить всё

/**Стратегия основана на определении моментов  пересечения сглаженной линии D SO и сигнальной линии SO (система "SO"). Особенности:
- сигнал на продажу выдается, если сглаженная линия D индикатора SO пересекает сигнальную линию SO сверху вниз;
- сигнал на закрытие шорта выдается при профите 1000, и при стопе -300;
- при тестировании цена сделки фиксируется как цена закрытия бара, на котором появился сигнал.
- в роботе заявка выставляется после закрытия бара, на котором появился сигнал.
Developed by GenGal;
Algorithm = ОСЦИЛЛЯТОР;**/

function Initialize()
{
   StrategyName = "GenGal_SQ_test3";
   AddParameter("PK", 37, "", 1);
   AddParameter("PD", 31, "", 1);
   AddParameter("Psig", 10, "", 1);
   AddInput("Input1", Inputs.Candle, 30, true, "SiH6=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (SO(Input1, PK, PD, Psig).GetValue("D", 0) < SO(Input1, PK, PD, Psig).GetValue("Signal", 0))&& CurrentPosition() == 0 )
   {
      EnterShort();
   }
/// ПРАВИЛО 2
   if ( ((Input1.Close  < (AverPrice()-1000)) && AverPrice() > 0))
   {
      CloseShort();
   }
/// ПРАВИЛО 3
   if ( ((Input1.Close  > (AverPrice()+300)) && AverPrice() > 0))
   {
      CloseShort();
   }
 }
Вложения
Ashampoo_Snap_2016.03.09_22h34m28s_001_.png

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение evge » 09 мар 2016, 17:19

Возможно, разница в том, что CurrentPL учитывает комиссию, а Ваш вариант жесткий и высчитывает разницу между текущей ценой и ценой открытия позиции. Попробуйте в тестере поставить 0% комиссию и посмотреть результат.

Да и я забыл уточнить (одну мелочь :)) это же актуально для 1 контракта будет, если контрактов больше 1 то понятно что прибыль \ убыток будет кратным, поэтому лучше использовать CurrentPLper() %

CurrentPL() – возвращает текущий доход по открытой позиции в валюте инструмента (рубли или пункты).

CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в процентах.

Проверил!!!

Не влияет % комиссии, а вот второе предположение верное, влияет количество контрактов, т.к. разница в цене НЕ равна ПУ, только в частном случае при 1 контракте
никогда такого не было и вот опять

Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение Геннадий » 10 мар 2016, 06:58

Полностью согласен с вашими выводами. В обоих вариантах, описанных мною выше, при тестировании выставлялись 2 лота на 850 барах. Комиссия 0,01 и проскальзывание 0. Начальный капитал в обоих случаях выставлялся 30 000р.
Понятно, что стоп зависит от количества выставляемых лотов, чтобы не выйти например за 1% убытка капитала за день.
Разница в подходе.
Ваш вариант рассчитан на учет ПУ или ПУ%. Мой вариант рассчитан не на ПУ, а на количество пунктов выставляемых для стопа и для закрытия сделки. По графикам видно, что с учетом ПУ срабатывание робота будет зависеть от количества выставленных лотов. В моем варианте робот тупо берет или -300 или +1000 пунктов, т.е. более предсказуем и меньше суетится со входами.
Это я к чему, например смотрю подписку Игоря Галаган на ютубе. Он торгует фьючем на индекс РТС. Его стратегия заключается во входе от часовых уровней (вручную) на минутном графике. Стоп он ставит 150-200 пунктов от точки входа, а профит выставляет ровно 400 пунктов. Таким образом его стратегия не завязана на количество выставляемых лотов. Вот в принципе захотелось создать робота, который входил бы по условию, а закрывался бы по выставленному стопу и профиту в пунктах.
Есть еще мысль создать робота, который бы по ходу закрывал бы сделку частями. Опыта еще у меня маловато, поэтому и код такой примитивный. Например в описываемых выше случаях Правило 2 и Правило 3 можно было бы объединить через оператор "ИЛИ" :lol:

Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

Re: Робот не закрывает позицию по времени.

Непрочитанное сообщение Геннадий » 11 мар 2016, 15:03

Нашел неточность в описании стратегии "GenGal_SQ_test3". Там указано: - "Сигнал на продажу выдается, если сглаженная линия D индикатора SO пересекает сигнальную линию SO сверху вниз". По факту код написан для случая, если сглаженная линия D индикатора SO ниже сигнальной линии SO.
Чтобы выполнить пересечение, необходимо изменить Правило 1 так:

Код: Выделить всё

   /// ПРАВИЛО 1
if ( (CrossBelow(SO(Input1,PK, PD, Psig)["D"], SO(Input1, PK, PD, Psig)["Signal"]) == true)&& CurrentPosition() == 0 )
   {
      EnterShort();
   }

Кстати, в данном варианте становится доступно правило закрытия шорта по времени, например в конце вечерней сессии:

Код: Выделить всё

/// ПРАВИЛО 4
   if ( (BarTime() > AsTime(23, 28, 0))&& CurrentPosition() < 0 )
   {
          CloseShort();
   }


Вернуться в «Стратегии и роботы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей