Проблема с Designer(4.4.16) S# не работает при использовании MACDSignal

Проблема с Designer(4.4.16) S# не работает при использовании MACDSignal
Atom
30.03.2020
ghost-mo


И все таки продукты S# не дружат с комплексными индикаторами..
Просто в Designer нет возможности работать со значением индикатора MACDsignal или ни кто не рассказывает как.
Решил схитрить, и написать код(приведен ниже) но если использовать MACDsignal то Designer вообще начинает адски глючить. ну и бонально стратегия не запускается. Помогите а? Конечно да я сейчас решил проблему сделав макд и ема, но у вас есть и др индикаторы комплексные, что с ними делать...
Код
namespace StockSharp.Designer.Strategies
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Windows.Media;
    using System.Runtime.InteropServices;

    using Ecng.Common;
    using Ecng.ComponentModel;
    using Ecng.Collections;

    using MoreLinq;

    using StockSharp.Messages;
    using StockSharp.Algo;
    using StockSharp.Algo.Candles;
    using StockSharp.Algo.Strategies;
    using StockSharp.Algo.Indicators;
    using StockSharp.Logging;
    using StockSharp.BusinessEntities;
    using StockSharp.Localization;
    using StockSharp.Xaml;
    using StockSharp.Xaml.Charting;
    using StockSharp.Xaml.Diagram.Elements;

    [Guid("eea2da25-de12-4b6c-b43a-6a98e2fdb01c")]
    [DisplayName(@"MACDS_RSI")]
    public class NewStrategy : Strategy
    {
        private readonly MovingAverageConvergenceDivergenceSignal _macdSig;
        private readonly RelativeStrengthIndex _rsi;

        private readonly StrategyParam<int> _longParam;
        private readonly StrategyParam<int> _shortParam;
        private readonly StrategyParam<int> _sigParam;
        private readonly StrategyParam<int> _rsiParam;
        private readonly StrategyParam<int> _konMACDSParam;
        private readonly StrategyParam<int> _konRsiParam;

        private bool _isSell=false;
        private bool _isBuy=false;

        [DiagramExternal]
        public event Action<Order> NewMyOrder;

        [DiagramExternal]
        public event Action<MyTrade> NewMyTrade2;

    //    [DiagramExternal]
    //    public event Action<IIndicatorValue> NewMacdSigIndicator;

        [DiagramExternal]
        public event Action<IIndicatorValue> NewRsiIndicator;

        public NewStrategy()
        {
            _longParam = new StrategyParam<int>(this, nameof(Long), 40);
            _shortParam = new StrategyParam<int>(this, nameof(Short), 20);
            _sigParam = new StrategyParam<int>(this, nameof(Sig), 9);
            _rsiParam = new StrategyParam<int>(this, nameof(Rsi), 18);
            _konMACDSParam=new StrategyParam<int> (this, nameof(KonMACDS), 0);
            _konRsiParam=new StrategyParam<int> (this, nameof(KonRsi), 50);

            _macdSig = new MovingAverageConvergenceDivergenceSignal(new MovingAverageConvergenceDivergence(new ExponentialMovingAverage { Length = Long },new ExponentialMovingAverage { Length = Short }),new ExponentialMovingAverage { Length = Sig });
            _rsi = new RelativeStrengthIndex { Length = Rsi };
        }

        public int Long
        {
            get => _longParam.Value;
            set
            {
                _longParam.Value = value;
                _macdSig.Macd.LongMa.Length = value;
            }
        }

        public int Short
        {
            get => _shortParam.Value;
            set
            {
                _shortParam.Value = value;
                _macdSig.Macd.ShortMa.Length = value;
            }
        }
        public int Sig
        {
            get => _sigParam.Value;
            set
            {
                _sigParam.Value = value;
                _macdSig.SignalMa.Length = value;
            }
        }
        public int Rsi
        {
            get => _rsiParam.Value;
            set
            {
                _rsiParam.Value = value;
                _rsi.Length = value;
            }
        }
        public int KonMACDS
        {
            get => _konMACDSParam.Value;
            set
            {
                _konMACDSParam.Value = value;
            }
        }
        public int KonRsi
        {
            get => _konRsiParam.Value;
            set
            {
                _konRsiParam.Value = value;
            }
        }

        protected override void OnReseted()
        {
            this.AddInfoLog("OnReseted");

            _macdSig.Reset();
            _rsi.Reset();

            base.OnReseted();
        }

        protected override void OnStarted()
        {
            this.AddInfoLog("OnStarted");

            _macdSig.Reset();
            _rsi.Reset();

            this
                .WhenNewMyTrade()
                .Do(trade => NewMyTrade2?.Invoke(trade))
                .Apply(this);

            this
                .WhenOrderRegistered()
                .Or(this.WhenOrderChanged())
                .Do(order => NewMyOrder?.Invoke(order))
                .Apply(this);

            Connector.RegisterSecurity(Security);

            base.OnStarted();
        }

        protected override void OnStopped()
        {
            this.AddInfoLog("OnStopped");

            Connector.UnRegisterSecurity(Security);

            base.OnStopped();
        }

        [DiagramExternal]
        public void ProcessPeriod(Unit shortPeriod, Unit longPeriod, Unit sigPeriod, Unit rsiPeriod, Unit KonMACDSPeriod, Unit KonRsiPeriod)
        {
            if (shortPeriod != null)
                Short = (int)shortPeriod.Value;

            if (longPeriod != null)
                Long = (int)longPeriod.Value;

            if (sigPeriod != null)
                Sig = (int)sigPeriod.Value;

            if (rsiPeriod != null)
                Rsi = (int)rsiPeriod.Value;

            if (KonMACDSPeriod != null)
                KonMACDS = (int)KonMACDSPeriod.Value;

            if (KonRsiPeriod != null)
                KonRsi = (int)KonRsiPeriod.Value;
        }

        [DiagramExternal]
        public void ProcessCandle(Candle candle)
        {
            // strategy are stopping
            if (ProcessState == ProcessStates.Stopping)
            {
                CancelActiveOrders();
                return;
            }
            if(this.LogLevel==LogLevels.Debug)
            this.AddInfoLog(LocalizedStrings.Str3634Params.Put(candle.OpenTime, candle.OpenPrice, candle.HighPrice, candle.LowPrice, candle.ClosePrice, candle.TotalVolume, candle.Security));

            // process new candle
            var macdSValue = _macdSig.Process(candle);
            var rsiValue = _rsi.Process(candle);

            //NewMacdSigIndicator?.Invoke(macdSValue);
            NewRsiIndicator?.Invoke(rsiValue);

            // calc new values for short and long
            var isSell = _rsi.GetCurrentValue() < KonRsi && macdSValue.GetValue<decimal>() < KonMACDS;
            var isBuy = _rsi.GetCurrentValue() > KonRsi && macdSValue.GetValue<decimal>() > KonMACDS;
            //Удалить
            this.AddInfoLog(_rsi.GetCurrentValue() + "||" + rsiValue);
            
            //trade
            if (_isSell!=isSell)
            {
                // if short less than long, the sale, otherwise buy
                var direction = Sides.Sell;

                // calc size for open position or revert
                var volume = Position == 0 ? Volume : Position.Abs().Min(Volume) * 2;

                // calc order price as a close price + offset
                var price = candle.ClosePrice-Security.PriceStep;

                RegisterOrder(this.CreateOrder(direction, price, volume));

                // store current values for short and long
                _isSell = isSell;
            }
            if (_isBuy!=isBuy)
            {
                // if short less than long, the sale, otherwise buy
                var direction = Sides.Buy;

                // calc size for open position or revert
                var volume = Position == 0 ? Volume : Position.Abs().Min(Volume) * 2;

                // calc order price as a close price + offset
                var price = candle.ClosePrice + Security.PriceStep;

                RegisterOrder(this.CreateOrder(direction, price, volume));

                // store current values for short and long
                _isBuy = isBuy;
            }
        }
    }
}

Теги:


Спасибо:




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

loading
clippy