Приветствую уважаемых Михаила и коллег!
Как ни пытаюсь использовать механизм защиты заявок с двух сторон так или иначе наталкиваюсь на 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
コメント (8)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Ошибку нашел. Пока сделайте так. Создайте своих наследников от 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 эксепшена пока нет! Подтверждаю :)
Спасибо и с уважением!