Overall Statistics
Total Trades
103
Average Win
0.05%
Average Loss
-0.04%
Compounding Annual Return
-0.024%
Drawdown
0.800%
Expectancy
-0.044
Net Profit
-0.084%
Sharpe Ratio
-0.07
Loss Rate
59%
Win Rate
41%
Profit-Loss Ratio
1.32
Alpha
0.001
Beta
-0.049
Annual Standard Deviation
0.003
Annual Variance
0
Information Ratio
-5.923
Tracking Error
0.003
Treynor Ratio
0.004
Total Fees
$0.00
namespace QuantConnect 
{   
    /*
    *   Basic Template Algorithm
    *
    *   The underlying QCAlgorithm class has many methods which enable you to use QuantConnect.
    *   We have explained some of these here, but the full base class can be found at:
    *   https://github.com/QuantConnect/Lean/tree/master/Algorithm
    */
    public class BasicTemplateAlgorithm : QCAlgorithm
    {
    	private string _symbol = "EURUSD";
    	ExponentialMovingAverage _emaFast;
    	ExponentialMovingAverage _emaSlow;
    	ExponentialMovingAverage _emaBase;
    	
    	RollingWindow<decimal> _rollingFast;
    	RollingWindow<decimal> _rollingSlow;
    	
        public override void Initialize() 
        {
        	// backtest parameters
            SetStartDate(2016, 1, 1);         
            SetEndDate(DateTime.Now);
            
            // cash allocation
            SetCash(25000);
            
            // request specific equities
            // including forex. Options and futures in beta.
            //AddEquity("SPY", Resolution.Minute);
            AddForex(_symbol, Resolution.Hour);
            
            var eightHours = new QuoteBarConsolidator(TimeSpan.FromHours(8));
            eightHours.DataConsolidated += OnEightHourBar;
            
            SetWarmUp(TimeSpan.FromDays(20));
            
            _emaFast = new ExponentialMovingAverage(10);
            _emaSlow = new ExponentialMovingAverage(20);
            _emaBase = new ExponentialMovingAverage(50);
            
            RegisterIndicator(_symbol, _emaFast, eightHours);
            RegisterIndicator(_symbol, _emaSlow, eightHours);
            RegisterIndicator(_symbol, _emaBase, eightHours);
            
            _rollingFast = new RollingWindow<decimal>(3);
            _rollingSlow = new RollingWindow<decimal>(3);
            
            //SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin);
        }

		public override void OnEndOfDay() {
			Plot("EMA", _emaFast, _emaSlow, _emaBase);
		}
		
		public void OnEightHourBar(object sender, QuoteBar bar) {
			
        	if(!_emaSlow.IsReady) return;
        	
        	_rollingFast.Add(_emaFast);
        	_rollingSlow.Add(_emaSlow);
        	
        	if(_rollingFast.Count < 3) return;
        	
        	var quantity = Portfolio[_symbol].Quantity;
        	
        	if(quantity != 0) {
        		if(quantity > 0) {
        			if(_emaFast < _emaSlow && bar.Close > _emaBase) {
	        			Debug("Exit Buy");
        				Liquidate();
        			}
        		}else {
        			if(_emaFast > _emaSlow && bar.Close < _emaBase) {
	        			Debug("Exit Sell");
        				Liquidate();
        			}
        		}
        	}
        	
        	if(quantity == 0) {
        		if(_rollingFast[0] > _rollingSlow[0]){
        			if(_rollingFast[1] < _rollingSlow[1]) {
	    				Debug("Buy");
	    				MarketOrder(_symbol, 1000);
        			}
        		}else if(_emaFast < _emaSlow && _rollingFast[1] > _rollingSlow[1]) {
    				Debug("Sell");
    				MarketOrder(_symbol, -1000);
        		}
        	}
		}
		
        /* 
        *	New data arrives here.
        *	The "Slice" data represents a slice of time, it has all the data you need for a moment.	
        */ 
        public override void OnData(Slice data) 
        {
        }
    }
}