Приветствую уважаемых Михаила и коллег!
Как ни пытаюсь использовать механизм защиты заявок с двух сторон так или иначе наталкиваюсь на System.NullReferenceException:
Делаю по примеру из документации так:
RegisterOrder(order);
When(order.NewTrades()).Do(
this.Protect(order,
t => new TakeProfitStrategy(t, 8.Points(Security)),
t => new StopLossStrategy(t, 4.Points(Security)))). Activated<Strategy>(s =>
{
When(s.Stopped()).
Do(() =>
{
/* сработало стоп условие */
});
}
Вот вывод
SS 18:02:54.5659960 Условие активировано. SS 18:02:55.6690591 Условие активировано. SS 18:02:56.0800826 Условие удалено. SS 18:02:56.1830885 Условие активировано. SS 18:02:56.6941177 Условие удалено. SS 18:02:56.7951235 Условие активировано. CBGIBTJWVIETWCTYIXWE 18:02:56.8011239 Стратегия запущена. SS 18:02:56.8041240 Условие удалено. CBGIBTJWVIETWCTYIXWE 18:02:56.9071299 Условие активировано. BS 18:02:56.9161304 Стратегия запущена. BS 18:02:56.9161304 Стратегия запущена. TPS 18:02:56.9171305 Стратегия запущена. SLS 18:02:56.9171305 Стратегия запущена. SS 18:03:06.1856606 Условие активировано. SS 18:03:09.6178569 Условие активировано. SS 18:03:10.0878838 Условие удалено. SS 18:03:10.1888896 Условие активировано. SS 18:03:10.6279147 Условие удалено. SLS 18:03:46.3049553 Регистрация защитной заявки с ценой 10502 и объемом 1. SLS 18:03:46.3059554 Регистрация новой заявки на Sell с ценой 10502 и объемом 1. SLS 18:03:46.7649816 Заявка 64609003 на Sell отправлена с ценой 10502 объемом 1. SLS 18:03:49.8051555 Котируемая заявка 64609003 исполнилась. SLS 18:03:49.8061556 Стратегия останавливается. SLS 18:03:50.8202136 Котирование отменяет заявку 64609003. SLS 18:03:50.8212136 Стратегия остановлена. BS 18:03:50.8322143 Стратегия останавливается. TPS 18:03:50.8322143 Стратегия останавливается. TPS 18:03:51.8482724 System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qMXFDCdP09AuZO4H5hcFEAQ==() TPS 18:03:52.8603303 System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qMXFDCdP09AuZO4H5hcFEAQ==() TPS 18:03:53.8723882 System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qMXFDCdP09AuZO4H5hcFEAQ==() TPS 18:03:54.8894463 System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qMXFDCdP09AuZO4H5hcFEAQ==() TPS 18:03:55.9415065 System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qMXFDCdP09AuZO4H5hcFEAQ==() и так далее ....
Причём точно такая же ошибка возникает, если делать как в другом примере
private void OnMewMyTrades(IEnumerable<MyTrade> trades)
{
return;
// фильтруем сделки, чтобы найти те, которые произошли для заявки TargetOrder
trades = trades.Where(t => t.Order == this.TargetOrder);
// сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
var batch = new BatchStrategy(BatchFinishModes.All) { IsParallel = true };
// для каждой сделки добавляем для защиты по пакетной стратегии
batch.ChildStrategies.AddRange(trades.Select(t =>
{
var s = new BatchStrategy(BatchFinishModes.First) { IsParallel = true };
var takeProfit = new TakeProfitStrategy(t, 4.Points(Security));
var stopLoss = new StopLossStrategy(t, 4.Points(Security));
// делаем стратегии параллельными, чтобы они не блокировали работу контролирующей BatchStrategy
takeProfit.IsParallel = stopLoss.IsParallel = true;
s.ChildStrategies.Add(takeProfit);
s.ChildStrategies.Add(stopLoss);
return s;
}).Cast<Strategy>());
if (batch.ChildStrategies.Count > 0)
{
base.ChildStrategies.Add(batch);
}
После срабатывания одной из стратегий либо SL либо TP другая стратегия во время остановки начинает давать этот NullReferenceException
Спасибо и с уважением!
Update Да, версия 2.6.1
Kommentare (8)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Ошибку нашел. Пока сделайте так. Создайте своих наследников от STS и TPS и в OnProcess при base.ProcessState != StrategyProcessStates.Runned сделайте проверку base.Order на null.
Я предупреждал что я туповат. Сделал как я понял. Т.е. так:
Вот получил такой лог > SS 11:42:34.7755760 Условие активировано.
Спасибо и с уважением!
Ага , спасибо. Сделал как у Вас.
но, вот лог
И дальше
Ну и мой несчастный NullReferenceException всё ещё тут как тут :(
Запускаю так:
Ага , спасибо. Сделал как у Вас.
Во первых не понятно почему выше BS остановилась ведь TPS заявка 45082989 не исполнилась и снята.
А вот это интересно. Остановилась, потому что заявку кто-то снял. Стратегия котирования на это не рассчитывала. Почему она вообще снялась? Она же только что была зарегистрирована.
И дальше
Ну и мой несчастный NullReferenceException всё ещё тут как тут :(
Запускаю так:
TPS и SLS точно переопределили, как я написал выше?
Вот и я не понял кто её снял. Возможно что брокер. Если повторится посмотрю более внимательно. Пока этот момент можно засаспендить.
Более важно для меня сейчас NullReferenceException.
Один в один copy/paste
Может Вам поможет такой мой сценарий.
Что будет, если, например, цена достаточно волатильна и стоп с тейком, расположенные близко ( я понимаю что это не хорошо, но это тестирование, когда надо пытаться предусмотреть как можно больше вариантов) и за интервал могут сработать сразу два условия для выставления заявок. Как тут будет вести себя котирование? Обе заявки выставятся? Одна отменит другую? А потом, если ни одна не выполнится? Что будет дальше?
Спасибо и с уважением!
Вот, чтобы простынёй не размахивать, более короткий но, тем не менее, полный лог . NullReferenceException случился в самом начале
Ура, в 2.6.2 эксепшена пока нет! Подтверждаю :)
Спасибо и с уважением!