Страница 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
В таком варианте нет.
Подумаем над выносом флага.