Overall Statistics
Total Trades
74
Average Win
2.87%
Average Loss
-1.98%
Compounding Annual Return
-19.371%
Drawdown
22.100%
Expectancy
-0.073
Net Profit
-6.832%
Sharpe Ratio
-0.394
Loss Rate
62%
Win Rate
38%
Profit-Loss Ratio
1.45
Alpha
-0.124
Beta
-0.033
Annual Standard Deviation
0.32
Annual Variance
0.103
Information Ratio
-0.51
Tracking Error
0.356
Treynor Ratio
3.873
Total Fees
$74.00
namespace QuantConnect {

    using QuantConnect.Data.Market;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Slippage;
    
    public class EstimatedSlippageModel : ISlippageModel
    {
        private double SlippageSpread { get; set; }

        public EstimatedSlippageModel(double slippageSpread)
        {
            this.SlippageSpread = slippageSpread;
        }

        /// <summary>
        /// Slippage Model. Return a decimal cash slippage approximation on the order.
        /// </summary>
        public decimal GetSlippageApproximation(QuantConnect.Securities.Security security, Order order)
        {
            var data = security.GetLastData() as BaseData;

            return Convert.ToDecimal((double)data.Value * this.SlippageSpread);
        }
    }
}
namespace QuantConnect {

    using QuantConnect.Data.Market;
    using QuantConnect.Orders;
    using QuantConnect.Orders.Slippage;
    using QuantConnect.Securities;

    public class MySecurityTransactionModel : SecurityTransactionModel
    {
        private ISlippageModel SlippageModel { get; set; }

        public MySecurityTransactionModel(ISlippageModel slippageModel)
        {
            this.SlippageModel = slippageModel;
        }

        public override decimal GetSlippageApproximation(QuantConnect.Securities.Security security, Order order)
        {
            return this.SlippageModel.GetSlippageApproximation(security, order);
        }

        public override decimal GetOrderFee(QuantConnect.Securities.Security security, Order order)
        {
            return 1m;
        }
    }
}
//Copyright Warren Harding 2016.
//Granted to the public domain.
//Use entirely at your own risk.
//Custom algorithm development: warrencharding@yahoo.com.
//Do not remove this copyright notice.

using System;
using System.Collections.Generic;
using QuantConnect.Data.Market;
using QuantConnect.Orders;
using QuantConnect.Orders.Fees;
using QuantConnect.Orders.Fills;
using QuantConnect.Orders.Slippage;
using QuantConnect.Securities;
namespace QuantConnect
{
    public class Algo3 : QCAlgorithm
    {
		int MompPeriod = 30;
		decimal momentumCutoff = -10;
    	decimal ratioOfLastMinuteForMaxTrade =0.05m;
        TradeBars lastData = null;
        int quantity = 0;
        TradeBar lastBar = null;
        decimal minimumPurchase = 500m;
        Dictionary<string,MomentumPercent> moms=new Dictionary<string,MomentumPercent>();

        Dictionary<string,decimal> tickerProfits = new Dictionary<string,decimal>();
        // 
        
