Overall Statistics
Total Trades
217
Average Win
0.62%
Average Loss
-0.20%
Compounding Annual Return
28.896%
Drawdown
8.000%
Expectancy
1.505
Net Profit
43.147%
Sharpe Ratio
1.517
Loss Rate
39%
Win Rate
61%
Profit-Loss Ratio
3.10
Alpha
0
Beta
0
Annual Standard Deviation
0.12
Annual Variance
0.014
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic; 
using QuantConnect.Securities;  
using QuantConnect.Models;   

namespace QuantConnect { 
    
    public partial class QCUWeatherBasedRebalancing : QCAlgorithm
    {
        //Initialize: Storage for our custom data:
        //Source: http://www.wunderground.com/history/
        //Make sure to link to the actual file download URL if using dropbox.
        //private string url = "https://www.dropbox.com/s/txgqzv2vp5lzpqc/10065.csv";
        private decimal fraction;
        private int rebalanceFrequency = 2, tradingDayCount = 0;
        private Symbol symbol = QuantConnect.Symbol.Create("CORNUSD", SecurityType.Cfd, Market.Oanda);

        ///<summary>
        /// Initialize our algorithm:
        ///</summary>
        public override void Initialize()
        {
            SetStartDate(2013, 1, 1);         
            SetEndDate(2014, 5, 31); 
            SetCash(25000);
			SetBenchmark(time => 25000);

			SetBrokerageModel(BrokerageName.OandaBrokerage);

            AddCfd(symbol, Resolution.Minute);
            AddData<Weather>("NYCTEMP", Resolution.Minute);
        }
        
        //Save the instance of the weather.
        public void OnData(Weather data)
        {
        	//Scale from -5C to +25C :: -5C == 100%, +25C = 0% invested
            fraction = -(data.MinC + 5m) / 30m;
            Plot("Weather", "Scale", fraction);
        }
        
        ///<summary>
        /// When we have a new event trigger, buy some stock:
        ///</summary>
        public void OnData(TradeBars data) 
        {   
            //Rebalance every 10 days:
            if (tradingDayCount >= rebalanceFrequency) 
            {   
                SetHoldings(symbol, fraction); 
                tradingDayCount = 0;
            }
        }
        
        ///<summary>
        /// After each trading day
        ///</summary>
        public override void OnEndOfDay() {
            tradingDayCount++;
        }
    }
    
    /// <summary>
    /// Weather based rebalancing
    /// </summary>
    public class Weather : BaseData
    {
        public decimal MaxC = 0;
        public decimal MeanC = 0;
        public decimal MinC = 0;
        public string errString = "";

        public Weather()
        {
            this.Symbol = "NYCTEMP";
        }
        
        public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLive)
        {
            return new SubscriptionDataSource("https://www.dropbox.com/s/txgqzv2vp5lzpqc/10065.csv?dl=1", SubscriptionTransportMedium.RemoteFile);
        }
        
        public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLive)
        {
        	// Header handling
            if (char.IsLetter(line[0])) return null;

            var data = line.Split(',');
            return new Weather()
            {
            	// Make sure we only get this data AFTER trading day - don't want forward bias.
                Time = DateTime.Parse(data[0]).AddHours(20),
                MaxC = Convert.ToDecimal(data[1]),
                MeanC = Convert.ToDecimal(data[2]),
                MinC = Convert.ToDecimal(data[3]),
            };
        }
    }
}