← Zurück

Не приходит событие NewMyTrades в MarketQuotingStrategy

сабж. Причем по родительской стратегии событие приходит. Я так понимаю, стратегия успевает остановиться перед вызовом этого события. Это так задумано или баг?

 var strategy = new MyStrategy(Security)
            {
            	Volume = 1,
            	Portfolio = Portfolio_FORTS,
            	Trader = this.Trader,
            };

			strategy.NewMyTrades += t =>
			{
				MyTrade tr = t.FirstOrDefault();
				Debug.WriteLine("Родительская стратегия: Пришла новая сделка - " + DateTime.Now.ToLongTimeString() + "   " + tr.ToString());
			};

В коде стратеги при получении сигнала прописываю:


var order = base.BuyAt(Security.LastTrade.Price);
var qstr = new MyMarketQuotingStrategy(order, 0m.Pips(order.Security), 0m.Pips(order.Security)) { PriceType = MarketPriceTypes.Middle, MaxErrorCount = 1 };
	qstr.NewMyTrades += t =>
	{
		MyTrade tr = t.FirstOrDefault();
		Debug.WriteLine("Котирование: Пришла новая сделка - " + DateTime.Now.ToLongTimeString() + "   " + tr.ToString());
	};
base.ChildStrategies.Add(qstr);

Получаю: Родительская стратегия: Пришла новая сделка - 17:07:56 StockSharp.BusinessEntities.MyTrade Родительская стратегия: Пришла новая сделка - 17:08:17 StockSharp.BusinessEntities.MyTrade

Причем иногда сделка по котированию все-таки приходит, иногда с третьего раза, бывает позже.

War dieses Thema hilfreich?

Thema teilen

Kommentare (10)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

InsiderHSE
InsiderHSE Autor

Версия 3.2.2, проблема осталась. Использую следующий код


class MyMarketQuotingStrategy : MarketQuotingStrategy
    {
        public MyMarketQuotingStrategy(Order order, Unit betsPriceOffset, Unit priceOffset) : base(order, betsPriceOffset, priceOffset) { }

		protected override void OnRunned()
		{
			base.NewMyTrades += t =>
			{
				MyTrade tr = t.FirstOrDefault();
				Debug.WriteLine("Котирование внутри: Пришла новая сделка - " + DateTime.Now.ToLongTimeString() + "   " + tr.ToString());
			};
			base.OnRunned();
		}
    }

Событие не приходит.

Mikhail Sukhov
Mikhail Sukhov

InsiderHSE: Версия 3.2.2, проблема осталась. Использую следующий код

Событие не приходит.

Молный лог можете привести котирования? Плюс как используется стратегия? Куда-то добавляется или сама по себе работает? Как создается?

InsiderHSE
InsiderHSE Autor

Есть базовая стратегия, которая при срабатывании кастомного правила вызывается Do(Action1):


private void Action1()
        {
            Debug.WriteLine(DateTime.Now.ToLongTimeString() + " - Запускаем действие");
            var order = _signalDirection == OrderDirections.Buy ? base.BuyAt(Security.LastTrade.Price) : base.SellAt(Security.LastTrade.Price);
            var qstr = new MyMarketQuotingStrategy(order, 0m.Pips(order.Security), (0m).Pips(order.Security)) { PriceType = MarketPriceTypes.Middle, MaxErrorCount = 1 };
            
			qstr.NewMyTrades += t =>
			{
				MyTrade tr = t.FirstOrDefault();
				Debug.WriteLine("Котирование: Пришла новая сделка - " + DateTime.Now.ToLongTimeString() + "   " + tr.ToString());
			};
			this.ChildStrategies.Add(qstr);

        }

код MyMarketQuotingStrategy приведен выше. Сама базовая стратегия вызывается следующим образом:


