Overall Statistics
Total Trades
40
Average Win
0.8%
Average Loss
-1.01%
Compounding Annual Return
7296476873.353%
Drawdown
4.800%
Expectancy
0.207
Net Profit
8.6%
Sharpe Ratio
9.165
Loss Rate
32%
Win Rate
68%
Profit-Loss Ratio
0.79
Alpha
7.424
Beta
-1.195
Annual Standard Deviation
0.788
Annual Variance
0.621
Information Ratio
8.81
Tracking Error
0.801
Treynor Ratio
-6.044
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using QuantConnect.Indicators;


namespace QuantConnect 
{   
    /*
    *   QuantConnect University: Binary Options are a different way of trading than traditional equities. 
    *   
    *   Although QuantConnect does not support live binary option trading yet, we do support backtesting your binary option strategies!
    *   This framework algorithm will get you started on how to setup a Binary Option Backtest.
    */
    
    public class BinaryOptionsFrameworkAlgorithm : QCAlgorithm
    {
        //Setup your variables for the strategy:
        //1. Starting cash and the internal cash counter.
        private decimal _cash = 2000;
        //2. Record keeping of the entry price for the strategy
        private decimal _price = 0;
        //3. Bet size
        private decimal _stakeSize = 20;
        //4. Win fraction of the stake size
        private decimal _winFraction = 0.8m;
        //5. Timeframe for the Holdings:
        //private DateTime _entry = new DateTime();
        private TimeSpan _period = TimeSpan.FromSeconds(1800);
        //private ArrayList symbols = new ArrayList();
        private string _symbol = "EURUSD";
       // BinaryBet _binaryBet;
        //Other working variables:
        //private TradeBars _data;
        public static QCAlgorithm Reference;
        private List<BinaryBet> _bets = new List<BinaryBet>();
        private RelativeStrengthIndex _rsi;
        private BollingerBands _bb;
        private MovingAverageConvergenceDivergence _macd;
        
        //Initialize the algorithm parameters such as symbols and dates:
        public override void Initialize()
        {
            
                AddSecurity(SecurityType.Forex, _symbol, Resolution.Minute);
                _bb = BB(_symbol, 20, 1m, MovingAverageType.Exponential, Resolution.Minute);
                _macd = MACD(_symbol, 13 , 26, 9 , MovingAverageType.Exponential, Resolution.Minute);
                _rsi =  RSI(_symbol, 14, MovingAverageType.Exponential, Resolution.Hour);
            
            SetStartDate(2014, 3, 20);         
            SetEndDate(2014, 3, 25); 
            SetCash(_cash);
            Reference = this;
            
    
            
        }

        //Data Event Handler: Process new financial data.
        public void OnData(TradeBars data) 
        {
            //Scan for Entry:
            
                
                //Rules for entry.
                
                _price = data[_symbol].Price;
                
                if (!_bb.IsReady) return;
                //if(!_macd.IsReady) return;
                //if(!_aroon.IsReady) return;
                //if(!_rsi.IsReady) return;
                
                decimal signalDeltaPercent = (_macd - _macd.Signal)/(_macd.Fast);
                var tolerance = 0.0025m;
                var percentUp = _bb.UpperBand/20000m;
                var percentDown = _bb.LowerBand/20000m;
                 if ( _price >= (_bb.UpperBand +percentUp)
                  && signalDeltaPercent < tolerance && _rsi >= 70 )
                        {
                            _bets.Add(new BinaryBet(_symbol, Direction.Short, _stakeSize, _period, _winFraction));
                        }
                 else if ( _price <= (_bb.LowerBand - percentDown)
                 && signalDeltaPercent > tolerance  && _rsi <= 30)
                 {
                             _bets.Add(new BinaryBet(_symbol, Direction.Long, _stakeSize, _period, _winFraction));
                 }
            
    
            
                    
                
        
            
            //Scan Bets:
            foreach (var bet in _bets) {
                if (!bet.Paid && bet.Expired) {
                    if (bet.Scan()) {
                        var lastProfit = bet.ProfitLoss;
                        
                        var security = Securities[bet.Symbol];
                        
                        //Update cash:
                        _cash += lastProfit;
                        bet.Paid = true;
                        
                        //Record profit loss for statistics
                        security.Holdings.AddNewProfit(lastProfit);
                        Transactions.TransactionRecord.Add(Time, lastProfit);
                    }
                }
            }
            
            //Update the cash:
            Portfolio.SetCash(_cash);
        }
        
        
    } // End of Algorithm

} // End of Namespace
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using QuantConnect.Indicators;

namespace QuantConnect {

    //Container for holding bet information.
    public class BinaryBet 
    {
        private QCAlgorithm _algorithm;
        private Direction _direction;
        private string _symbol;
        private DateTime _entryTime;
        private decimal _entryPrice;
        private decimal _exitPrice;
        private TimeSpan _period;
        private decimal _stake;
        private bool _paid;
        private decimal _winFraction;
        /*private RelativeStrengthIndex _rsi;
        private BollingerBands _bb;
        private MovingAverageConvergenceDivergence _macd;*/
        
        
        public BinaryBet(string symbol, Direction direction, decimal stake, TimeSpan period, decimal winFraction = 0.8m)
        {
            this._algorithm = BinaryOptionsFrameworkAlgorithm.Reference;
            this._symbol = symbol;
            this._period = period;
            this._stake = stake;
            this._winFraction = winFraction;
            this._entryTime = _algorithm.Time;
            this._entryPrice = _algorithm.Securities[_symbol].Price;
            this._direction = direction;
            this._paid = false;
           /* this._bb = BB(_symbol, 20, 1m, MovingAverageType.Exponential, Resolution.Minute);
            this._macd = MACD(_symbol, 13 , 26, 9 , MovingAverageType.Exponential, Resolution.Minute);
            this._rsi =  RSI(_symbol, 14, MovingAverageType.Exponential, Resolution.Hour);*/
            
        }
        
        //Option has passed its expiration date.
        public bool Expired
        {
            get 
            {
                return (_algorithm.Time > (_entryTime + _period));
            }
        }
        
        /*public RelativeStrengthIndex Rsi
        {
            get
            {
                return _rsi;
            }
        }
        
        public MovingAverageConvergenceDivergence Macd
        {
            get
            {
                return _macd;
            }
        }
        
        
        public BollingerBands Bb
        {
            get
            {
                return _bb;
            }
        }  */
        
        
        //Flag indicating the bet has been paid.
        public bool Paid 
        {
            get { return _paid; }
            set { _paid = value; }
        }
        
        public string Symbol {
            get { return _symbol; }
        }
        
        public decimal EntryPrice{
            get {return _entryPrice;}
        }
        
        public Direction BetDirection
        {
            get {  return _direction;}
            set { _direction = value;}
        }
        
        public decimal ProfitLoss
        {
            get {
                if (!Expired) return 0;
                switch (_direction) 
                {
                    default: 
                    case Direction.Long:
                        return (_algorithm.Securities[_symbol].Price > _entryPrice) ? (_stake * _winFraction) : (-1*_stake);
                        
                    case Direction.Short:
                        return (_algorithm.Securities[_symbol].Price < _entryPrice) ? (_stake * _winFraction) : (-1*_stake);
                }
            }
        }
        
        // Scan the algorithm time and price
        public bool Scan() 
        {
            if (_exitPrice == Decimal.Zero && Expired) 
            {
                _exitPrice = _algorithm.Securities[_symbol].Price;
                return true;
            }
            return false;
        }
    }
    
     
    //Long or Short Bet
    public enum Direction {
        Long, 
        Short
    }
}