        public override void Initialize()
        {
            //Start and End Date range for the backtest:
            //SetStartDate(2015, 1, 1);
            //SetEndDate(DateTime.Now.Date.AddDays(-1));

            SetStartDate(2016, 1, 1);
			SetEndDate(2016, 5, 1);

            SetCash(30000);

			//volatile etf's
			//string tickersString="UVXY,XIV,NUGT,DUST,JNUG,JDUST,LABU,LABD,GUSH,DRIP,TVIX,GASL,GASX,DWTI,UWTI,DGAZ,UGAZ,UBIO,ZBIO,BRZU,RUSS,SCO,UCO,RUSL,ERY,ERX,BIOL,SVXY,VXX,SILJ,BIB,BIS,VIXY,SOXL,VIIX,SOXS,BZQ,USLV,SLVP,DSLV,GDXJ,GLDX";
			string tickersString="GASX";

			//gold
			//string tickersString="NUGT,DUST,JNUG,JDUST";

			//68 biggest companies ranked by market cap.
			//string tickersString="AAPL,GOOGL,GOOG,MSFT,XOM,BRK.A,BRK.B,FB,AMZN,JNJ,GE,WFC,T,NSRGY,CHL,JPM,RHHBY,PG,RDS.B,RDS.A,WMT,VZ,PFE,BUD,KO,BABA,CVX,TCEHY,SPY,NVS,V,DIS,HD,ORCL,TM,SSNLF,PM,MRK,BAC,PEP,CMCSA,NVO,INTC,IBM,CSCO,C,PTR,HSBC,UNH,MO,TSM,BMY,GILD,AMGN,TOT,SLB,RLNIY,MCD,MDT,CVS,MA,SNY,GSK,BTI,BP,LRLCY,MMM,IDEXY";
			
			string[] tickers = tickersString.Split(new string[1] { "," }, StringSplitOptions.RemoveEmptyEntries);
			foreach (string ticker in tickers)
			{
				AddSecurity(SecurityType.Equity,ticker,Resolution.Minute);
				
				tickerProfits.Add(ticker, 0m);
				
				var averageSlippageSpread = 0.0083d; // Slippage percentage for GASX: http://www.etf.com/GASX
				
                this.Securities[ticker].Model = new MySecurityTransactionModel(new EstimatedSlippageModel(averageSlippageSpread));
			}

            foreach (Security s in Securities.Values)
            {
            	//s.FeeModel=new CustomFeeModel();
            	moms.Add(s.Symbol,MOMP(s.Symbol,MompPeriod));
            }
        }
		
        public void OnData(TradeBars data)
        {
            decimal maxTrade;
            if (lastData != null)
            {
                foreach (TradeBar bar in data.Values)
                {
                    if (Portfolio.Cash < minimumPurchase)
                    {
                        break;
                    }
                    if (!Portfolio[bar.Symbol].HoldStock)
                    {
                        if (lastData.ContainsKey(bar.Symbol))
                        {
                            maxTrade = bar.Close * bar.Volume / ratioOfLastMinuteForMaxTrade;
                            quantity =(int)Math.Floor(Math.Min(Portfolio.Cash, maxTrade) / bar.Close);
                            lastBar = lastData[bar.Symbol];
                            if (quantity * bar.Close > minimumPurchase & quantity > 0)
                            {
                                if (moms[bar.Symbol] < momentumCutoff & bar.Close>lastBar.Close)
                                {
                                    Order(bar.Symbol, quantity);
                                }
                            }
                        }

                    }
                }
                TradeBar bar2;
                foreach (SecurityHolding stock in Portfolio.Values)
                {
                    if (Portfolio[stock.Symbol].Quantity > 0 & lastData.ContainsKey(stock.Symbol) & Portfolio.ContainsKey(stock.Symbol) & data.ContainsKey(stock.Symbol))
                    {
                        lastBar = lastData[stock.Symbol];
                        bar2 = data[stock.Symbol];
                        if (bar2.Close < lastBar.Close)
                        {
                        	var beforeProfit = Portfolio.TotalProfit;
                            Liquidate(stock.Symbol);
                        	
                        	var orderProfit = Portfolio.TotalProfit - beforeProfit;
                        	//Log(string.Format("Sold: {0}, Profit: {1}", stock.Symbol, orderProfit));
                        	
                        	tickerProfits[stock.Symbol] += orderProfit;
                            //Order(stock.Symbol, -Portfolio[stock.Symbol].Quantity);
                        }
                    }
                }
            }
            lastData = data;
        }
        
        public override void OnEndOfAlgorithm()
        {
            Console.WriteLine("TotalProfit: {0}", Portfolio.TotalProfit);
            
            foreach(var ticker in tickerProfits)
            {
				Log(string.Format("Ticker: {0}, Total Profit: {1:n2}", ticker.Key, ticker.Value));            	
            }
        }        
    }
    
    
    public class CustomFeeModel : IFeeModel
    {
        public decimal GetOrderFee(Security security, Order order)
        {
            var fee = order.AbsoluteQuantity*0.01m;
            if (fee<5)
            {
            	fee=5;
            }
            if (fee>10)
            {
            	fee=10;
            }
            return fee/2m;
        }
    }
}