private void LounchStrat()
        {

            var cm = new CandleManager(Trader);
            var cf = new VolumeTimeFrameCandleFactory();
            cm.UnRegisterCandleFactory<TimeFrameCandle>();
            cm.RegisterCandleFactory(cf);

            var strategy = new VolumeDiffStrategy(Security, SignalSecurity, 18000, (-5.08).Percents(), 0.03.Percents(), 0.03.Percents())
            {
            	Volume = 1,
            	Portfolio = Portfolio_FORTS,
            	Trader = this.Trader,
            	IsShortEnabled = true,
            	CandleManager = cm,
            };

        	cm.RegisterCandles<TimeFrameCandle, TimeSpan>(SignalSecurity, TimeSpan.FromSeconds(25));
            if (!Trader.Terminal.IsQuotesOpened(Security)) Trader.Terminal.OpenQuotes(Security);
            Trader.RegisterQuotes(Security);

			strategy.NewMyTrades += t =>
			{
				MyTrade tr = t.FirstOrDefault();
				Debug.WriteLine("Базовая стратегия: Пришла новая сделка - " + DateTime.Now.ToLongTimeString() + "   " + tr.ToString());
			};

            var fileLogger = new FileStrategyLogger("log.txt");
            fileLogger.Strategies.Add(strategy);
            strategy.Start();
        }

Вывод дебаггера (после первой сделки все события вызвались, потом нет):


16:19:25 - вызван OnRunning
16:19:38 - Запускаем действие
Базовая стратегия: Пришла новая сделка - 16:19:40   StockSharp.BusinessEntities.MyTrade
Котирование: Пришла новая сделка - 16:19:40   StockSharp.BusinessEntities.MyTrade
Котирование внутри: Пришла новая сделка - 16:19:40   StockSharp.BusinessEntities.MyTrade
The thread '<No Name>' (0xc90) has exited with code 0 (0x0).
16:20:00 - Запускаем действие
Базовая стратегия: Пришла новая сделка - 16:20:01   StockSharp.BusinessEntities.MyTrade
16:20:29 - Запускаем действие
Базовая стратегия: Пришла новая сделка - 16:20:34   StockSharp.BusinessEntities.MyTrade

лог:


VDS 23.06.2011 16:19:26.313 Стратегия запущена.
VDS 23.06.2011 16:19:38.359 [MMQS] Стратегия запущена.
VDS 23.06.2011 16:19:38.566 [MMQS] Регистрация новой заявки на Buy с ценой 9622 и объемом 1.
VDS 23.06.2011 16:19:38.577 [MMQS] Заявка 58736846 на Buy отправлена с ценой 9622 объемом 1.
VDS 23.06.2011 16:19:38.678 [MMQS] Заявка 58736846 не имеет состояния.
VDS 23.06.2011 16:19:40.297 [MMQS] Цена текущей 9622 и лучшей 9621.
VDS 23.06.2011 16:19:40.297 [MMQS] Котирование заявки 58736846 на Buy с ценой 9622 объемом 1.
VDS 23.06.2011 16:19:40.301 [MMQS] Перекотирование зарегистрировано для заявки 58736847 на Buy с ценой 9621 объемом 1.
VDS 23.06.2011 16:19:40.336 [MMQS] Позиция изменилась на 1.
VDS 23.06.2011 16:19:40.336 [MMQS] Заканчиваем котирование с неисполненным объемом равный 0.
VDS 23.06.2011 16:19:40.336 [MMQS] Стратегия останавливается.
VDS 23.06.2011 16:19:40.340 [MMQS] Стратегия остановлена.
VDS 23.06.2011 16:20:00.823 [MMQS] Стратегия запущена.
VDS 23.06.2011 16:20:00.889 [MMQS] Регистрация новой заявки на Buy с ценой 9618 и объемом 1.
VDS 23.06.2011 16:20:00.889 [MMQS] Заявка 58736848 на Buy отправлена с ценой 9618 объемом 1.
VDS 23.06.2011 16:20:01.091 [MMQS] Заявка 58736848 не имеет состояния.
VDS 23.06.2011 16:20:01.659 [MMQS] Позиция изменилась на 1.
VDS 23.06.2011 16:20:01.659 [MMQS] Заканчиваем котирование с неисполненным объемом равный 0.
VDS 23.06.2011 16:20:01.659 [MMQS] Стратегия останавливается.
VDS 23.06.2011 16:20:01.659 [MMQS] Стратегия остановлена.
VDS 23.06.2011 16:20:30.155 [MMQS] Стратегия запущена.
VDS 23.06.2011 16:20:30.302 [MMQS] Регистрация новой заявки на Buy с ценой 9619 и объемом 1.
VDS 23.06.2011 16:20:30.302 [MMQS] Заявка 58736849 на Buy отправлена с ценой 9619 объемом 1.
VDS 23.06.2011 16:20:34.764 [MMQS] Позиция изменилась на 1.
VDS 23.06.2011 16:20:34.764 [MMQS] Заканчиваем котирование с неисполненным объемом равный 0.
VDS 23.06.2011 16:20:34.764 [MMQS] Стратегия останавливается.
VDS 23.06.2011 16:20:34.764 [MMQS] Стратегия остановлена.

