← Zurück

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (2)

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

FinDirector
FinDirector Autor

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

	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 конфигурационный файл задать список всех стратегий со всеми свойствами. Если кому понравилась идея - пользуйтесь.😀

Mikhail Sukhov
Mikhail Sukhov

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

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