Overall Statistics
Total Trades
4
Average Win
0%
Average Loss
-5.43%
Compounding Annual Return
18.196%
Drawdown
14.100%
Expectancy
-1
Net Profit
5.745%
Sharpe Ratio
0.695
Probabilistic Sharpe Ratio
41.068%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0.205
Beta
-0.049
Annual Standard Deviation
0.279
Annual Variance
0.078
Information Ratio
-0.077
Tracking Error
0.585
Treynor Ratio
-3.933
Total Fees
$4.00
using System;
using System.Linq;
using QuantConnect.Indicators;
using QuantConnect.Models;

namespace QuantConnect.Algorithm.Examples
{ 
    public class QCUMovingAverageCross : QCAlgorithm
    {
    	private string _symbol = "SPY";
    	private decimal stoploss_pcnt =0.02m;
    	private decimal profittarget_pcnt =0.02m;
        private Symbol symbol;
        private Security sym;
        private ExponentialMovingAverage ema;
        private Chart _equityChart;
        private DateTime previous;
        private bool sl_set=false;
        private bool is_above, is_below, is_above_last, is_below_last;
        private decimal entryPrice;
    	private decimal highestPrice;
    	private OrderTicket StopLoss;
        private DateTime StartDay = new DateTime(2020, 02, 29);
        private DateTime EndDay = new DateTime(2020, 06, 29);
        private int startCashAmount = 25000;
        
		string chartName1 = "Chart_1"; 

        public override void Initialize()
        {
            // set up our analysis span
            SetStartDate(StartDay);   
            SetEndDate(EndDay); 
            SetCash(startCashAmount);
            //SetBenchmark(time => 25000);

            sym = AddSecurity(SecurityType.Equity, _symbol, Resolution.Daily);
			symbol = sym.Symbol;

            ema = EMA(symbol, 20, Resolution.Daily);
            
            // chart underlying equity
            _equityChart = new Chart(chartName1);
            _equityChart.AddSeries(new Series("Plot_my2", SeriesType.Candle));
            AddChart(_equityChart);
        }

    	
        public void OnData(Slice data)
        {
            if (!ema.IsReady) return;
            var holdings = Portfolio[symbol].Quantity;
            decimal cash = Portfolio.Cash;
            
            // only once per day
            //if (previous.Date == Time.Date) return;
            
			var X = Securities[symbol];
			var close = X.Close;//price
			
			is_above = close>ema;
			is_below = close<ema;
			var cross_above= is_above && !is_above_last;
			var cross_below= is_below && !is_below_last;
			
            // we only want to go long if we're currently short or flat
            if (holdings <= 0 && cross_above )
            {
                Log("BUY  >> " + Securities[symbol].Price);
                SetHoldings(symbol, 1.0);
            	sl_set=false;
                var quantity = CalculateOrderQuantity(_symbol, 1.0);	// (int)Math.Floor(Portfolio.Cash / currentPrice);
				//var ord= 
				MarketOrder(_symbol, quantity);
				//entryPrice = ord.AverageFillPrice;
            	highestPrice=-99999.0m;
            }

            if (holdings > 0)
            {
            	if (!sl_set)
            	{
            		sl_set=true;
					StopLoss = 
					StopMarketOrder(symbol, -holdings, (1-stoploss_pcnt) *close);
					//LimitOrder(symbol, -holdings, (1+profittarget_pcnt) *close);
            	}
				
    	        if (false &&  cross_above)
	            {
	                Log("SELL >> " + close);
	                Liquidate(symbol);    
	            }
	            //
	            if ( close > highestPrice)
	            {
	            	highestPrice = close;
	            	//StopLoss.Update(new UpdateOrderFields{ StopPrice = close * (1m - stoploss_pcnt) });
	            }
            }
 
            previous = Time; //data[_symbol].Time;
            
			Plot(chartName1, "ema", ema);
			Plot("others", "holdings", holdings);
            // Candle
            _equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(1), X.Open);
            _equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(2), X.High);
            _equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(3), X.Low);
            _equityChart.Series["Plot_my2"].AddPoint(Time+ TimeSpan.FromMinutes(4), X.Close);

			is_above_last = is_above;
			is_below_last = is_below;
        }
    }
}