Overall Statistics
Total Trades
103
Average Win
0.78%
Average Loss
-0.48%
Compounding Annual Return
0.010%
Drawdown
7.200%
Expectancy
-0.121
Net Profit
0.005%
Sharpe Ratio
0.052
Probabilistic Sharpe Ratio
25.138%
Loss Rate
67%
Win Rate
33%
Profit-Loss Ratio
1.64
Alpha
0.042
Beta
0.31
Annual Standard Deviation
0.103
Annual Variance
0.011
Information Ratio
0.835
Tracking Error
0.149
Treynor Ratio
0.017
Total Fees
$103.00
using System.Drawing;

namespace QuantConnect {

	class BotAverageTangent
	{
		QCAlgorithm algo;
		string fund;
		Indicator indicator;
		decimal prevIndicator;
		int indicatorPeriod = 100;
		Resolution resolution = Resolution.Hour;

        public BotAverageTangent(QCAlgorithm _algo, string _fund, Resolution _resolution, int _indicatorPeriod)
        {
        	algo = _algo;
        	fund = _fund;
        	resolution = _resolution;
        	indicatorPeriod = _indicatorPeriod;
        	
			algo.AddEquity(fund, resolution);

			indicator = algo.EMA(fund, indicatorPeriod, resolution);
			
			var stockPlot = new Chart("Trade Plot");
			var assetPrice = new Series("Price", SeriesType.Line, "$", Color.Gray);
			var assetDEMA = new Series("DEMA", SeriesType.Line, "$", Color.Blue);
			var buyOrders = new Series("Buy", SeriesType.Scatter, "$", Color.Green, ScatterMarkerSymbol.Triangle);
			var sellOrders = new Series("Sell", SeriesType.Scatter, "$", Color.Red, ScatterMarkerSymbol.Diamond);
			stockPlot.AddSeries(buyOrders);
			stockPlot.AddSeries(sellOrders);
			stockPlot.AddSeries(assetPrice);
			stockPlot.AddSeries(assetDEMA);
			algo.AddChart(stockPlot);
		}

        public void OnData(Slice data)
        {
        	// Make sure our indicators aready to use.
        	if (algo.IsWarmingUp)
        		return;
        	
        	decimal fundPrice = algo.Securities[fund].Close;
    		algo.Plot("Trade Plot", "Price", fundPrice);
    		
            //if(indicator < fundPrice)
            if(indicator > prevIndicator)
            {
            	// Positive signal
    			if(!algo.Portfolio.Invested)
    			{
	    			algo.Plot("Trade Plot", "Buy", fundPrice);
	            	algo.SetHoldings(fund, 1.0);
    			}
            }
            else
            {
            	// Negative signal
    			if(algo.Portfolio[fund].Invested)
    			{
		    		algo.Plot("Trade Plot", "Sell", fundPrice);
	            	algo.Liquidate(fund);
    			}
            }
            
    		algo.Plot("Trade Plot", "DEMA", indicator);
    		prevIndicator = indicator;
    	}
		
	}
	
}
using System.Drawing;

namespace QuantConnect
{
    public partial class BootCampTask : QCAlgorithm
    {
    	private BotAverageTangent bot;
    	
		string fundA = "SPY";
		string fundB = "SH";
		int indicatorPeriod = 20;
		Resolution resolution = Resolution.Hour;

        public override void Initialize()
        {
            SetStartDate(2018, 7, 1);
            SetEndDate(2018, 12, 31);
            SetCash(10000);
            
            bot = new BotAverageTangent(this, fundA, resolution, indicatorPeriod);

			SetBenchmark(fundA);
			SetWarmUp(indicatorPeriod);
		}

        public override void OnData(Slice data)
        {
        	// Make sure our indicators aready to use.
        	if (IsWarmingUp)
        		return;
        		
        	bot.OnData(data);
    	}
        
    }
}