Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-0.123%
Drawdown
0.200%
Expectancy
0
Net Profit
0%
Sharpe Ratio
-1.773
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.001
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-0.785
Tracking Error
0.095
Treynor Ratio
1.865
Total Fees
$2.00
using System;
using System.Collections.Generic;
using QuantConnect.Data.Consolidators;
using QuantConnect.Indicators;
using QuantConnect.Data.Market;


namespace QuantConnect.Algorithm 
{   
        public class ForexBollinger : QCAlgorithm
        {
                BollingerBands _bb;

                //Use our new consolidator class - 15 minutes / 15 bars joined.
                decimal _price;
                decimal stopPrice;
                string symbol = "EURUSD";
                static int Hist = 180;
                static int Inputs = 4;
                RollingWindow<QuoteBar> _datawindow = new RollingWindow<QuoteBar>(Hist);
                RollingWindow<BollingerBandState> _bbwindow = new RollingWindow<BollingerBandState>(Hist);

                public override void Initialize()
                {
                        SetStartDate(2014, 5, 1);         
                        SetEndDate(2015,6,4); 
                        SetCash(200000);
                        AddSecurity(SecurityType.Forex, symbol, Resolution.Minute);
                        _bb = new BollingerBands(20, 2, MovingAverageType.Simple);
        
                        var fifteenConsolidator = new QuoteBarConsolidator(TimeSpan.FromMinutes(15));
                        fifteenConsolidator.DataConsolidated += OnDataFifteen;
                        SubscriptionManager.AddConsolidator(symbol,fifteenConsolidator);
                        RegisterIndicator(symbol, _bb, fifteenConsolidator, x => x.Value);
                }

                public void OnData(TradeBars data) 
                {   
                        if (!_bb.IsReady) return;

                        if (!Portfolio.HoldStock) 
                        {
                                Order("EURUSD", 1000);
                                Debug("Purchased EURUSD on " + Time.ToShortDateString());
                        }

                        foreach(string symbol in Securities.Keys){
                                if (Securities [symbol].Holdings.IsLong) {
                                        if (data[symbol].Close <= stopPrice) {
                                                Liquidate(symbol);
                                                Debug ("Hit StopLoss: " + data[symbol].Close);
                                        }
                                }
                                if (Securities [symbol].Holdings.IsShort) {
                                        if (data[symbol].Close >= stopPrice) {
                                                Liquidate(symbol);
                                                Debug ("Hit StopLoss: " + data[symbol].Close);
                                        }
                                }
                        }

                }

                private void OnDataFifteen(object sender, QuoteBar consolidated)
                {
                        _price = consolidated.Close;
                        if (!_bb.IsReady) return;
                        _datawindow.Add(consolidated);
                        // save off the current state of the bollinger band object
                        _bbwindow.Add (new BollingerBandState(_bb));
                        
                        if (!_datawindow.IsReady) return;
                        if (!_bbwindow.IsReady) return;

                        Plot("BB", "Price", _price);
                        Plot("BB", _bb.UpperBand, _bb.MiddleBand, _bb.LowerBand);   
                }

                // Fire plotting events once per day:
                public override void OnEndOfDay() 
                {
                        //Log("EndOfDay");
                }

        }
        
        // class to hold the current state of a bollinger band instance
        public class BollingerBandState
        {
            public readonly decimal UpperBand;
            public readonly decimal MiddleBand;
            public readonly decimal LowerBand;
            public readonly decimal StandardDeviation;
            public BollingerBandState(BollingerBands bb)
            {
                UpperBand = bb.UpperBand;
                MiddleBand = bb.MiddleBand;
                LowerBand = bb.LowerBand;
                StandardDeviation = bb.StandardDeviation;
            }
        }
}