| Overall Statistics |
|
Total Trades 55814 Average Win 0.01% Average Loss -0.02% Compounding Annual Return -57.922% Drawdown 98.500% Expectancy -0.965 Net Profit -98.478% Sharpe Ratio -11.745 Loss Rate 97% Win Rate 3% Profit-Loss Ratio 0.37 Alpha -0.86 Beta 0.024 Annual Standard Deviation 0.073 Annual Variance 0.005 Information Ratio -7.078 Tracking Error 0.143 Treynor Ratio -35.495 Total Fees $55814.00 |
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 = "SPY";
private const string Symbol2 = "DIA";
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(2017, 04, 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) - (1.0m *((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) > (1.0m *((myOpenPrice2 - data[Symbol2].Close) / myOpenPrice2)))
{
SetHoldings(Symbol1, .1); // +
SetHoldings(Symbol2, -.1);
}
else
{
SetHoldings(Symbol1, -.1);
SetHoldings(Symbol2, .1); // +
}
}
}
else
{
if (Math.Abs(myDifference) < ((0.5m * stdDev) + Math.Abs(mySMA))){Liquidate();}
}
}
}
}