Не работает StopLossStrategy - CurrentBestPrice = 0
Atom Ответить
22.06.2011


Никак не могу разобраться со стоп-лосс стратегией. Цена инструмента в стакане опускается ниже поога, а стратегия не срабаывает. Посмотрел дебаггером - метод GetNewPrice() все время возвращает 0, CurrentBestPrice также всегда 0, хотя массив из 20 лучших оферов присутствует. У кого-нибудь стратегия работает? Прошу подсказать, в какую сторону копать, замучался уже(
CryptoSources.7z 62,6KB (9)

Теги:


Спасибо:




9 Ответов
esper

Фотография
Программист
Дата: 30.06.2011
Ответить


Версия 3.2.2, ни StopLoss, ни TakeProfit у меня не срабатывают, хотя цена уходит за дельту. На основании каких данных эти стратегию принимают решение?

Стратегия следующая:
Код
sealed class VolumeStrategy : Strategy
	{
		private volatile Order _order;

		public VolumeStrategy(ITrader trader)
		{
			base.Trader = trader;
			base.NewMyTrades += OnNewMyTrades;

			base.Volume = Settings.Volume;
			base.Security = Trader.Securities.FirstOrDefault(s => s.Code == "SBER03");
			base.Portfolio = Trader.Portfolios.FirstOrDefault(p => p.Name == "");
		}

		protected override void OnRunning()
		{
			this
			    .When(base.Security.SecurityNewTrades())
			    .Do(Process)
			    .MakePeriodical();

			base.OnRunning();
		}

		protected override void DisposeManaged()
		{
			base.NewMyTrades -= OnNewMyTrades;
			base.DisposeManaged();
		}

		private void Process()
		{
			if (_order != null)
			{
				return;
			}

			//определяем направление сделки
			var direction = OrderDirections.Buy;

			// создаем заявку
			_order = base.CreateOrder(
				direction, 
				Security.ShrinkPrice(direction == OrderDirections.Buy ? Security.BestBid.Price + Settings.SafeSpread : Security.BestAsk.Price - Settings.SafeSpread), 
				base.Volume);

			// регистрируем ее
			base.RegisterOrder(_order);
		}

		private void OnNewMyTrades(IEnumerable<MyTrade> trades)
		{
			// фильтруем сделки, чтобы найти те, которые произошли для заявки TargetOrder
			trades = trades.Where(t => t.Order == _order);

			// если не найдена ни одна сделка для заявки TargetOrder
			if (trades.Count() == 0)
				return;

			// сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
			var batch = new BatchStrategy(BatchFinishModes.All);
			
			// для каждой сделки добавляем для защиты по пакетной стратегии
			batch.ChildStrategies.AddRange(trades.Select(CreateBatch).Cast<Strategy>());

			base.ChildStrategies.Add(batch);
		}

		BatchStrategy CreateBatch(MyTrade t)
		{
			var s = new BatchStrategy(BatchFinishModes.First);

			// выставляет тейк-профит в n пунктов
			var takeProfit = new TakeProfitStrategy(t, new Unit(0.2m));

			// выставляет стоп-лосс в m пунктов
			var stopLoss = new StopLossStrategy(t, new Unit(0.2m));

			s.ChildStrategies.Add(takeProfit);
			s.ChildStrategies.Add(stopLoss);
			return s;
		}
	}


Лог:
Цитата:
VS 30.06.2011 17:23:19.015 Стратегия запущена.
VS 30.06.2011 17:23:21.312 [BS] Стратегия запущена.
VS 30.06.2011 17:23:21.312 [BS] [BS] Стратегия запущена.
VS 30.06.2011 17:23:21.328 [BS] [BS] [TPS] Стратегия запущена.
VS 30.06.2011 17:23:21.328 [BS] [BS] [SLS] Стратегия запущена.
Спасибо:

esper

Фотография
Программист
Дата: 30.06.2011
Ответить


Отвечу сам себе, для работы защитных стратегий нужен экспорт стакана. Точнее, после добавления экспорта стакана, TakeProfit сработал, а вот StopLoss нет...
Спасибо:

Alexander

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


esper Перейти
Отвечу сам себе, для работы защитных стратегий нужен экспорт стакана. Точнее, после добавления экспорта стакана, TakeProfit сработал, а вот StopLoss нет...


Да, про необходимость запуска экспорта стакана указано в разделе Котирование в документации.

Попробуйте установить IsParallel=true для TakeProfit \ StopLoss \ BatchStrategy
Спасибо:

esper

Фотография
Программист
Дата: 01.07.2011
Ответить


Alexander Перейти
Да, про необходимость запуска экспорта стакана указано в разделе Котирование в документации.

В разделе про котирование не сказано, что TakeProfit и StopLoss тоже стратегии котирования.

Alexander Перейти
Попробуйте установить IsParallel=true для TakeProfit \ StopLoss \ BatchStrategy

Это свойство точно есть в версии 3.2.2?

IsParallel
Спасибо:

esper

Фотография
Программист
Дата: 01.07.2011
Ответить


Взял версию 3.2.3, стратегии стали срабатывать без IsParallel=true
Спасибо:

Alexander

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


esper Перейти
Взял версию 3.2.3, стратегии стали срабатывать без IsParallel=true


А где вы её достали? Мы её ещё не выкладывали... RollEyes
Спасибо:

esper

Фотография
Программист
Дата: 01.07.2011
Ответить


Alexander Перейти
esper Перейти
Взял версию 3.2.3, стратегии стали срабатывать без IsParallel=true


А где вы её достали? Мы её ещё не выкладывали... RollEyes


На codeplex в референсахBlushing
Спасибо:

Alexander

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


esper Перейти
Alexander Перейти
esper Перейти
Взял версию 3.2.3, стратегии стали срабатывать без IsParallel=true


А где вы её достали? Мы её ещё не выкладывали... RollEyes


На codeplex в референсахBlushing



:) подождите final 3.2.3, там ещё есть проблемы.
Скоро будет.

Я пока сам на 3.2.2 сижу.


Я правильно понимаю, что все проблемы, которые в этом топике описаны - решены?
Спасибо:

esper

Фотография
Программист
Дата: 01.07.2011
Ответить


Из этого топика да, стратегии стали отрабатывать, но появились другие вопросы.

Я правильно понимаю, что с переходом на событийную модель надобность в IsParallel отпала?
Спасибо:


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

loading
clippy