Эта тема содержит следующие разделы.
Монитор стратегий задуман как инструмент, который позволит не только проторговывать стратегии, но и сохранять произвольные настройки.
Дополнительные настройки
Чтобы добавить расширенные возможности стратегии требуется выполнить следующие действия.
Унаследовать класс WLD.StrategiesLibrary.ExtendedSettingsAttribute для расширенных настроек или WLD.StrategiesLibrary.CustomColumnAttribute для столбца.
В проекте добавить дополнительные ссылки на System.Windows.Forms и System.Drawing
В проекте добавить файл настроек и завести в нем настройку с именем SettingsHost и типом WLRT.WLD.StrategiesLibrary.SettingsHostEx.
Реализовать свой Control наследник WLD.StrategiesLibrary.ExtendedUserControl для настройки свойств, которые добавляются к стратегии.
Применить атрибут к классу стратегии - наследнику WLRT.StrategiesLibrary.WealthScript.
Наследовать свои торговые стратегии от полученой стратегии.
Реализация стратегии с дополнительными возможностями
В примере реализована стратегия с возможностью настройки свойства TargetShares и дополнительный столбец, который появится в мониторе для отображения значения этого свойства.
Чтобы использовать все возможности такой стратегии в своих торговых стратегиях достаточно отнаследовать их от этой. Кроме этого в методе SetShareSize в качестве параметра используйте свойство TargetShares. Например SetShareSize(TargetShares);. Это позволит менять целевой объем позиции в настройках, без перекомпиляции dll.
Копировать | |
---|---|
namespace Samples { [ExtendedSettings] [ExtendedColumn] public abstract class Strategy1 : WLRT.WLD.StrategiesLibrary.WealthScript { protected Strategy1(bool ignoreHistoryMiss, bool loadSumPosition, string account) : base(ignoreHistoryMiss, loadSumPosition, account) { } public int TargetShares { get; private set; } public override void LoadProperties(WLRT.WLD.StrategiesLibrary.StrategyItem strategyItem) { new ExtendedSettingsAttribute().Load(strategyItem); } internal class ExtendedSettingsAttribute : WLRT.WLD.StrategiesLibrary.ExtendedSettingsAttribute { public override void Load(WLRT.WLD.StrategiesLibrary.StrategyItem item) { var str = item.GetStrategyObject() as Strategy1; if (str == null) return; var settings = SettingsUtils.GetHost(this).Get(item.Strategy.Name); if (settings == null) { settings = new WLRT.WLD.StrategiesLibrary.SettingEx {Name = item.Strategy.Name}; SettingsUtils.GetHost(this).Add(settings); } if (settings.TargetShares == 0) { settings.TargetShares = 1; Properties.Settings.Default.Save(); } str.TargetShares = settings.TargetShares; } public override WLRT.WLD.StrategiesLibrary.ExtendedUserControl Control { get { return new ExtendedUserControl(); } } public static void SetValue(Strategy1 strategy, int value) { strategy.TargetShares = value; } } internal class ExtendedColumnAttribute : WLRT.WLD.StrategiesLibrary.CustomColumnAttribute { public override WLRT.WLD.StrategiesLibrary.ColumnDefinition CreateColumn() { return new WLRT.WLD.StrategiesLibrary.ColumnDefinitionSimple("TargetShares", 30, itm => { var extStrategy = itm.GetStrategyObject() as Strategy1; if (extStrategy != null) { return extStrategy.TargetShares.ToString(); } return ""; }); } } } public static class SettingsUtils { public static WLRT.WLD.StrategiesLibrary.SettingsHostEx GetHost<T>(this T obj) { if (Properties.Settings.Default.SettingsHost == null) { Properties.Settings.Default.SettingsHost = new WLRT.WLD.StrategiesLibrary.SettingsHostEx(); Properties.Settings.Default.Save(); } return Properties.Settings.Default.SettingsHost; } } public partial class ExtendedUserControl : WLRT.WLD.StrategiesLibrary.ExtendedUserControl { public ExtendedUserControl() { InitializeComponent(); } public override void LoadSettings(WLRT.WLD.StrategiesLibrary.StrategyItem item) { var strategy = item.GetStrategyObject() as Strategy1; if (strategy == null) return; numericUpDown1.Enabled = true; numericUpDown1.Value = strategy.TargetShares; } public override void ApplySettings(WLRT.WLD.StrategiesLibrary.StrategyItem item) { var strategy = item.GetStrategyObject() as Strategy1; if (strategy == null) return; Strategy1.ExtendedSettingsAttribute.SetValue(strategy, (int) numericUpDown1.Value); } public override void SaveSettings(WLRT.WLD.StrategiesLibrary.StrategyItem item) { var str = item.GetStrategyObject() as Strategy1; if (str == null) return; var settings = SettingsUtils.GetHost(this).Get(item.Strategy.Name); if (settings == null) { settings = new WLRT.WLD.StrategiesLibrary.SettingEx {Name = item.Strategy.Name}; SettingsUtils.GetHost(this).Add(settings); } settings.TargetShares = str.TargetShares; Properties.Settings.Default.Save(); } private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code private void InitializeComponent() { this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); this.label1 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize) (this.numericUpDown1)).BeginInit(); this.SuspendLayout(); // // numericUpDown1 // this.numericUpDown1.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.numericUpDown1.Enabled = false; this.numericUpDown1.Location = new System.Drawing.Point(80, 3); this.numericUpDown1.Maximum = new decimal(new int[] { 10000000, 0, 0, 0 }); this.numericUpDown1.Name = "numericUpDown1"; this.numericUpDown1.Size = new System.Drawing.Size(86, 20); this.numericUpDown1.TabIndex = 0; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(3, 5); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(71, 13); this.label1.TabIndex = 1; this.label1.Text = "TargetShares"; // // ExtendedUserControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.label1); this.Controls.Add(this.numericUpDown1); this.Name = "ExtendedUserControl"; this.Size = new System.Drawing.Size(169, 32); ((System.ComponentModel.ISupportInitialize) (this.numericUpDown1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.Label label1; } } |