| Overall Statistics |
|
Total Trades 65462 Average Win 0.03% Average Loss -0.01% Compounding Annual Return 31.680% Drawdown 1.500% Expectancy 0.274 Net Profit 208.009% Sharpe Ratio 7.838 Loss Rate 58% Win Rate 42% Profit-Loss Ratio 2.06 Alpha 0.224 Beta 0.012 Annual Standard Deviation 0.029 Annual Variance 0.001 Information Ratio 1.014 Tracking Error 0.123 Treynor Ratio 18.935 Total Fees $67841.62 |
using System;
using System.Linq;
using QuantConnect.Indicators;
using QuantConnect.Models;
using MathNet.Numerics;
namespace QuantConnect.Algorithm.Examples
{
public class QCUMovingAverageCross : QCAlgorithm
{
private const string Symbol1 = "VXX";
private const string Symbol2 = "TVIX";
public int myTimeFrame = 60;
public decimal mySlippageValue = 0.0002m;
public StandardDeviation stdDev;
public SimpleMovingAverage mySMA;
public List<double> myDataList1 = new List<double>();
public List<double> myDataList2 = new List<double>();
public override void Initialize()
{
SetStartDate(2012, 06, 01);
SetEndDate(2016, 07, 01);
SetWarmup(TimeSpan.FromMinutes(myTimeFrame));
AddSecurity(SecurityType.Equity, Symbol1, Resolution.Minute);
AddSecurity(SecurityType.Equity, Symbol2, Resolution.Minute);
Securities[Symbol1].SlippageModel = new ConstantSlippageModel((decimal) mySlippageValue);
Securities[Symbol2].SlippageModel = new ConstantSlippageModel((decimal) mySlippageValue);
stdDev = new StandardDeviation(myTimeFrame);
mySMA = new SimpleMovingAverage(myTimeFrame);
}
DateTime myDate;
decimal myOpenPrice1;
decimal myOpenPrice2;
public void OnData(TradeBars data)
{
if(this.Time != myDate)
{
myDate = this.Time;
myOpenPrice1 = data[Symbol1].Open;
myOpenPrice2 = data[Symbol2].Open;
}
var myDifference = Math.Abs(((myOpenPrice1 - data[Symbol1].Close) / myOpenPrice1) - (.5m *((myOpenPrice2 - data[Symbol2].Close) / myOpenPrice2)));
stdDev.Update(this.Time, myDifference);
mySMA.Update(this.Time, myDifference);
if (!stdDev.IsReady || !mySMA.IsReady) return;
if (!Portfolio.Invested)
{
if (Math.Abs(myDifference) > ((2 * stdDev) + Math.Abs(mySMA)))
{
if(((myOpenPrice1 - data[Symbol1].Close) / myOpenPrice1) > (.5m *((myOpenPrice2 - data[Symbol2].Close) / myOpenPrice2)))
{
SetHoldings(Symbol1, .05); // +
SetHoldings(Symbol2, -.1);
}
else
{
SetHoldings(Symbol1, -.05);
SetHoldings(Symbol2, .1); // +
}
}
}
else
{
if (Math.Abs(myDifference) < ((0.5m * stdDev) + Math.Abs(mySMA))){Liquidate();}
}
}
}
}