Загрузка стратегий с помощью XAML

Загрузка стратегий с помощью XAML
Atom
29.02.2012
FinDirector


XAML можно использовать не только для UI, а просто и для создания объектов. Поделюсь следующей идеей. В неком файле Strategies.config храним список стратегий со всеми параметрами в виде XAML. Набор параметров у каждого типа стратегий разный.

Код
<StrategyLoader
  xmlns="clr-namespace:FinDirector;assembly=FinDirector"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:Strategies="clr-namespace:FinDirector.Strategies;assembly=FinDirector">

  <StrategyLoader.Resources>
    <x:string x:Key="RTSCode">RIH2</x:string>
    <x:string x:Key="SiCode">SIH2</x:string>
  </StrategyLoader.Resources>
  
  <StrategyLoader.Strategies>
    <Strategies:CamarillaStrategy timeFrame="1:00:00" SecurityCode="{x:Static RTSCode}">
      <Strategies:CamarillaStrategy.positionSizer>
        <Strategies:MarginPositionSizer Ratio="0.2"/>
      </Strategies:CamarillaStrategy.positionSizer>
    </Strategies:CamarillaStrategy>

  </StrategyLoader.Strategies>
</StrategyLoader>


Можно загрузить список таких стратегий и автоматически инициализировать все нужные нам свойства следующим кодом:

Код
	[Serializable]
	public class StrategyLoader
	{
		public StrategyList Strategies { get; set; }

		public StrategyLoader()
		{
			Strategies = new StrategyList();
		}


		public static StrategyLoader Load(string location)
		{
			return (StrategyLoader)XamlReader.Load(new XmlTextReader(location));
		}
	}

	[Serializable]
	public class StrategyList : List<Strategy> { }



Спасибо: Supervisor


FinDirector

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


Стратегия выглядит как-то так:

Код
	public class CamarillaStrategy : Strategy, ICandleStrategy
	{
		public ICandleManager CandleManager { get; set; }
		public TimeSpan timeFrame { get; set; }
		public IPositionSizer positionSizer { get; set; }
		public string SecurityCode { get; set; }

		CandleToken candleToken;

		protected override void OnStarting()
		{
			this.Volume = this.positionSizer.GetQuantity(this.Portfolio, this.Security);

			if (CandleManager.IsTimeFrameCandlesRegistered(Security, timeFrame))
			{
				candleToken = CandleManager.GetToken(typeof(TimeFrameCandle), Security, timeFrame);
			}
			else
			{
				candleToken = CandleManager.RegisterTimeFrameCandles(Security, timeFrame);
			}

			this.When(candleToken.CandlesFinished())
				.Do<IEnumerable<Candle>>(OnCandlesFinished);

			base.OnStarting();
		}
	}

	public interface IPositionSizer
	{
		int GetQuantity(Portfolio portfolio, Security security);
	}

	public class MarginPositionSizer : IPositionSizer
	{
		public double Ratio { get; set; }
		public decimal MaxCapital { get; set; }

		public MarginPositionSizer()
		{
			MaxCapital = Settings.MaxCapital;
		}

		public int GetQuantity(Portfolio portfolio, Security security)
		{
			decimal capital = Math.Min(portfolio.BeginAmount.Value, MaxCapital);
			int quantity = (int)(capital * (decimal)Ratio / security.MarginBuy);
			return quantity;
		}
	}

	public interface ICandleStrategy
	{
		ICandleManager CandleManager { get; set; }
	}


В общем получится, что можно через 1 конфигурационный файл задать список всех стратегий со всеми свойствами. Если кому понравилась идея - пользуйтесь.[biggrin]
Спасибо:

Mikhail Sukhov

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


FinDirector
Если кому понравилась идея - пользуйтесь.[biggrin]


Код бы еще тегами отредактировать.
Спасибо:


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

loading
clippy