Overall Statistics
Total Trades
990
Average Win
2.65%
Average Loss
-2.68%
Compounding Annual Return
-17.626%
Drawdown
91.500%
Expectancy
-0.129
Net Profit
-87.383%
Sharpe Ratio
-0.522
Loss Rate
56%
Win Rate
44%
Profit-Loss Ratio
0.99
Alpha
-0.108
Beta
-0.072
Annual Standard Deviation
0.214
Annual Variance
0.046
Information Ratio
-0.583
Tracking Error
0.278
Treynor Ratio
1.556
Total Fees
$0.00
using System;
using QuantConnect.Indicators;

namespace QuantConnect.Algorithm.CSharp
{
    /// <summary>
    ///     Possibles states of two moving averages.
    /// </summary>
    public enum CrossingMovingAveragesSignals
    {
        Bullish = 1,
        FastCrossSlowFromAbove = -2,
        Bearish = -1,
        FastCrossSlowFromBelow = 2
    }

    public class CrossingMovingAverages 
    {
        private readonly CompositeIndicator<IndicatorDataPoint> _moving_average_difference;

        private int _lastSignal;

        public CrossingMovingAverages(IndicatorBase<IndicatorDataPoint> fast_moving_average,
            IndicatorBase<IndicatorDataPoint> slow_moving_average)
        {
            _moving_average_difference = fast_moving_average.Minus(slow_moving_average);
            _moving_average_difference.Updated += MaDiffUpdated;
        }

        /// <summary>
        ///     Gets the actual state of both moving averages.
        /// </summary>
        public CrossingMovingAveragesSignals Signal { get; set; }

        /// <summary>
        ///     Gets a value indicating whether this instance is ready.
        /// </summary>
        /// <value>
        ///     <c>true</c> if this instance is ready; otherwise, <c>false</c>.
        /// </value>
        public bool IsReady
        {
            get { return _moving_average_difference.IsReady; }
        }

        private void MaDiffUpdated(object sender, IndicatorDataPoint updated)
        {
            if (!IsReady)
            {
                return;
            }
            var actualSignal = Math.Sign(_moving_average_difference);
            if (actualSignal == _lastSignal || _lastSignal == 0)
            {
                Signal = (CrossingMovingAveragesSignals)actualSignal;
            }
            else if (_lastSignal == -1 && actualSignal == 1)
            {
                Signal = CrossingMovingAveragesSignals.FastCrossSlowFromBelow;
            }
            else if (_lastSignal == 1 && actualSignal == -1)
            {
                Signal = CrossingMovingAveragesSignals.FastCrossSlowFromAbove;
            }

            _lastSignal = actualSignal;
        }
    }
}
using System;
using System.Collections.Generic;
using NodaTime;
using QuantConnect.Brokerages;
using QuantConnect.Data;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Market;
using QuantConnect.Indicators;

namespace QuantConnect.Algorithm.CSharp.DateTimeEffectAlgo
{
    public class DateTimeEffectAlgoAnonymous : QCAlgorithm
    {
        /* +-------------------------------------------------+
         * |Algorithm Control Panel                          |
         * +-------------------------------------------------+*/
        private readonly string _pair = "GBPUSD";
        private readonly decimal _leverage = 10m;
        private readonly decimal _exposure = 0.8m;

        TimeSpan _entryTimeThreshold = new TimeSpan(hours:9, minutes:15, seconds:0);

        private int _first_fast_sma_period = 74;
        private int _first_slow_sma_period = 97;
        private int _second_fast_sma_period = 28;
        private int _second_slow_sma_period = 30;

        private decimal _shareByPair;
        /* +-------------------------------------------------+*/
        private Symbol _symbol;

        private CrossingMovingAverages _first_sma_cross;
        private CrossingMovingAverages _second_sma_cross;

        private SimpleMovingAverage _first_fast_sma;
        private SimpleMovingAverage _first_slow_sma;
        private SimpleMovingAverage _second_fast_sma;
        private SimpleMovingAverage _second_slow_sma;


        public override void Initialize()
        {
            SetStartDate(year: 2007, month: 01, day: 01); //Set Start Date
            SetEndDate(year: 2017, month: 09, day: 01); //Set End Date
            SetCash(startingCash: 25000); //Set Strategy Cash
             
            SetBrokerageModel(BrokerageName.OandaBrokerage);

            _shareByPair = _leverage * _exposure;

            // Find more symbols here: http://quantconnect.com/data
            _symbol = AddForex(_pair, Resolution.Minute, "OANDA", leverage: _leverage).Symbol;

            _first_fast_sma = new SimpleMovingAverage(_first_fast_sma_period);
            _first_slow_sma = new SimpleMovingAverage(_first_slow_sma_period);
            _first_sma_cross = new CrossingMovingAverages(_first_fast_sma, _first_slow_sma);

            _second_fast_sma = new SimpleMovingAverage(_second_fast_sma_period);
            _second_slow_sma = new SimpleMovingAverage(_second_slow_sma_period);
            _second_sma_cross = new CrossingMovingAverages(_second_fast_sma, _second_slow_sma);

            var fifteenMinuteConsolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(15));
            fifteenMinuteConsolidator.DataConsolidated += FifteenMinuteConsolidatorOnDataConsolidated;
            SubscriptionManager.AddConsolidator(_symbol, fifteenMinuteConsolidator);
            
            Schedule.On(DateRules.EveryDay(), TimeRules.At(21, 15, DateTimeZone.Utc), () =>
            {
                if (Portfolio[_symbol].IsShort)
                {
                    Liquidate(_symbol);
                }
            });
        }

        private void FifteenMinuteConsolidatorOnDataConsolidated(object sender, QuoteBar quoteBar)
        {
            var idp = new IndicatorDataPoint
            {
                Time = Time,
                Value = quoteBar.Close
            };
            _first_fast_sma.Update(idp);
            _first_slow_sma.Update(idp);
            _second_fast_sma.Update(idp);
            _second_slow_sma.Update(idp);

            // Enter short before 9am gmt on 15min bar close... 
            if (Time.ToUniversalTime().TimeOfDay <= _entryTimeThreshold)
            {
                // ... when SMA(97) Crosses Above SMA(74)... 
                if (_first_sma_cross.Signal == CrossingMovingAveragesSignals.FastCrossSlowFromBelow)
                {
                    // ... and SMA(28) > SMA(30)
                    if (_second_sma_cross.Signal == CrossingMovingAveragesSignals.Bullish)
                    {
                        SetHoldings(_symbol, - _shareByPair);
                    }
                }
            }

        }
    }
}