Overall Statistics
Total Trades
948
Average Win
1.34%
Average Loss
-0.74%
Compounding Annual Return
17.019%
Drawdown
13.000%
Expectancy
0.364
Net Profit
1054.401%
Sharpe Ratio
1.448
Loss Rate
51%
Win Rate
49%
Profit-Loss Ratio
1.80
Alpha
0.158
Beta
0.003
Annual Standard Deviation
0.109
Annual Variance
0.012
Information Ratio
0.397
Tracking Error
0.229
Treynor Ratio
47.988
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Globalization;

namespace QuantConnect {

    public class DollarRupee : BaseData
    {
        public decimal Open = 0;
        public decimal High = 0;
        public decimal Low = 0;
        public decimal Close = 0;

        public DollarRupee()
        {
            this.Symbol = "USDCLP";
        }
        
        public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
        {
            return "https://www.dropbox.com/s/it25fk3fe3s10de/USDCLP.csv?dl=1";
        }
        
        public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
        {
            DollarRupee currency = new DollarRupee();

            try
            {
                string[] data = line.Split(',');
                currency.Time = DateTime.ParseExact(data[0], "dd-MM-yyyy", CultureInfo.InvariantCulture);
                currency.Close = Convert.ToDecimal(data[3]);
                currency.Open = Convert.ToDecimal(data[3]);
                currency.Symbol = "USDCLP";
                currency.Value = currency.Close;
            }
            catch {
                
            }

            return currency;
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Linq;
using MathNet.Numerics.Statistics;

namespace QuantConnect
{
    public partial class CustomDataSourceAlgorithm : QCAlgorithm
    {
        CorrelationPair today = new CorrelationPair();
        List<CorrelationPair> prices = new List<CorrelationPair>();
        int minimumCorrelationHistory = 3;
        
        public override void Initialize()
        {
            SetStartDate(1999, 1, 4);
            SetEndDate(2014, 7, 25);

            //Set the cash for the strategy:
            SetCash(100000);

            //Define the symbol and "type" of our generic data:
            AddData<Currency>("USDCLP");
            AddData<Index>("IPSA");
        }
        

        public void OnData(Currency data)
        {
            today = new CorrelationPair(data.Time);
            today.Add("USDCLP", data.Open);
        }

        
        public void OnData(Index data)
        {
            try
            {
                today.Add("IPSA", data.Close);
                if (today.Date == data.Time)
                {
                    prices.Add(today);
                    
                    if(prices.Count > minimumCorrelationHistory)
                    {
                        prices.RemoveAt(0);    
                    }
                }
                
                if (prices.Count < 2)
                {
                    return;
                }
                
                string maxAsset = "";
                double maxGain = -9999;
                
                foreach(string i in today.Prices.Keys)
                {
                    double last = (from pair in prices select pair.Prices[i]).Last();
                    double first = (from pair in prices select pair.Prices[i]).First();
                    double gain = (last - first) / first;
                    if (gain > maxGain)
                    {
                        maxAsset = i;
                        maxGain = gain;
                    }
                }
                
                //Strategy
                if (maxAsset != "") 
                {
                    CustomSetHoldings(maxAsset, 1, true);
                }
            }
            catch(Exception err)
            {
                Debug( "Error: " + err.Message );
            }
        }
       
        //Plot Index
        public override void OnEndOfDay()
        {
            if (today.Prices.ContainsKey("IPSA")) 
            {
                if(today.Prices["IPSA"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday)
                {
                    Plot("IPSA", today.Prices["IPSA"]);
                }
                if(today.Prices["USDCLP"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday)
                {
                    Plot("USDCLP", today.Prices["USDCLP"]);
                }
            }
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Linq;
using MathNet.Numerics.Statistics;

namespace QuantConnect {

    public class CorrelationPair
    {
        public DateTime Date = new DateTime();
        public Dictionary<string, double> Prices = new Dictionary<string, double>();
        
        public CorrelationPair()
        {
            Prices = new Dictionary<string, double>();
            Date = new DateTime();
        }
        
        public void Add(string symbol, decimal price)
        {
            Prices.Add(symbol, Convert.ToDouble(price));
        }
        
        public CorrelationPair(DateTime date)
        {
            Date = date.Date;
            Prices = new Dictionary<string, double>();
        }

    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Globalization;

namespace QuantConnect {

    public class Currency : BaseData
    {
        public decimal Open = 0;
        public decimal High = 0;
        public decimal Low = 0;
        public decimal Close = 0;

        public Currency()
        {
            this.Symbol = "USDCLP";
        }
        
        public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
        {
            return "https://www.dropbox.com/s/it25fk3fe3s10de/USDCLP.csv?dl=1";
        }
        
        public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
        {
            Currency currency = new Currency();

            try
            {
                string[] data = line.Split(',');
                currency.Time = DateTime.ParseExact(data[0], "dd-MM-yyyy", CultureInfo.InvariantCulture);
                currency.Close = Convert.ToDecimal(data[3]);
                currency.Open = Convert.ToDecimal(data[3]);
                currency.Symbol = "USDCLP";
                currency.Value = currency.Close;
            }
            catch {
                
            }

            return currency;
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Globalization;

namespace QuantConnect {    

    public class Index : BaseData
    {
        public decimal Close = 0;

        public Index()
        {
            this.Symbol = "IPSA";
        }
        
        public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
        {
            return "https://www.dropbox.com/s/k2yixqaw7cmt57b/IPSA.csv?dl=1";
        }
        
        public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
        {
            Index index = new Index();
            try
            {
                string[] data = line.Split(',');
                index.Time = DateTime.ParseExact(data[0], "dd-MM-yyyy", CultureInfo.InvariantCulture);
                index.Close = Convert.ToDecimal(data[1]);
                index.Symbol = "IPSA";
                index.Value = index.Close;
            }
            catch {
                
            }

            return index;
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;

namespace QuantConnect {

    /// <summary>
    ///  vvvvvv UPDATE TO YOUR CORE ALGORITHM CLASS NAME HERE: vvvv   "QCUMartingalePositionSizing" ==> "MyAlgorithm"
    /// </summary>
    public partial class CustomDataSourceAlgorithm : QCAlgorithm
    {

        public void CustomSetHoldings(string symbol, decimal percentage, bool liquidateExistingHoldings = false) {
            
            decimal cash = Portfolio.Cash;
            decimal currentHoldingQuantity = Portfolio[symbol].Quantity;
            
            //Range check values:
            if (percentage > 1) percentage = 1;
            if (percentage < -1) percentage = -1;
            
            //If they triggered a liquidate
            if (liquidateExistingHoldings) {
                foreach (string holdingSymbol in Portfolio.Keys) {
                    if (holdingSymbol != symbol) {
                        //Go through all existing holdings, market order the inverse quantity
                        Order(holdingSymbol,  -Portfolio[holdingSymbol].Quantity);
                    }
                }
            }
            
            //Now rebalance the symbol requested:
            decimal targetHoldingQuantity = Math.Floor((percentage * Portfolio.TotalPortfolioValue) / Securities[symbol].Price);
            
            decimal netHoldingQuantity = targetHoldingQuantity - currentHoldingQuantity;
            if (Math.Abs(netHoldingQuantity) > 0) {
                Order(symbol, (int)netHoldingQuantity);
            }
            
            return;
        }
    }
}