Mikhail Sukhov
Mikhail Sukhov

Меня в логе напрягает один момент. Сначала он выводит запись от родительской стратегии, а затем от дочерней. А так быть не может. Потому что родительская подписывается последней строчкой в Action1 (неявно при добавлении в ChildStrategies).

InsiderHSE
InsiderHSE Autor

Mikhail Sukhov: Меня в логе напрягает один момент. Сначала он выводит запись от родительской стратегии, а затем от дочерней. А так быть не может. Потому что родительская подписывается последней строчкой в Action1 (неявно при добавлении в ChildStrategies). Мхаил, а в какую сторону копать не подскажете? Не знаю, может это поможет, логика работы робота такая - базовая тратегия подписывается на событие новой свечки, и если есть условия на вход, вызывает кастомное событие. Есть кастомное правило, которое подписывается на это событие и активируется по его приходу, именно в тот момент вызывается Action1.

Mikhail Sukhov
Mikhail Sukhov

InsiderHSE:

Mikhail Sukhov: Меня в логе напрягает один момент. Сначала он выводит запись от родительской стратегии, а затем от дочерней. А так быть не может. Потому что родительская подписывается последней строчкой в Action1 (неявно при добавлении в ChildStrategies). Мхаил, а в какую сторону копать не подскажете? Не знаю, может это поможет, логика работы робота такая - базовая тратегия подписывается на событие новой свечки, и если есть условия на вход, вызывает кастомное событие. Есть кастомное правило, которое подписывается на это событие и активируется по его приходу, именно в тот момент вызывается Action1.

Можете выкинуть все люгику работы, и прислать пример мне на mika сбк сайт?

InsiderHSE
InsiderHSE Autor

Mikhail Sukhov: Можете выкинуть все люгику работы, и прислать пример мне на mika сбк сайт? Сделал.

Mikhail Sukhov
Mikhail Sukhov

InsiderHSE:

Mikhail Sukhov: Можете выкинуть все люгику работы, и прислать пример мне на mika сбк сайт? Сделал.

Ок, получил. Буду разбираться.

Mikhail Sukhov
Mikhail Sukhov

InsiderHSE:

Mikhail Sukhov: Можете выкинуть все люгику работы, и прислать пример мне на mika сбк сайт? Сделал.

Нашел проблему. Ситуация следующая. MyMarketQuotingStrategy успешно отработало и было удалено. Сделки приходят чуть с запозданием, поэтому оно то успевало вызвать событие, то нет. Решается проблема так:

public VolumeDiffStrategy(Security sec)
{
  this.Security = sec;
  base.RemoveChildStrategies = false;
}

Пока не знаю, насколько это правильно.

InsiderHSE
InsiderHSE Autor

Mikhail Sukhov:

InsiderHSE:

Mikhail Sukhov: Можете выкинуть все люгику работы, и прислать пример мне на mika сбк сайт? Сделал.

Нашел проблему. Ситуация следующая. MyMarketQuotingStrategy успешно отработало и было удалено. Сделки приходят чуть с запозданием, поэтому оно то успевало вызвать событие, то нет. Решается проблема так:

public VolumeDiffStrategy(Security sec)

> 
> Пока не знаю, насколько это правильно.
Спасибо, попробую так.