Overall Statistics
namespace QuantConnect 
{   
    /*
    	------------------------------------------------------------------------
    	Title:	Very Simple ADX DI+ DI- Crossing algorithm
    	
    	Author:	Johannes Ferner, johannes@ferner.me
    	Date: 	Sat 4. Feb. 2017
    	------------------------------------------------------------------------
    	Description:
    	
    	The Idea is to trade the crossings of DI+ and DI- through a ADX minimum level
    	Actions are only taken if the current ADX is above a certain minimum level
    	
    	Draft:
    	- Only open new Positions if ADX Value > 20 (_minADXlevel)
    	- Open Sell Position if DI- crossed through _minADXlevel and DI+ < _minADXlevel
    	- Open Buy Position if DI+ crossed through _minADXlevel and DI- < _minADXlevel
    	
    	Next Steps:
    	- Initial StopLoss
    	- Trailing StopLoss based on some ATR Magic
    */
    public class BasicTemplateAlgorithm : QCAlgorithm
    {
    	string _symbol = "EURUSD";
    	AverageDirectionalIndex _adx;
    	QuoteBarConsolidator _consolidator;
    	decimal _minADXlevel = 20;
    	bool _firstRun = true;
    	decimal _beforeADXlevel, _beforeNegativeDirectionalIndex, _beforePositiveDirectionalIndex;

        public override void Initialize() 
        {
			
            //Start and End Date range for the backtest:
            SetStartDate(2017, 2, 1);         
            SetEndDate(DateTime.Now.Date.AddDays(-1));
            
            //Cash allocation
            SetCash(5000);
            
            // EURUSD 1:100 Leverage 1 Minute Data
            AddForex(_symbol, Resolution.Minute, Market.FXCM, true, 100m);
			//AddForex(string ticker, Resolution resolution = Resolution.Minute, string market = Market.FXCM, bool fillDataForward = true, decimal leverage = 0m)

			// Set ADX Indicator
            _adx = ADX(_symbol, 14, Resolution.Minute);

			// Setup the FiveMinutesCallback            
            _consolidator = new QuoteBarConsolidator( TimeSpan.FromMinutes(5) );
            _consolidator.DataConsolidated += FiveMinutesCallback;
            SubscriptionManager.AddConsolidator(_symbol, _consolidator);
        }
        
       
		public void Buy(TradeBars data){
			// Check for Buy-Oportunity
			Log("Current ADX: "+_adx.Current.Value + " minAdxLevel " + _minADXlevel);
        	if(_minADXlevel < _adx.Current.Value){
        		
        		Log("Should BUY EURUSD!");
        		
        		int quantity = 100; // TODO this should be something more sophisticated
                MarketOrder("EURUSD", 100);

                //Order function places trades: enter the string symbol and the quantity you want:
                Order(_symbol,  quantity); // TODO Why is this not executed?!
                MarketOrder("EURUSD", 100);
                //Debug sends messages to the user console: "Time" is the algorithm time keeper object 
                Debug("Purchased "+_symbol+" on " + Time.ToShortDateString());
        	}
		}
		
		public void Sell(TradeBars data){
			// Check for Sell-Oportunity
		}
		
        //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
        public void OnData(TradeBars data) 
        {   
        	Log("1M ADX Current "+ _adx.Current);

        	if(!_firstRun){
	        	Buy(data);
	        	Sell(data);
        	}
        	 // Set the current data to "Before"-Data of next iteration
        	_beforeADXlevel = _adx.Current.Value;
        	_beforePositiveDirectionalIndex = _adx.PositiveDirectionalIndex;
        	_beforeNegativeDirectionalIndex = _adx.NegativeDirectionalIndex;
			// Set firstRun to false in order to execute Strategy on Next Data Call
            _firstRun = false;
        	
        
        	Log("EURUSD: "+Portfolio[_symbol]);
        	if (Portfolio[_symbol].Invested) 
            {
            	Log("Portfolio holds a EURUSD share!");
            }
        	if (!Portfolio[_symbol].Invested) 
			{
				Log("Portfolio holds NO EURUSD share!");
			}
        }
        
         public void FiveMinutesCallback(Object o, QuoteBar bar) 
        {
        	// TODO check if this is Minute-Data or 5-Minute Data
            Log("5Minutes!"+Time.ToString("u") + "ADX: "+ _adx.Current+"Negative:"+ _adx.NegativeDirectionalIndex+" Positive:"+ _adx.PositiveDirectionalIndex);
        }


    }
}