Страница 1 из 1

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

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

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

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);
   }
}

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

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

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

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

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

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

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

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

Добавлено: 08 май 2020, 18:27
evge
Не обратил внимание на
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 секунд

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

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

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

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

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

Добавлено: 12 май 2020, 13:31
oxi
В таком варианте нет.
Подумаем над выносом флага.