Приветствую, Михаила и коллег!
Переписываю роботов под новую логику стратегий. При котирование в OnProcess стал получать NullReferenceException
Вот кусок кода
public class MyStrategy : ActionStrategy { public MarketQuotingStrategy strategy;
......................skipped
protected override bool OnProcess()
.......skipped // создаем заявку var order = base.CreateOrder(Direct, IsMarket ? base.Security.GetMarketPrice(Direct, MarketPriceTypes.Opposite):base.Security.GetMarketPrice(Direct, MarketPriceTypes.Following), base.Volume); // регистрируем заявку (обычным способом - лимитированной заявкой)
if (IsMarket){base.RegisterOrder(order);}
else
{
// регистрируем заявку (через котирование)
strategy = new MarketQuotingStrategy(order, new
Unit().Value = PD); if (strategy != null) { strategy.Start(); //ТУТ ОШИБКА base.ChildStrategies.Add(strategy); }
}
NullReferenceException В экземпляре объекта не задана ссылка на объект. в строке strategy.Start();
в 2.1 всё работало. Что я не учёл?
Спасибо и с уважением!
Комментарии (20)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
О! А вот это хорошее замечание. Надо про это написать:
base.ChildStrategies.Add(strategy); strategy.Start();
Спасибо, поменял местами, по Вашему совету.
Но стал получать другую ошибку
Необработанное исключение: System.InvalidOperationException: Последовательность не содержит элементов в System.Linq.Enumerable.Min[TSource](IEnumerable
1 source) в System.Linq.Enumerable.Min[TSource,TResult](IEnumerable1 source, Func2 selector) в Ecng.Trading.Algo.Strategy(SynchronizedCollection1 ☻) в Ecng.Collections.CollectionHelper.SyncGet[TCollection,TResult] (TCollection collection, Func2 func) в Ecng.Trading.Algo.Strategy.♫() в Ecng.Trading.Algo.StrategyManager.♠.☻(SynchronizedList1 ☻) в Ecng.Collections.CollectionHelper.SyncGet[TCollection,TResult] (TCollection collection, Func`2 func) в Ecng.Trading.Algo.StrategyManager.☻(Object ☻) в System.Threading.ThreadHelper.ThreadStart_Context(Object state) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) в System.Threading.ThreadHelper.ThreadStart(Object obj)Спасибо и с уважением!
Вопрос пока не снимается, это, похоже, я туплю. а PriceDelta - да, выставляется.
Спасибо и с уважением!
Приветствую, Михаил!
После Вашего последнего изменения 2.2 те ошибки что выше в этой теме ушли. Спасибо огромное! Дошел до котирования, но оно перестало работать. Заявки даже не выставляются.
Спасибо и с уважением!
Вот лог:
10:25:33.5763796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:33.5773796 MQS MQS останавливается. 10:25:34.6693796 MQS Котирование закончилось. 10:25:34.6693796 MQS MQS остановлена. 10:25:35.7113796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:35.7113796 MQS MQS останавливается. 10:25:36.7133796 MQS Котирование закончилось. 10:25:36.7133796 MQS MQS остановлена. 10:25:38.5023796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:38.5033796 MQS MQS останавливается. 10:25:39.5773796 MQS Котирование закончилось. 10:25:39.5773796 MQS MQS остановлена. 10:25:40.6703796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:40.6703796 MQS MQS останавливается. 10:25:41.7133796 MQS Котирование закончилось. 10:25:41.7133796 MQS MQS остановлена. 10:25:42.5793796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:42.5793796 MQS MQS останавливается. 10:25:43.6703796 MQS Котирование закончилось. 10:25:43.6703796 MQS MQS остановлена. 10:25:44.7133796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:44.7143796 MQS MQS останавливается. 10:25:46.5033796 MQS Котирование закончилось. 10:25:46.5033796 MQS MQS остановлена. 10:25:47.5773796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:47.5773796 MQS MQS останавливается. 10:25:48.6703796 MQS Котирование закончилось. 10:25:48.6703796 MQS MQS остановлена. 10:25:49.7143796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:49.7143796 MQS MQS останавливается. 10:25:51.5033796 MQS Котирование закончилось. 10:25:51.5043796 MQS MQS остановлена. 10:25:52.5773796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:52.5773796 MQS MQS останавливается. 10:25:52.5823796 MQS Котирование закончилось. 10:25:52.5823796 MQS MQS остановлена. 10:25:53.6713796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:25:53.6713796 MQS MQS останавливается. 10:28:45.6923796 MQS Котирование закончилось. 10:28:45.6923796 MQS MQS остановлена. 10:28:45.6933796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:28:45.6933796 MQS MQS останавливается. 10:28:47.6923796 MQS Котирование закончилось. 10:28:47.6923796 MQS MQS остановлена. 10:28:49.6923796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:28:49.6923796 MQS MQS останавливается. 10:28:51.6923796 MQS Котирование закончилось. 10:28:51.6923796 MQS MQS остановлена. 10:28:53.6923796 MQS Заканчиваем котирование с неисполненным объемом равный 2 контрактов. 10:28:53.6923796 MQS MQS останавливается.
Ага, еще одна ошибка. Перегрузите функцию CanFinish()
protected override bool CanFinish() { return base.LeftContracts == 0;
наверно имелось в виду
return base.LeftPosition == 0; // LeftContracts не нашёл
Создал класс (ниже) Котирование вроде заработало, но ещё буду смотреть дальше внимательно.
Большое спасибо и с уважением!
{ using System; using System.Collections.Generic; using System.Linq; using System.Text;
using Ecng.Collections; using Ecng.Trading.Algo; using Ecng.Trading.BusinessEntities;
class MyMarketQuotingStrategy: MarketQuotingStrategy { public MyMarketQuotingStrategy(Order order, Unit priceDelta) : base(order, priceDelta) protected override bool CanFinish() { return base.LeftPosition == 0; }
}
Добрый день, переопределил метод CanFinish() как сказано выше, но у меня появилась другая проблемма, почему-то MyMarketQuotingStrategy не забирает управление, т.е. метод OnProcess родительской стратегии продолжает вызываться, при этом плодятся новые MyMarketQuotingStrategy и соответсвенно заявки. Делаю все как сказанно выше: base.ChildStrategies.Add(strategy); strategy.Start();
вот лог
MQS запущена. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324448 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned Цена текущей 84,55 и лучшей 84,55. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324449 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned Цена текущей 84,55 и лучшей 84,55. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324450 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned Цена текущей 84,55 и лучшей 84,55. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324451 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned Цена текущей 84,55 и лучшей 84,55. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324452 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned Цена текущей 84,55 и лучшей 84,55. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324453 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned Цена текущей 84,55 и лучшей 84,55. Runned Регистрация новой заявки на Buy с ценой 84,55 и объемом 1. Runned Заявка 42324454 на Buy отправлена с ценой 84,55 объемом 1. Runned MQS запущена. Runned MQS останавливается. Stopping Котирование заканчивается на заявке 42324448. Stopping Котирование отменяет активную заявку 42324448. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование заканчивается на заявке 42324449. Stopping Котирование отменяет активную заявку 42324449. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование заканчивается на заявке 42324450. Stopping Котирование отменяет активную заявку 42324450. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование заканчивается на заявке 42324451. Stopping Котирование отменяет активную заявку 42324451. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование заканчивается на заявке 42324452. Stopping Котирование отменяет активную заявку 42324452. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование заканчивается на заявке 42324453. Stopping Котирование отменяет активную заявку 42324453. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование заканчивается на заявке 42324454. Stopping Котирование отменяет активную заявку 42324454. Stopping MQS остановлена. Stopped MQS останавливается. Stopping Котирование закончилось. Stopping MQS остановлена. Stopped
Кстати, да, подтверждаю и присоединяюсь к вопросу. Самому пришлось обходить такое поведение семафорчиками.
Т.е. работает не совсем так как описано тут.
http://stocksharp.com/doc/help/html/8ea639f6-ce74-4a00-9f13-db59c8c23...
Ожидалось, что при вызове родительского OnProcess будет выполняться вначале дочерний OnProcess. А сейчас наоборот. При вызове дочернего OnProcess выполняется родительский OnProcess причём, похоже, первым.
Спсибо и с уважением!
А как Вы узнали, что они именно плодяться? Вы их случаем не пересоздаете сами из свой основной стратегии?
И еще вопрос в догонку.
Михаил, отфильтровывается ли стакан (GetFilteredQuotes) от своих собственных заявок в стратегии MarketQuotingStrategy ? По поведению кажется что нет. Почему? Или мне только кажется и дело в скорости (интервале) ?
Спасибо и с уважением!
Дебаргер запустил, в 2.1 то работало как, пока MarketQuotingStrategy не отработает, родительский OnProcess не вызывается, а тут вызывается. Сигналы никуда не деваются, поэтому создается новый MarketQuotingStrategy из родительской стратегии из того же места что и первый, и так далее пока сигнал не пропадет. Родительская стратегия и MarketQuotingStrategy работают в параллели, хотя принудительно установил strategy = new myMarketQuotingStrategy(order, new Unit()) ;
Ок, можете проверить следущее. В OnProcess свой стратегии вставить вывод кол-ва дочерних:
AddLog(base.ChildStrategies.Count);
5 Котирование заканчивается на заявке 53970735. Stopping 5 Котирование отменяет активную заявку 53970735. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование заканчивается на заявке 53970736. Stopping 5 Котирование отменяет активную заявку 53970736. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование заканчивается на заявке 53970737. Stopping 5 Котирование отменяет активную заявку 53970737. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование закончилось. Stopping 5 MQS остановлена. Stopped 5
Извиняюсь не весь лог скопировал
MQS запущена. Runned 1 Регистрация новой заявки на Buy с ценой 85,27 и объемом 1. Runned 1 Заявка 53970734 на Buy отправлена с ценой 85,27 объемом 1. Runned 1 MQS запущена. Runned 2 Цена текущей 85,27 и лучшей 85,27. Runned 2 Регистрация новой заявки на Buy с ценой 85,27 и объемом 1. Runned 2 Заявка 53970735 на Buy отправлена с ценой 85,27 объемом 1. Runned 2 MQS запущена. Runned 3 Цена текущей 85,27 и лучшей 85,27. Runned 3 Регистрация новой заявки на Buy с ценой 85,27 и объемом 1. Runned 3 Заявка 53970736 на Buy отправлена с ценой 85,27 объемом 1. Runned 3 MQS запущена. Runned 4 Цена текущей 85,27 и лучшей 85,27. Runned 4 Регистрация новой заявки на Buy с ценой 85,27 и объемом 1. Runned 4 Заявка 53970737 на Buy отправлена с ценой 85,27 объемом 1. Runned 4 MQS запущена. Runned 5 MQS останавливается. Stopping 5 Котирование заканчивается на заявке 53970734. Stopping 5 Котирование отменяет активную заявку 53970734. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование заканчивается на заявке 53970735. Stopping 5 Котирование отменяет активную заявку 53970735. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование заканчивается на заявке 53970736. Stopping 5 Котирование отменяет активную заявку 53970736. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование заканчивается на заявке 53970737. Stopping 5 Котирование отменяет активную заявку 53970737. Stopping 5 MQS остановлена. Stopped 5 MQS останавливается. Stopping 5 Котирование закончилось. Stopping 5 MQS остановлена. Stopped 5
Приветствую, Михаила и коллег!
Михаил, огромное Вам спасибо за Вашу работу!
Да, в 2.2.1 всё исправилось.
Единственное, что у меня продолжает вызывать подозрение это не последовательное поведение в дочерней стратегии на котирование. Попробую объяснить.
вот что в логе (Самое первое котирование )
11:44:26.2203796 MQS MQS запущена. 11:44:26.2483796 MQS Регистрация новой заявки на Sell с ценой 8566 и объемом 2. 11:44:26.2503796 MQS Заявка 42202419 на Sell отправлена с ценой 8566 объемом 2. 11:44:26.4533796 MQS Заявка 42202419 не имеет состояния. 11:44:29.4003796 MQS Цена текущей 8566 и лучшей 8566. 11:44:29.5033796 MQS Цена текущей 8566 и лучшей 8567. 11:44:29.5073796 MQS Котирование заявки 42202419 на Sell с ценой 8566 объемом 2. 11:44:30.0123796 MQS Перекотирование зарегистрировано для заявки 42202425 на Sell с ценой 8567 объемом 2. 11:44:30.7183796 MQS Цена текущей 8567 и лучшей 8565. 11:44:30.7193796 MQS Котирование заявки 42202425 на Sell с ценой 8567 объемом 2. 11:44:31.2213796 MQS Перекотирование зарегистрировано для заявки 42202427 на Sell с ценой 8565 объемом 2. 11:44:31.2243796 MQS Заявка 42202427 не имеет состояния. 11:44:33.1323796 MQS Котируемая заявка 42202427 исполнилась. 11:44:33.1343796 MQS MQS останавливается. 11:44:33.1373796 MQS Котирование заканчивается на заявке 42202427. 11:44:33.1383796 MQS MQS остановлена.
Вот этто лог что выше для меня видится идеальным котированием
Следующее (второе котирование)
11:44:33.4433796 MQS MQS запущена. 11:44:33.4463796 MQS Регистрация новой заявки на Buy с ценой 8563 и объемом 2. 11:44:33.4473796 MQS Заявка 42202430 на Buy отправлена с ценой 8563 объемом 2. 11:46:20.9683796 MQS Заканчиваем котирование с неисполненным объемом равный 0 контрактов. 11:46:20.9693796 MQS MQS останавливается. 11:46:20.9723796 MQS Котирование заканчивается на заявке 42202430. 11:46:20.9733796 MQS MQS остановлена.
дальше третье котирование
11:46:44.7073796 MQS MQS запущена. 11:46:46.7263796 MQS Регистрация новой заявки на Buy с ценой 8562 и объемом 4. 11:46:46.7283796 MQS Заявка 42202444 на Buy отправлена с ценой 8562 объемом 4. 11:46:47.2363796 MQS Цена текущей 8562 и лучшей 8562. 11:46:48.8463796 MQS Цена текущей 8562 и лучшей 8563. 11:46:48.8483796 MQS Котирование заявки 42202444 на Buy с ценой 8562 объемом 4. 11:46:49.3493796 MQS Перекотирование зарегистрировано для заявки 42202446 на Buy с ценой 8563 объемом 4. 11:48:39.5053796 MQS Заканчиваем котирование с неисполненным объемом равный 0 контрактов. 11:48:39.5083796 MQS MQS останавливается. 11:48:39.5133796 MQS Котирование заканчивается на заявке 42202446. 11:48:39.5163796 MQS MQS остановлена.
Как видно со второго и последующего котирования нет сообщенрия об исполненной заявке и добавляется странная запись
11:48:39.5053796 MQS Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
которо
(...продолжу, извините, сорвалось...)
Как видно со второго и во всех последующих котированиях нет сообщения об исполненной заявке и добавляется вот эта странная запись:
11:48:39.5053796 MQS Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
которой, например, не было в самом первом котировании ( и не было в 2.1 при полном исполнении заявки ) и нет сообщений о текущей и лучших ценах как, например, в певрой стратегии. Мне кажется что есть какой то сбой при остановке стратегии.
Спасибо и с уважением!
"Заканчиваем котирование с неисполненным объемом равный 0 контрактов." это новая фраза, появившаяся из-за
http://stocksharp.com/doc/help/html/P_Ecng_Trading_Algo_QuotingStrate...
Вопрос. Заявки то котируются или нет во втором и в третьем случаях?
Всё равно непонятно. Разве стратегия закончилась из за первышения MaxReRegisterCount ? Это невероятно, учитывая что по умолчанию MaxReRegisterCount огромен.(2**32?) Да и видно, что заявка то исполнилась, так как LeftPositions==0. А сообщения об исполнении заявки, как в первом случае - нет.
А вот на этот простой вопрос мне трудно ответить : )
Кажется что да. А иногда кажется что нет. Дело в том что я ставлю интервал для дочерней стратегии котирования очень большим. И сам из событий стакана вызываю OnProcess дочерней стратегии. Т.е. стратегия работает не по интервалу, а по событию. Чаще всего всё в порядке. Но иногда наблюдаю картину - стакан сильно меняется, при этом с маленькой PriceDelta заявка уходит далеко от лучшей заявки, гораздо дальше чем PriceDelta. Т.е. дочерняя стратегия как бы замирает. Хотя я её точно вызываю.
Еще повторю вопрос в догонку. Отфильтровывает ли MQS из стакана собственные заявки?
Спасибо и с уважением!
Это сообщение пишется всегда, при превышении или нет. Просто как индикатор, сколько осталось. 0 - это хорошо. Больше 0 - это плохо.
Спасибо огромное, у меня все зарвботало!