コード例 #1
0
        public override void Initialize()
        {
            SetStartDate(2016, 01, 01);
            SetEndDate(DateTime.Now);
            SetCash(10000);

            AddForex(symbol, Resolution.Minute);

            _alma = new ArnaudLegouxMovingAverage(50);
            _psar = new ParabolicStopAndReverse();

            var fiveConsolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(5));

            SubscriptionManager.AddConsolidator(symbol, fiveConsolidator);

            RegisterIndicator(symbol, _alma, fiveConsolidator);
            RegisterIndicator(symbol, _psar, fiveConsolidator);

            fiveConsolidator.DataConsolidated += OnFiveMinutes;

            var history = History(System.TimeSpan.FromMinutes(5 * 50), Resolution.Minute);

            foreach (var data in history.OrderBy(x => x.Time))
            {
                foreach (var key in data.Keys)
                {
                    //_alma.Update(key.Time, key.Value);
                }
            }
        }
コード例 #2
0
ファイル: SVMBaselineSignal.cs プロジェクト: godtopus/Lean
        public SVMBaselineSignal(
            QuoteBarConsolidator dailyConsolidator,
            ExponentialMovingAverage dailyALMA,
            QuoteBarConsolidator shortTermConsolidator,
            ArnaudLegouxMovingAverage alma5,
            ArnaudLegouxMovingAverage alma8,
            ArnaudLegouxMovingAverage alma13,
            ArnaudLegouxMovingAverage alma21,
            ArnaudLegouxMovingAverage alma34,
            ArnaudLegouxMovingAverage alma55,
            ArnaudLegouxMovingAverage alma89,
            ArnaudLegouxMovingAverage alma144,
            SchaffTrendCycle schaffTrendCycle,
            AverageTrueRange atr,
            AverageDirectionalIndex adx,
            SecurityHolding securityHolding,
            Security security,
            SVMBaselineStrategy qcAlgorithm)
        {
            _dailyConsolidator = dailyConsolidator;
            _dailyALMA         = dailyALMA;
            _rollingDailyAlma  = HistoryTracker.Track(_dailyALMA);

            _shortTermConsolidator = shortTermConsolidator;
            _rollingConsolidator   = HistoryTracker.Track(_shortTermConsolidator);

            _schaffTrendCycle        = schaffTrendCycle;
            _rollingSchaffTrendCycle = HistoryTracker.Track(_schaffTrendCycle);

            _atr = atr;
            _adx = adx;

            _alma5   = alma5;
            _alma8   = alma8;
            _alma13  = alma13;
            _alma21  = alma21;
            _alma34  = alma34;
            _alma55  = alma55;
            _alma89  = alma89;
            _alma144 = alma144;

            _rollingAlma5   = HistoryTracker.Track(_alma5, 100);
            _rollingAlma8   = HistoryTracker.Track(_alma8, 100);
            _rollingAlma13  = HistoryTracker.Track(_alma13, 100);
            _rollingAlma21  = HistoryTracker.Track(_alma21, 100);
            _rollingAlma34  = HistoryTracker.Track(_alma34, 100);
            _rollingAlma55  = HistoryTracker.Track(_alma55, 100);
            _rollingAlma89  = HistoryTracker.Track(_alma89, 100);
            _rollingAlma144 = HistoryTracker.Track(_alma144, 100);

            _windows = new List <RollingWindow <IndicatorDataPoint> > {
                _rollingAlma5, _rollingAlma8, _rollingAlma13, _rollingAlma21, _rollingAlma34, _rollingAlma55, _rollingAlma89, _rollingAlma144
            };
            _windowCombinations = _windows.Combinations(3);

            _maCross = new MovingAverageCross(_rollingAlma8, _rollingAlma21, _rollingAlma144);

            _securityHolding       = securityHolding;
            _security              = security;
            _minimumPriceVariation = 10000m;

            _qcAlgorithm = qcAlgorithm;

            var eader = new string[] { "Time", "Signal" };

            Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_ALMA_Signal.csv", eader);

            if (_store)
            {
                var path   = @"C:\Users\M\Desktop\EURUSD.csv";
                var header = new string[] { "Time", "End Time", "Open", "High", "Low", "Close", "STC", "STC Previous", "EMA", "Slope", "Diff", "Prediction", "Signal" };
                File.WriteAllText(path, string.Join(";", header) + Environment.NewLine);

                var ohlcHeader = new string[] { "Time", "Open", "High", "Low", "Close" };
                Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_1D.csv", ohlcHeader);
                Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_15M.csv", ohlcHeader);
                //Storage.CreateFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_1M.csv", ohlcHeader);
            }

            shortTermConsolidator.DataConsolidated += (sender, args) =>
            {
                if (_previousBar == null)
                {
                    _previousBar = args;
                    return;
                }

                if (_dailyConsolidator.Consolidated == null)
                {
                    return;
                }

                /*var maSignals = _windowCombinations.Select((wc) =>
                 * {
                 *  var buySignal = wc[0].DoubleCrossAbove(wc[1], wc[2], 5, 0.05m / 10000m) && wc[0].Rising(3, 0.05m / 10000m) && wc[1].Rising(3, 0.05m / 10000m) && wc[2].Rising(3, 0.05m / 10000m);
                 *  var sellSignal = wc[0].DoubleCrossBelow(wc[1], wc[2], 5, 0.05m / 10000m) && wc[0].Falling(3, 0.05m / 10000m) && wc[1].Falling(3, 0.05m / 10000m) && wc[2].Falling(3, 0.05m / 10000m);
                 *  return buySignal ? SignalType.Long : sellSignal ? SignalType.Short : SignalType.NoSignal;
                 * });
                 *
                 * var longCondition = maSignals.Where((s) => s == SignalType.Long).Count() > 9 && args.Close > _alma144 + (10m / 10000m) && args.Close > _alma21 && args.Close > _alma8;
                 * var shortCondition = maSignals.Where((s) => s == SignalType.Short).Count() > 9 && args.Close < _alma144 - (10m / 10000m) && args.Close < _alma21 && args.Close < _alma8;
                 *
                 * var longExit = Signal == SignalType.Long
                 *              && (maSignals.Where((s) => s == SignalType.Short).Count() > 4);
                 * var shortExit = Signal == SignalType.Short
                 *              && (maSignals.Where((s) => s == SignalType.Long).Count() > 4);*/
                var dailyQuote = (QuoteBar)_dailyConsolidator.Consolidated;

                // If mean reverting and no slow cross within ?, close

                var longMeanReversion = _maCross.CrossAbove(6, 0.7m / 10000m) &&
                                        _rollingAlma8.InRangeExclusive(_alma21, _alma144) &&
                                        _adx >= 23
                                        //&& _atr > 7m / 10000m
                                        //&& _rollingAlma144.Diff(_rollingAlma21, 10).Average() * 10000m >= 15m
                                        && _rollingAlma8.Rising(1, 1m / 10000m) &&
                                        _rollingAlma21.Rising(1, 0.1m / 10000m)
                                        ? TradeType.Direction.MeanRevertingUp
                                        : TradeType.Direction.Flat;

                var longTrend = _maCross.DoubleCrossAbove(6, 0.4m / 10000m)
                                //&& _adx < 20
                                //&& _rollingAlma144.Diff(_rollingAlma21, 10).Sum() * 10000m > 5m
                                && _rollingAlma8.Rising(2, 1m / 10000m) &&
                                _rollingAlma21.Rising(2, 0.1m / 10000m) &&
                                _rollingAlma55.Rising(2) &&
                                args.Close > _alma144
                                ? TradeType.Direction.TrendUp
                                : TradeType.Direction.Flat;

                var longCondition = args.Close > _dailyALMA && (longMeanReversion == TradeType.Direction.MeanRevertingUp || longTrend == TradeType.Direction.TrendUp);

                var shortMeanReversion = _maCross.CrossBelow(6, 0.6m / 10000m) &&
                                         _rollingAlma8.InRangeExclusive(_alma144, _alma21) &&
                                         _adx >= 23
                                         //&& _atr > 7m / 10000m
                                         //&& _rollingAlma21.Diff(_rollingAlma144, 10).Average() * 10000m >= 15m
                                         && _rollingAlma8.Falling(1, 1m / 10000m) &&
                                         _rollingAlma21.Falling(1, 0.1m / 10000m)
                                            ? TradeType.Direction.MeanRevertingDown
                                            : TradeType.Direction.Flat;

                var shortTrend = _maCross.DoubleCrossBelow(6, 0.4m / 10000m)
                                 //&& _adx < 20
                                 //&& _rollingAlma21.Diff(_rollingAlma144, 10).Sum() * 10000m > 5m
                                 && _rollingAlma8.Falling(2, 1m / 10000m) &&
                                 _rollingAlma21.Falling(2, 0.1m / 10000m) &&
                                 _rollingAlma55.Falling(2) &&
                                 args.Close < _alma144
                                    ? TradeType.Direction.TrendDown
                                    : TradeType.Direction.Flat;

                var shortCondition = args.Close < _dailyALMA && (shortMeanReversion == TradeType.Direction.MeanRevertingDown || shortTrend == TradeType.Direction.TrendDown);

                var longExit = Signal == SignalType.Long &&
                               ((shortTrend == TradeType.Direction.TrendDown ||
                                 _rollingAlma34.CrossBelow(_rollingAlma144, 7, 0.1m / 10000m)) ||
                                (_lastTradeType == TradeType.Direction.MeanRevertingUp &&
                                 args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0 &&
                                 _maCross.CrossBelow(6, 0.3m / 10000m) &&
                                 _alma144 > _alma21));
                //var longExit = Signal == SignalType.Long && (_rollingAlma21.CrossBelow(_rollingAlma144, 7, 0.1m / 10000m)); NZDUSD
                //_rollingConsolidator.Diff(_rollingAlma144, Field.Close, 8).All((d) => d < 5m)

                /*&& (((_rollingAlma8.CrossBelow(_rollingAlma21, 5, 0.1m / 10000m) && _rollingAlma21.Falling())
                || (_rollingConsolidator.CrossBelow(_alma144.Current.Value) && _rollingAlma21.Falling())));*/
                var shortExit = Signal == SignalType.Short &&
                                ((longTrend == TradeType.Direction.TrendUp ||
                                  _rollingAlma34.CrossAbove(_rollingAlma144, 7, 0.1m / 10000m)) ||
                                 (_lastTradeType == TradeType.Direction.MeanRevertingDown &&
                                  args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0 &&
                                  _maCross.CrossAbove(6, 0.3m / 10000m) &&
                                  _alma144 < _alma21));
                //var shortExit = Signal == SignalType.Short && ( _rollingAlma21.CrossAbove(_rollingAlma144, 7, 0.1m / 10000m)); NZDUSD
                //_rollingConsolidator.Diff(_rollingAlma144, Field.Close, 8).All((d) => d > 5m)

                /*&& (((_rollingAlma8.CrossAbove(_rollingAlma21, 5, 0.1m / 10000m) && _rollingAlma21.Rising())
                || (_rollingConsolidator.CrossAbove(_alma144.Current.Value) && _rollingAlma21.Rising())));*/

                if (!_securityHolding.Invested && longCondition && !shortCondition && (_triggerBar == null || args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0))
                {
                    Signal         = Signal != SignalType.PendingLong ? SignalType.Long : SignalType.Long;
                    _triggerBar    = args;
                    _maEntry       = _windows.Select((w) => w[0]);
                    _lastTradeType = longTrend != TradeType.Direction.Flat ? longTrend : longMeanReversion;
                }
                else if (!_securityHolding.Invested && shortCondition && !longCondition && (_triggerBar == null || args.Time.Subtract(_triggerBar.Time).CompareTo(TimeSpan.FromMinutes(15 * 6)) > 0))
                {
                    Signal         = Signal != SignalType.PendingShort ? SignalType.Short : SignalType.Short;
                    _triggerBar    = args;
                    _maEntry       = _windows.Select((w) => w[0]);
                    _lastTradeType = shortTrend != TradeType.Direction.Flat ? shortTrend : shortMeanReversion;
                }
                else if ((_securityHolding.Invested && longExit) || (_securityHolding.Invested && shortExit))
                {
                    Signal          = (Signal == SignalType.Long && shortCondition) || (Signal == SignalType.Short && longCondition) ? SignalType.Reverse : SignalType.Exit;
                    _pendingSignal  = Signal == SignalType.Reverse && shortCondition ? SignalType.Short : Signal == SignalType.Reverse && longCondition ? SignalType.Long : SignalType.NoSignal;
                    _waitingForScan = true;
                    _triggerBar     = args;
                    _maEntry        = _windows.Select((w) => w[0]);
                    _lastTradeType  = _pendingSignal == SignalType.Long
                                        ? longTrend != TradeType.Direction.Flat ? longTrend : longMeanReversion
                                        : shortTrend != TradeType.Direction.Flat ? shortTrend : shortMeanReversion;
                }
                else if (!_securityHolding.Invested)
                {
                    Signal = SignalType.NoSignal;
                    //_triggerBar = null;
                    _maEntry = null;
                }

                _previousBar = args;

                //_qcAlgorithm.PlotSignal(args, _rollingEMA[0], _rollingEmaSlope[0], _rollingSchaffTrendCycle[0], _rollingStoch[0], (int)shortTermTrend, (int) Signal);

                if (_store)
                {
                    /*var line = new object[] { Storage.ToUTCTimestamp(args.Time), Storage.ToUTCTimestamp(args.EndTime), args.Open, args.High, args.Low, args.Close, _rollingSchaffTrendCycle[0].Value, _rollingSchaffTrendCycle[1].Value,
                     *                      _rollingEMA[0].Value, _rollingEmaSlope[0].Value, (args.Close - _rollingEMA[0]) * _minimumPriceVariation, (int)shortTermTrend, (int) Signal };
                     * Storage.AppendToFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}.csv", line);
                     *
                     * var ohlcLine = new object[] { Storage.ToUTCTimestamp(args.Time), args.Open, args.High, args.Low, args.Close };
                     * Storage.AppendToFile($"C:\\Users\\M\\Desktop\\{_security.Symbol.Value}_OHLC_15M.csv", ohlcLine);*/
                }
            };
        }
