Стратегии и роботы > Робот не закрывает позицию по времени.
Re: Робот не закрывает позицию по времени.
Спасибо за информацию по оформлению изображений. В учебном центре не обратил внимание на слово вебинар
Re: Робот не закрывает позицию по времени.
Хочу выяснить один вопрос. Например я вчера запустил робота и он вошел в сделку. В конце сессии я закрыл терминал. Сегодня с открытием сессии я запустил этого же робота. Вопрос - робот увидит открытую им вчерашнюю сделку и будет на нее реагировать или он начнет работу с ноля?
Re: Робот не закрывает позицию по времени.
Помогите выяснить причину косой работы робота. Создал робота на открытие шорта. Открытие осуществляется с помощью стохастического осциллятора. Закрытие: 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();
}
}
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Робот не закрывает позицию по времени.
Геннадий писал(а):Помогите выяснить причину косой работы робота
В первом правиле добавьте условие, проверку текущей позиции и должно всё заработать.
Например так:
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
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Робот не закрывает позицию по времени.
Ещё я конечно может чего не понимаю, но почему вы через цену открытия определяете стоп \ профит?
Есть же функция НПУ - CurrentPL() проверяете её на >=1000 и на <=-300.
и правила сократятся до:
заодно проверка на открытую позицию в шорт будет.
Есть же функция НПУ - CurrentPL() проверяете её на >=1000 и на <=-300.
и правила сократятся до:
Код: Выделить всё
/// ПРАВИЛО 2
if ( (CurrentPosition() < 0) && (CurrentPL() >= 1000) )
{
CloseShort();
}
/// ПРАВИЛО 3
if ( (CurrentPosition() < 0) && (CurrentPL() <= -300) )
{
CloseShort();
}
заодно проверка на открытую позицию в шорт будет.
никогда такого не было и вот опять
Re: Робот не закрывает позицию по времени.
Вы оказались совершенно правы насчет добавки условия проверки позиции. В моем варианте всё заработало чётко.
Но вот ваше второе предложение дало неоднозначный результат. При тестировании я взял участок графика, показанный ранее. Слева на графике результаты по вашему предложению, справа - мой старый вариант, но с добавлением предложенного вами условия проверки позиции. В вашем варианте (слева) стоп сработал раньше, чем -300. В моем варианте (справа) стоп не сработал (движение было по условию меньше -300) и получен профит +1000. Таким образом левый вариант "не добирает" стоп и профит, чаще открывает позиции. Почему так, не знаю.
Мой окончательный вариант:
Но вот ваше второе предложение дало неоднозначный результат. При тестировании я взял участок графика, показанный ранее. Слева на графике результаты по вашему предложению, справа - мой старый вариант, но с добавлением предложенного вами условия проверки позиции. В вашем варианте (слева) стоп сработал раньше, чем -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();
}
}
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Робот не закрывает позицию по времени.
Возможно, разница в том, что CurrentPL учитывает комиссию, а Ваш вариант жесткий и высчитывает разницу между текущей ценой и ценой открытия позиции. Попробуйте в тестере поставить 0% комиссию и посмотреть результат.
Да и я забыл уточнить (одну мелочь ) это же актуально для 1 контракта будет, если контрактов больше 1 то понятно что прибыль \ убыток будет кратным, поэтому лучше использовать CurrentPLper() %
CurrentPL() – возвращает текущий доход по открытой позиции в валюте инструмента (рубли или пункты).
CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в процентах.
Проверил!!!
Не влияет % комиссии, а вот второе предположение верное, влияет количество контрактов, т.к. разница в цене НЕ равна ПУ, только в частном случае при 1 контракте
Да и я забыл уточнить (одну мелочь ) это же актуально для 1 контракта будет, если контрактов больше 1 то понятно что прибыль \ убыток будет кратным, поэтому лучше использовать CurrentPLper() %
CurrentPL() – возвращает текущий доход по открытой позиции в валюте инструмента (рубли или пункты).
CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в процентах.
Проверил!!!
Не влияет % комиссии, а вот второе предположение верное, влияет количество контрактов, т.к. разница в цене НЕ равна ПУ, только в частном случае при 1 контракте
никогда такого не было и вот опять
Re: Робот не закрывает позицию по времени.
Полностью согласен с вашими выводами. В обоих вариантах, описанных мною выше, при тестировании выставлялись 2 лота на 850 барах. Комиссия 0,01 и проскальзывание 0. Начальный капитал в обоих случаях выставлялся 30 000р.
Понятно, что стоп зависит от количества выставляемых лотов, чтобы не выйти например за 1% убытка капитала за день.
Разница в подходе.
Ваш вариант рассчитан на учет ПУ или ПУ%. Мой вариант рассчитан не на ПУ, а на количество пунктов выставляемых для стопа и для закрытия сделки. По графикам видно, что с учетом ПУ срабатывание робота будет зависеть от количества выставленных лотов. В моем варианте робот тупо берет или -300 или +1000 пунктов, т.е. более предсказуем и меньше суетится со входами.
Это я к чему, например смотрю подписку Игоря Галаган на ютубе. Он торгует фьючем на индекс РТС. Его стратегия заключается во входе от часовых уровней (вручную) на минутном графике. Стоп он ставит 150-200 пунктов от точки входа, а профит выставляет ровно 400 пунктов. Таким образом его стратегия не завязана на количество выставляемых лотов. Вот в принципе захотелось создать робота, который входил бы по условию, а закрывался бы по выставленному стопу и профиту в пунктах.
Есть еще мысль создать робота, который бы по ходу закрывал бы сделку частями. Опыта еще у меня маловато, поэтому и код такой примитивный. Например в описываемых выше случаях Правило 2 и Правило 3 можно было бы объединить через оператор "ИЛИ"
Понятно, что стоп зависит от количества выставляемых лотов, чтобы не выйти например за 1% убытка капитала за день.
Разница в подходе.
Ваш вариант рассчитан на учет ПУ или ПУ%. Мой вариант рассчитан не на ПУ, а на количество пунктов выставляемых для стопа и для закрытия сделки. По графикам видно, что с учетом ПУ срабатывание робота будет зависеть от количества выставленных лотов. В моем варианте робот тупо берет или -300 или +1000 пунктов, т.е. более предсказуем и меньше суетится со входами.
Это я к чему, например смотрю подписку Игоря Галаган на ютубе. Он торгует фьючем на индекс РТС. Его стратегия заключается во входе от часовых уровней (вручную) на минутном графике. Стоп он ставит 150-200 пунктов от точки входа, а профит выставляет ровно 400 пунктов. Таким образом его стратегия не завязана на количество выставляемых лотов. Вот в принципе захотелось создать робота, который входил бы по условию, а закрывался бы по выставленному стопу и профиту в пунктах.
Есть еще мысль создать робота, который бы по ходу закрывал бы сделку частями. Опыта еще у меня маловато, поэтому и код такой примитивный. Например в описываемых выше случаях Правило 2 и Правило 3 можно было бы объединить через оператор "ИЛИ"
Re: Робот не закрывает позицию по времени.
Нашел неточность в описании стратегии "GenGal_SQ_test3". Там указано: - "Сигнал на продажу выдается, если сглаженная линия D индикатора SO пересекает сигнальную линию SO сверху вниз". По факту код написан для случая, если сглаженная линия D индикатора SO ниже сигнальной линии SO.
Чтобы выполнить пересечение, необходимо изменить Правило 1 так:
Кстати, в данном варианте становится доступно правило закрытия шорта по времени, например в конце вечерней сессии:
Чтобы выполнить пересечение, необходимо изменить Правило 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 гостей