Wealth-Lab Russian Traders

Эта тема содержит следующие разделы.

Монитор стратегий задуман как инструмент, который позволит не только проторговывать стратегии, но и сохранять произвольные настройки.

Дополнительные настройки

Чтобы добавить расширенные возможности стратегии требуется выполнить следующие действия.

  1. Унаследовать класс WLD.StrategiesLibrary.ExtendedSettingsAttribute для расширенных настроек или WLD.StrategiesLibrary.CustomColumnAttribute для столбца.

  2. В проекте добавить дополнительные ссылки на System.Windows.Forms и System.Drawing

  3. В проекте добавить файл настроек и завести в нем настройку с именем SettingsHost и типом WLRT.WLD.StrategiesLibrary.SettingsHostEx.

  4. Реализовать свой Control наследник WLD.StrategiesLibrary.ExtendedUserControl для настройки свойств, которые добавляются к стратегии.

  5. Применить атрибут к классу стратегии - наследнику WLRT.StrategiesLibrary.WealthScript.

  6. Наследовать свои торговые стратегии от полученой стратегии.

Реализация стратегии с дополнительными возможностями

В примере реализована стратегия с возможностью настройки свойства TargetShares и дополнительный столбец, который появится в мониторе для отображения значения этого свойства.

Чтобы использовать все возможности такой стратегии в своих торговых стратегиях достаточно отнаследовать их от этой. Кроме этого в методе SetShareSize в качестве параметра используйте свойство TargetShares. Например SetShareSize(TargetShares);. Это позволит менять целевой объем позиции в настройках, без перекомпиляции dll.

 Copy imageКопировать
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;
    }
}