コード例 #3
0
ファイル: SVMBaselineStrategy.cs プロジェクト: godtopus/Lean
        public override void Initialize()
        {
            SetStartDate(2016, 1, 1);
            SetEndDate(2017, 1, 1);
            SetCash(3000);

            SetBrokerageMessageHandler(new CustomBrokerageMessageHandler(this));

            foreach (var symbol in Symbols)
            {
                AddForex(symbol, _dataResolution, Market.Oanda, false, 1m);

                Securities[symbol].TransactionModel = new OandaTransactionModel();
                //Securities[symbol].SlippageModel = new ConstantSlippageModel(0m);
                SetBrokerageModel(BrokerageName.OandaBrokerage);

                /******** LONG TERM TREND ********/
                var dailyConsolidator = new QuoteBarConsolidator(TimeSpan.FromDays(1));
                var alma = new ExponentialMovingAverage(symbol, 10);

                RegisterIndicator(symbol, alma, dailyConsolidator);
                SubscriptionManager.AddConsolidator(symbol, dailyConsolidator);

                /******** SHORT TERM TRADING ********/
                var consolidator     = new QuoteBarConsolidator(TimeSpan.FromMinutes(15));
                var schaffTrendCycle = new SchaffTrendCycle(symbol);
                var atr = new AverageTrueRange(symbol, 10);
                var adx = new AverageDirectionalIndex(symbol, 10);

                RegisterIndicator(symbol, schaffTrendCycle, consolidator);
                RegisterIndicator(symbol, atr, consolidator);
                RegisterIndicator(symbol, adx, consolidator);

                /****** ALMA Fibonacci ******/
                var alma5   = new ArnaudLegouxMovingAverage(symbol, 5);
                var alma8   = new ArnaudLegouxMovingAverage(symbol, 8);
                var alma13  = new ArnaudLegouxMovingAverage(symbol, 13);
                var alma21  = new ArnaudLegouxMovingAverage(symbol, 21);
                var alma34  = new ArnaudLegouxMovingAverage(symbol, 34);
                var alma55  = new ArnaudLegouxMovingAverage(symbol, 55);
                var alma89  = new ArnaudLegouxMovingAverage(symbol, 89);
                var alma144 = new ArnaudLegouxMovingAverage(symbol, 144);

                RegisterIndicator(symbol, alma5, consolidator);
                RegisterIndicator(symbol, alma8, consolidator);
                RegisterIndicator(symbol, alma13, consolidator);
                RegisterIndicator(symbol, alma21, consolidator);
                RegisterIndicator(symbol, alma34, consolidator);
                RegisterIndicator(symbol, alma55, consolidator);
                RegisterIndicator(symbol, alma89, consolidator);
                RegisterIndicator(symbol, alma144, consolidator);

                SubscriptionManager.AddConsolidator(symbol, consolidator);

                var signal = new SVMBaselineSignal(
                    dailyConsolidator, alma,
                    consolidator, alma5, alma8, alma13, alma21, alma34, alma55, alma89, alma144, schaffTrendCycle, atr, adx,
                    Portfolio[symbol], Securities[symbol], this
                    );

                var std = ATR(symbol, 100, MovingAverageType.DoubleExponential, _dataResolution);

                /******** HISTORY ********/
                var history = History <QuoteBar>(symbol, TimeSpan.FromDays(100), _dataResolution);

                foreach (var bar in history)
                {
                    std.Update(bar);
                    consolidator.Update(bar);
                    dailyConsolidator.Update(bar);
                }

                if (_store)
                {
                    var header = new string[] { "Time", "ALMA_5", "ALMA_8", "ALMA_13", "ALMA_21", "ALMA_34", "ALMA_55", "ALMA_89", "ALMA_144" };
                    Storage.CreateFile($"C:\\Users\\M\\Desktop\\{symbol}_ALMA.csv", header);

                    consolidator.DataConsolidated += (sender, args) =>
                    {
                        var line = new object[] { Storage.ToUTCTimestamp(args.Time), alma5.Current.Value, alma8.Current.Value, alma13.Current.Value,
                                                  alma21.Current.Value, alma34.Current.Value, alma55.Current.Value, alma89.Current.Value, alma144.Current.Value };
                        Storage.AppendToFile($"C:\\Users\\M\\Desktop\\{symbol}_ALMA.csv", line);
                    };
                }

                Securities[symbol].VolatilityModel = new AverageTrueRangeVolatilityModel(std);
                _tradingAssets.Add(symbol,
                                   new TradingAsset(Securities[symbol],
                                                    new OneShotTrigger(signal),
                                                    new ProfitTargetSignalExit(null, _targetProfitLoss),
                                                    _maximumTradeRisk,
                                                    _maximumTradeSize,
                                                    this
                                                    ));

                //_tradingAssets[symbol].IsTradable = true;

                var h = new object[] { "Time", "Signal", "Price" };
                Storage.CreateFile($"C:\\Users\\M\\Desktop\\{symbol}_ALMA_Signal.csv", h);
            }

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(7, 0, TimeZones.London), () =>
            {
                var tradeableDay = TradingCalendar.GetTradingDay().BusinessDay;
                if (tradeableDay)
                {
                    foreach (var s in Symbols)
                    {
                        _tradingAssets[s].IsTradable = true;
                    }
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday),
                        TimeRules.At(20, 0, TimeZones.London), () =>
            {
                foreach (var s in Symbols)
                {
                    //_tradingAssets[s].IsTradable = false;
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Friday),
                        TimeRules.BeforeMarketClose(Symbols.First(), 240), () =>
            {
                foreach (var s in Symbols)
                {
                    //_tradingAssets[s].IsTradable = false;
                }
            });

            Schedule.On(DateRules.Every(DayOfWeek.Friday),
                        TimeRules.BeforeMarketClose(Symbols.First(), 180), () =>
            {
                foreach (var s in Symbols)
                {
                    //_tradingAssets[s].Liquidate();
                    //_tradingAssets[s].IsTradable = false;
                }
            });

            /******** CHARTING ********/

            /*Chart price = new Chart("Daily Price");
             * price.AddSeries(new Series("Price", SeriesType.Candle, 0));
             * price.AddSeries(new Series("MA", SeriesType.Line, 0));
             * price.AddSeries(new Series("Slope", SeriesType.Line, 1));
             * price.AddSeries(new Series("STC", SeriesType.Line, 2));
             * AddChart(price);
             *
             * Chart ma = new Chart("MA");
             * ma.AddSeries(new Series("HMA", SeriesType.Line, 0));
             * ma.AddSeries(new Series("FAMA", SeriesType.Line, 1));
             * AddChart(ma);
             *
             * Chart lsma = new Chart("LSMA");
             * lsma.AddSeries(new Series("Slope", SeriesType.Line, 0));
             * AddChart(lsma);*/

            Chart plotter = new Chart("Plotter");

            plotter.AddSeries(new Series("Close", SeriesType.Line, 0));
            plotter.AddSeries(new Series("EMA", SeriesType.Line, 1));
            plotter.AddSeries(new Series("Buy", SeriesType.Scatter, "", Color.Green, ScatterMarkerSymbol.Triangle));
            plotter.AddSeries(new Series("Sell", SeriesType.Scatter, "", Color.Red, ScatterMarkerSymbol.TriangleDown));
            //plotter.AddSeries(new Series("Stopped", SeriesType.Scatter, "", Color.Yellow, ScatterMarkerSymbol.Diamond));
            plotter.AddSeries(new Series("Diff", SeriesType.Bar, 2));
            plotter.AddSeries(new Series("Slope", SeriesType.Line, 3));
            plotter.AddSeries(new Series("STC", SeriesType.Line, 4));
            plotter.AddSeries(new Series("STOCH", SeriesType.Line, 5));
            plotter.AddSeries(new Series("Prediction", SeriesType.Bar, 6));
            plotter.AddSeries(new Series("Signal", SeriesType.Bar, 7));
            AddChart(plotter);
        }