Overall Statistics
Total Trades
1055
Average Win
0.84%
Average Loss
-0.48%
Compounding Annual Return
-87.310%
Drawdown
100.000%
Expectancy
0.816
Net Profit
-99.842%
Sharpe Ratio
-0.847
Loss Rate
34%
Win Rate
66%
Profit-Loss Ratio
1.76
Alpha
-0.845
Beta
-0.342
Annual Standard Deviation
1.02
Annual Variance
1.041
Information Ratio
-0.895
Tracking Error
1.03
Treynor Ratio
2.529
Total Fees
$36939.09
using System;
using System.Collections.Generic;
using QuantConnect.Data.Consolidators;
using QuantConnect.Indicators;
using QuantConnect.Data.Market;

namespace QuantConnect 
{   
    public class BasicTemplateAlgorithm : QCAlgorithm
    {	
    	TradeBar _eurusdHourly;
        int warmupCount = 0;
        string symbol = "EURUSD";
        int state;
        decimal current = 0;
        decimal previous = 0;
        Chart plotter;
        bool hasData = false;
        
        private RollingWindow<TEMAState> _win;
        private TripleExponentialMovingAverage _tema;
        
        //Initialize the data and resolution you require for your strategy:
        public override void Initialize() 
        {
        	//0 = default, -1 = short, 1 = long
        	int state = 0;
        	//Start and End Date range for the backtest:
            SetStartDate(2014, 1, 1);  
            SetEndDate(DateTime.Now.Date.AddDays(-1));
            
            //add security
			AddSecurity(SecurityType.Forex, symbol, Resolution.Hour);
			_win = new RollingWindow<TEMAState>(3);
            _tema = TEMA(symbol, 20);
			
            //Cash allocation
            SetCash(25000);
            
            //set brokerage model
            SetBrokerageModel(BrokerageName.OandaBrokerage);
            
            
            plotter = new Chart("Plotter");
            plotter.AddSeries(new Series("current", SeriesType.Line, index:0));
            plotter.AddSeries(new Series("previous", SeriesType.Line, index:0));
            plotter.AddSeries(new Series("Long", SeriesType.Scatter, index:1));
            plotter.AddSeries(new Series("Short", SeriesType.Scatter, index:1));
            AddChart(plotter);
        }
		
		//hourly data handler
		public void OnData(TradeBars data)
        {
        	Debug("test");
        	if (_tema.IsReady) _win.Add(new TEMAState(_tema));
        	if (!_win.IsReady) return;
        	//warm up some more hours of good data
        	if(warmupCount != 4){
        		warmupCount++;
        		Debug("still warming up");
        		return;
        	}
            current  = _win[0].Value;
            previous = _win[2].Value;
            hasData = true;
            
            if(current > previous){
            	goLong(data);
            	return;
            }else if(current < previous){
            	goShort(data);
            	return;
            }else{
            	return;
            }
        }
		
        
        public void goLong(TradeBars data){
        	//check if it's already going long
        	if(state == 1){
        		return;
        	}
        	state = 1;
        	Debug("Going long!");
		//	decimal current  = _win[0].Value;
          //  decimal previous = _win[2].Value;
            //Debug("Current: " + current + " Previous: " + previous);
            
            Plot("Plotter", "Long", current);
			SetHoldings(symbol, -25.0);
        }
        
        public void goShort(TradeBars data){
        	//check if it's already going short
        	if(state == -1){
        		return;
        	}
        	state = -1;
        	Debug("Going short!");
		//	decimal current  = _win[0].Value;
          //  decimal previous = _win[2].Value;
            //Debug("Current: " + current + " Previous: " + previous);
            Plot("Plotter", "Short", current);
			SetHoldings(symbol, 25.0);
        }
        
        
        public override void OnEndOfDay() 
        {
        	if (hasData)
        	{
	        	Plot("Plotter", "current", current);
	        	Plot("Plotter", "previous", previous);
        	}
        	
        }
        
        
        public class TEMAState
        {
            public readonly decimal Value;
            public TEMAState(TripleExponentialMovingAverage tema)
    		{
        		Value = tema.Current;
    		}
		}
   
    }
}