Стратегии и роботы > Как работает CloseLongLimit?

Обсуждение, описание стратегий и роботов, идеи для стратегий
Sergeoq
Сообщения: 5
Зарегистрирован: 25 авг 2019, 13:30
Благодарил (а): 2 раза

Как работает CloseLongLimit?

Непрочитанное сообщение Sergeoq » 08 май 2020, 08:59

Если включить робота с этим кодом и уже открытой позицией, то он сразу выставляет заявку. Если его выключить и включить снова, то он заявку выставляет через час. Почему так получается?

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

function Initialize () {
   StrategyName = "MyTest13";
   AddInput ("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   UseClosedBar = false;
   LiveBarTimeout = 10;
}

function OnUpdate () {
   if (GetPosition ().Position > 0) {
      CloseLongLimit (GetPosition ().Price + 2.0 / 100 * GetPosition ().Price);
      ShowMessage ("Продажа по цене: " + GetPosition ().Price + 2.0 / 100 * GetPosition ().Price);
   }
}

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

Re: Как работает CloseLongLimit?

Непрочитанное сообщение evge » 08 май 2020, 13:30

Не могу сказать что это правильное поведение.
Но первый раз запускается робот и OnUpdate() получает управление.
Если робота остановить кнопкой в диспетчере или через меню контекстное, то он снимает выставленные заявки, но при втором запуске не возращает их на место и OnUpdate() не получает управление, как это было при первом запуске.

Тоже этот момент проверил и подтверждаю. Проверял ещё проще, поставил в коде только одну команду выставления заявки EnterLongLimit(Input1.Cloe[0] - GetPriceStep() * 50). Запустил робота, заявка выставилась. Остановил робота, заявка снялась. Запустил снова - тишина. Т.е. OnUpdate() не получил управление.

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

Но тоже могут быть свои грабли, если при повторном запуске вызывать OnUpdate(). Например, если ваш робот собирает данные каждого бара и предполагается что OnUpdate() это всегда только новый бар, т.к. каждая пауза\запуск на одном баре будут искажать данные в роботе.
никогда такого не было и вот опять

Sergeoq
Сообщения: 5
Зарегистрирован: 25 авг 2019, 13:30
Благодарил (а): 2 раза

Re: Как работает CloseLongLimit?

Непрочитанное сообщение Sergeoq » 08 май 2020, 14:49

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

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

Re: Как работает CloseLongLimit?

Непрочитанное сообщение evge » 08 май 2020, 18:27

Не обратил внимание на
UseClosedBar = false;
LiveBarTimeout = 10;

Результат тот же. Мой вариант тоже не работает. Управление OnUpdate() не получает после остановки робота (+ авто снятия заявки) и повторного его старта.

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

function Initialize()
{
   StrategyName = "MyMTS2";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   UseClosedBar = false;
   LiveBarTimeout = 10;
}

function OnUpdate()
{
EnterLongLimit(Input1.Close[0] - GetPriceStep() * 100);
}


Это противоречит заявленному в документации:

UseClosedBar – настройка, позволяющая вызывать код метода OnUpdate() внутри бара (по приходу новых сделок). Если в коде указано UseClosedBar = false, то вызов метода будет происходить внутри бара не чаще чем один раз в LiveBarTimeout секунд.
Тестирование стратегии с UseClosedBar = false невозможно. Предварительно оценить ее эффективность можно в режиме робота-советника.
Пример.
UseClosedBar = false;
LiveBarTimeout = 10; // Вызывать не чаще чем раз в 10 секунд
никогда такого не было и вот опять

oxi
Сообщения: 160
Зарегистрирован: 20 сен 2016, 23:20
Благодарил (а): 12 раз
Поблагодарили: 67 раз

Re: Как работает CloseLongLimit?

Непрочитанное сообщение oxi » 12 май 2020, 13:08

Не противоречит документации.
Поставьте ShowMessage и он будет выдавать информацию с заданной в LiveBar частотой.
Просто множественное исполнение торговых команд на одном баре запрещено в целях защиты от убытков.
100 сделок на баре и получаем - 4%

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

Re: Как работает CloseLongLimit?

Непрочитанное сообщение evge » 12 май 2020, 13:20

Остановка робота снимает (неисполненную) заявку, но повторный запуск её не возвращает. Здесь как бы нет множественного исполнения. Если заявка не исполнена, а была снята остановкой робота или например CancelActiveOrders(), то какой убыток может быть? Может при исполнении заявки только запрещать, а снимать и переставлять ордер разрешать роботу было бы правильнее?
никогда такого не было и вот опять

oxi
Сообщения: 160
Зарегистрирован: 20 сен 2016, 23:20
Благодарил (а): 12 раз
Поблагодарили: 67 раз

Re: Как работает CloseLongLimit?

Непрочитанное сообщение oxi » 12 май 2020, 13:31

В таком варианте нет.
Подумаем над выносом флага.


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

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

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