Overall Statistics
Total Trades
76
Average Win
10.92%
Average Loss
-16.32%
Compounding Annual Return
466.319%
Drawdown
30.200%
Expectancy
0.450
Net Profit
1134.550%
Sharpe Ratio
2.624
Loss Rate
13%
Win Rate
87%
Profit-Loss Ratio
0.67
Alpha
0.303
Beta
0.675
Annual Standard Deviation
0.505
Annual Variance
0.255
Information Ratio
-0.537
Tracking Error
0.353
Treynor Ratio
1.962
Total Fees
$7424.85
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuantConnect.Data;

namespace QuantConnect.Algorithm.CSharp.GDAX
{
    public class CryptoKiller5 : QCAlgorithm
    {
        private Indicators.ExponentialMovingAverage _fast;
        private Indicators.ExponentialMovingAverage _slow;
        private QuantConnect.Symbol _coin1;
        //private QuantConnect.Symbol _coin2;
        private int _shortEMA = 15;
        private int _longEMA = 60;
        private DateTime _previous;
        private decimal _boughtAt;

        /// <summary>
        /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
        /// </summary>
        public override void Initialize()
        {
            SetStartDate(2016, 6, 21);
            SetEndDate(2017, 12, 1);
            SetCash(10000);

            SetBrokerageModel(Brokerages.BrokerageName.GDAX);
            _coin1 = AddCrypto("BTCUSD", Resolution.Minute).Symbol;
            //_coin2 = AddCrypto("ETHUSD", Resolution.Hour).Symbol;

            _fast = EMA(_coin1, _shortEMA, Resolution.Minute);
            _slow = EMA(_coin1, _longEMA, Resolution.Minute);

            SetBenchmark(_coin1);
        }

        public override void OnData(Slice slice)
        {
            if (!_slow.IsReady)
                return;
            
            var holdings = Portfolio[_coin1].Quantity;
            if (_previous.Date == Time.Date) return;
            const decimal tolerance = 0.00015m;

            if (holdings <= 0)
            {
                if (_fast > _slow*(1 + tolerance))
                {
                    //Log("BUY  >> {0}".format(self.Securities[_coin].Price));
                    SetHoldings(_coin1, 1.0);
                    _boughtAt = Securities[_coin1].Price;
                }
            }
            else
            {
                // .92, 1.15
                decimal profit = 1.09m;
                decimal loss = .85m;

                var pct = Portfolio[_coin1].Price/_boughtAt;
                if (holdings > 0 && (pct > profit || pct < loss))
                {
                    Log(string.Format("CLEARING {0}-{1} {2}", _boughtAt, Portfolio[_coin1].Price, pct));

                    Liquidate(_coin1);
                }
            }

            _previous = Time;
        }
    }
}