| Overall Statistics |
|
Total Trades 360 Average Win 3.10% Average Loss -1.21% Annual Return 260.961% Drawdown 10.400% Expectancy 0.941 Net Profit 4324.802% Sharpe Ratio 1.248 Loss Rate 46% Win Rate 54% Profit-Loss Ratio 2.56 Alpha 0.167 Beta 0.001 Annual Standard Deviation 0.134 Annual Variance 0.018 Information Ratio 0.508 Tracking Error 0.217 Treynor Ratio 145.667 |
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;
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
/// <summary>
/// Custom Data Type: USD/INR data from Quandl
/// http://www.quandl.com/BNP/USDINR-Currency-Exchange-Rate-USD-vs-INR
/// </summary>
public class DollarRupee : BaseData
{
public decimal Open = 0;
public decimal High = 0;
public decimal Low = 0;
public decimal Close = 0;
public DollarRupee()
{
this.Symbol = "USDINR";
}
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return "https://www.dropbox.com/s/w71phighrsh8uu0/USDINR.csv?dl=1";
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
//New USDINR object
DollarRupee currency = new DollarRupee();
try
{
string[] data = line.Split(',');
//Dates must be in the format YYYY-MM-DD. If your data source does not have this format, you must use
//DateTime.ParseExact() and explicit declare the format your data source has.
currency.Time = DateTime.Parse(data[0]);
currency.Close = Convert.ToDecimal(data[1]);
currency.Symbol = "USDINR";
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
{
/// <summary>
/// 3.0 CUSTOM DATA SOURCE: USE YOUR OWN MARKET DATA (OPTIONS, FOREX, FUTURES, DERIVATIVES etc).
///
/// The new QuantConnect Lean Backtesting Engine is incredibly flexible and allows you to define your own data source.
///
/// This includes any data source which has a TIME and VALUE. These are the *only* requirements. To demonstrate this we're loading
/// in "Nifty" data. This by itself isn't special, the cool part is next:
///
/// We load the "Nifty" data as a tradable security we're calling "NIFTY".
///
/// </summary>
public partial class CustomDataSourceAlgorithm : QCAlgorithm
{
//Create variables for analyzing Nifty
CorrelationPair today = new CorrelationPair();
List<CorrelationPair> prices = new List<CorrelationPair>();
int minimumCorrelationHistory = 11;
public override void Initialize()
{
SetStartDate(1998, 1, 1);
SetEndDate(2014, 7, 25);
//Set the cash for the strategy:
SetCash(100000);
//Define the symbol and "type" of our generic data:
AddData<DollarRupee>("USDINR");
AddData<Nifty>("NIFTY");
}
public void OnData(DollarRupee data)
{
today = new CorrelationPair(data.Time);
today.Add("USDINR", data.Close);
}
public void OnData(Nifty data)
{
try
{
today.Add("NIFTY", 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 Nifty
public override void OnEndOfDay()
{
if (today.Prices.ContainsKey("NIFTY"))
{
if(today.Prices["NIFTY"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday)
{
Plot("NIFTY", today.Prices["NIFTY"]);
}
if(today.Prices["USDINR"] != 0 && today.Date.DayOfWeek == DayOfWeek.Wednesday)
{
Plot("USDINR", today.Prices["USDINR"]);
}
}
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
/// <summary>
/// Custom Data Type: CNX Nifty data from NSE
/// http://www.nseindia.com/
/// </summary>
public class Nifty : BaseData
{
public decimal Open = 0;
public decimal High = 0;
public decimal Low = 0;
public decimal Close = 0;
public Nifty()
{
this.Symbol = "NIFTY";
}
public override string GetSource(SubscriptionDataConfig config, DateTime date, DataFeedEndpoint datafeed)
{
return "https://www.dropbox.com/s/9dzb6spi38rweit/CNXNIFTY.csv?dl=1";
}
public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, DataFeedEndpoint datafeed)
{
//New Nifty object
Nifty index = new Nifty();
try
{
//Example File Format:
//Date, Open High Low Close Volume Turnover
//2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 6107.78
string[] data = line.Split(',');
//Dates must be in the format YYYY-MM-DD. If your data source does not have this format, you must use
//DateTime.ParseExact() and explicit declare the format your data source has.
index.Time = DateTime.Parse(data[0]);
index.Open = Convert.ToDecimal(data[1]);
index.High = Convert.ToDecimal(data[2]);
index.Low = Convert.ToDecimal(data[3]);
index.Close = Convert.ToDecimal(data[4]);
index.Symbol = "NIFTY";
//We need to de
index.Value = index.Close;
}
catch {
}
return index;
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
using System.Linq;
using MathNet.Numerics.Statistics;
namespace QuantConnect {
/// <summary>
/// Make a list of common dates to hold price data
/// </summary>
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>();
}
}
}