S#

стал вдруг получать ошибку в дочерней стратегии при переходе на 2.2


стал вдруг получать ошибку в дочерней стратегии при переходе на 2.2
Atom Ответить
27.07.2010


Приветствую, Михаила и коллег!

Переписываю роботов под новую логику стратегий. При котирование в
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 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 27.07.2010
Ответить


О! А вот это хорошее замечание. Надо про это написать:

base.ChildStrategies.Add(strategy);
strategy.Start();

Спасибо:

ustas

Фотография
Дата: 27.07.2010
Ответить


Спасибо, поменял местами, по Вашему совету.

Но стал получать другую ошибку

Необработанное исключение: System.InvalidOperationException:
Последовательность не содержит элементов
в System.Linq.Enumerable.Min[TSource](IEnumerable`1 source)
в System.Linq.Enumerable.Min[TSource,TResult](IEnumerable`1 source,
Func`2 selector)
в Ecng.Trading.Algo.Strategy(SynchronizedCollection`1 ☻)
в Ecng.Collections.CollectionHelper.SyncGet[TCollection,TResult]
(TCollection collection, Func`2 func)
в Ecng.Trading.Algo.Strategy.♫()
в Ecng.Trading.Algo.StrategyManager.♠.☻(SynchronizedList`1 ☻)
в 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)

Спасибо и с уважением!

Автор топика
Спасибо:

ustas

Фотография
Дата: 27.07.2010
Ответить


Вопрос пока не снимается, это, похоже, я туплю.
а PriceDelta - да, выставляется.

Спасибо и с уважением!

Автор топика
Спасибо:

ustas

Фотография
Дата: 28.07.2010
Ответить


Приветствую, Михаил!

После Вашего последнего изменения 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 останавливается.

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.07.2010
Ответить


Ага, еще одна ошибка. Перегрузите функцию CanFinish()

protected override bool CanFinish()
{
return base.LeftContracts == 0;

Спасибо:

ustas

Фотография
Дата: 28.07.2010
Ответить


наверно имелось в виду

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

}

Автор топика
Спасибо:

Garry

Фотография
Дата: 29.07.2010
Ответить


Добрый день, переопределил метод 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
Спасибо:

ustas

Фотография
Дата: 29.07.2010
Ответить


Кстати, да, подтверждаю и присоединяюсь к вопросу.
Самому пришлось обходить такое поведение семафорчиками.

Т.е. работает не совсем так как описано тут.

https://stocksharp.ru/doc/help/html/8ea639f6-ce74-4a00-9f13-db59c8c23...


Ожидалось, что при вызове родительского OnProcess будет выполняться
вначале дочерний OnProcess.
А сейчас наоборот. При вызове дочернего OnProcess выполняется
родительский OnProcess причём, похоже, первым.

Спсибо и с уважением!

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.07.2010
Ответить


А как Вы узнали, что они именно плодяться? Вы их случаем не
пересоздаете сами из свой основной стратегии?

Спасибо:

ustas

Фотография
Дата: 29.07.2010
Ответить


И еще вопрос в догонку.

Михаил, отфильтровывается ли стакан (GetFilteredQuotes) от своих
собственных заявок в стратегии MarketQuotingStrategy ?
По поведению кажется что нет. Почему? Или мне только кажется и дело в
скорости (интервале) ?

Спасибо и с уважением!

Автор топика
Спасибо:

Garry

Фотография
Дата: 29.07.2010
Ответить


Дебаргер запустил, в 2.1 то работало как, пока MarketQuotingStrategy
не отработает, родительский OnProcess не вызывается, а тут вызывается.
Сигналы никуда не деваются, поэтому создается новый
MarketQuotingStrategy из родительской стратегии из того же места что и
первый, и так далее пока сигнал не пропадет. Родительская стратегия и
MarketQuotingStrategy работают в параллели, хотя принудительно
установил
strategy = new myMarketQuotingStrategy(order, new Unit())
{ IsParallel = false };

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.07.2010
Ответить


Ок, можете проверить следущее. В OnProcess свой стратегии вставить
вывод кол-ва дочерних:

AddLog(base.ChildStrategies.Count);

Спасибо:

Garry

Фотография
Дата: 29.07.2010
Ответить


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

Спасибо:

Garry

Фотография
Дата: 29.07.2010
Ответить


Извиняюсь не весь лог скопировал

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

Спасибо:

ustas

Фотография
Дата: 30.07.2010
Ответить


Приветствую, Михаила и коллег!

Михаил, огромное Вам спасибо за Вашу работу!

Да, в 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 контрактов.

которо
Автор топика
Спасибо:

ustas

Фотография
Дата: 30.07.2010
Ответить


(...продолжу, извините, сорвалось...)

Как видно со второго и во всех последующих котированиях нет сообщения
об
исполненной заявке и добавляется вот эта странная запись:

11:48:39.5053796 MQS Заканчиваем котирование с неисполненным объемом
равный 0 контрактов.

которой, например, не было в самом первом котировании ( и не было в
2.1 при полном исполнении заявки )
и нет сообщений о текущей и лучших ценах как, например, в певрой
стратегии.
Мне кажется что есть какой то сбой при остановке стратегии.

Спасибо и с уважением!

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.07.2010
Ответить


"Заканчиваем котирование с неисполненным объемом равный 0 контрактов."
это новая фраза, появившаяся из-за

https://stocksharp.ru/doc/help/html/P_Ecng_Trading_Algo_QuotingStrate...


Вопрос. Заявки то котируются или нет во втором и в третьем случаях?

Спасибо:

ustas

Фотография
Дата: 30.07.2010
Ответить


Всё равно непонятно. Разве стратегия закончилась из за первышения
MaxReRegisterCount ? Это невероятно, учитывая что по умолчанию
MaxReRegisterCount огромен.(2**32?)
Да и видно, что заявка то исполнилась, так как LeftPositions==0. А
сообщения об исполнении заявки, как в первом случае - нет.

А вот на этот простой вопрос мне трудно ответить : )

Кажется что да. А иногда кажется что нет.
Дело в том что я ставлю интервал для дочерней стратегии котирования
очень большим. И сам из событий стакана вызываю OnProcess дочерней
стратегии. Т.е. стратегия работает не по интервалу, а по событию.
Чаще всего всё в порядке. Но иногда наблюдаю картину - стакан сильно
меняется, при этом с маленькой PriceDelta заявка уходит далеко от
лучшей заявки, гораздо дальше чем PriceDelta.
Т.е. дочерняя стратегия как бы замирает. Хотя я её точно вызываю.

Еще повторю вопрос в догонку.
Отфильтровывает ли MQS из стакана собственные заявки?

Спасибо и с уважением!

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.07.2010
Ответить


Это сообщение пишется всегда, при превышении или нет. Просто как
индикатор, сколько осталось. 0 - это хорошо. Больше 0 - это плохо.

Спасибо:

Garry

Фотография
Дата: 30.07.2010
Ответить


Спасибо огромное, у меня все зарвботало!

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy