Overall Statistics
Total Trades
2
Average Win
58.61%
Average Loss
0%
Compounding Annual Return
11.349%
Drawdown
18.400%
Expectancy
0
Net Profit
121.798%
Sharpe Ratio
0.906
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
0.084
Beta
0.333
Annual Standard Deviation
0.128
Annual Variance
0.016
Information Ratio
0.106
Tracking Error
0.182
Treynor Ratio
0.348
Total Fees
$4.70
namespace QuantConnect 
{   
    /*
    *   QuantConnect University: Futures Example
    *
    *   QuantConnect allows importing generic data sources! This example demonstrates importing a futures
    *   data from the popular open data source Quandl.
    *
    *   QuantConnect has a special deal with Quandl giving you access to Stevens Continuous Futurs (SCF) for free. 
    *   If you'd like to download SCF for local backtesting, you can download it through Quandl.com.
    */
    public class QCUQuandlFutures : QCAlgorithm
    {
        string SPY = "SPY";
        string ACWI = "ACWI";
        string Tbill = "BIL";
        string Bonds = "AGG";

        Momentum _momSPY;
        Momentum _momACWI;
        Momentum _momTbill;
        DateTime sampledToday = DateTime.Now;
        
        

        
        public override void Initialize()
        {
            SetStartDate(2008, 6, 1);         
            SetEndDate(DateTime.Now.Date.AddDays(-1)); 
            SetCash(25000);
            
            AddSecurity(SecurityType.Equity, SPY, Resolution.Minute);
            Securities[SPY].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);            
            AddSecurity(SecurityType.Equity, ACWI, Resolution.Minute);
            Securities[ACWI].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);            
            AddSecurity(SecurityType.Equity, Tbill, Resolution.Minute);
            Securities[Tbill].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);            
            AddSecurity(SecurityType.Equity, Bonds, Resolution.Minute);
            Securities[Bonds].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);            
            
            _momSPY = MOM(SPY, 252, Resolution.Daily);
            _momACWI = MOM(ACWI, 252, Resolution.Daily);
            _momTbill = MOM(Tbill, 252, Resolution.Daily);
        }
           
        
     
        //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) 
        {
            if (!_momSPY.IsReady) return;
            
            //One data point per m:
            if (sampledToday.Month == data.Time.Month) return;
            
            //Only take one data point per day (opening price)
            sampledToday = data.Time;
            decimal holdingPercent = .5m;
            
            string etf;
            decimal _momStrong;
            
            if (_momSPY >= _momACWI)
            {
                etf = SPY;
                _momStrong = _momSPY;
            } else
            {
                etf = ACWI;
                _momStrong = _momACWI;
            }
           
            if (_momStrong > _momTbill)
            {
                if(Portfolio[etf].Quantity > 0) return;
                
                Liquidate();
                SetHoldings(etf, holdingPercent);
                Log("Set Holdings to " + Portfolio[etf].Quantity + "of " + etf);
            } else
            {
                if(Portfolio[Bonds].Quantity > 0) return;
                
                Liquidate();
                SetHoldings(Bonds, holdingPercent);
                Log("Set Holdings to " + Portfolio[Bonds].Quantity + "of " + Bonds);
            }
        }
    }
}