| Overall Statistics |
|
Total Trades 1852 Average Win 2.62% Average Loss -2.47% Compounding Annual Return 157.213% Drawdown 6.800% Expectancy 0.132 Net Profit 13174.994% Sharpe Ratio 9.193 Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.06 Alpha 0.944 Beta 0.062 Annual Standard Deviation 0.104 Annual Variance 0.011 Information Ratio 4.42 Tracking Error 0.181 Treynor Ratio 15.426 |
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect
{
// Name your algorithm class anything, as long as it inherits QCAlgorithm
public class ShortSPXUAlgorithm : QCAlgorithm
{
//----------------------------------------------------
// Parameters
//----------------------------------------------------
string mSymbol1 = "TMV";
string mSymbol2 = "TMF";
decimal mLeverage = 2.5m;
Consolidator TimeFrameBar = new Consolidator(TimeSpan.FromMinutes(390)); // Custom time frame bar
bool mGetOut = false;
decimal mTakeProfit = 99999999999999999.0m;
decimal mTakeProfitRatio = 1.004m; //1.004;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
SetStartDate(2010, 1, 1);
//SetEndDate(2011, 2, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(30000);
AddSecurity(SecurityType.Equity, mSymbol1, Resolution.Minute);
AddSecurity(SecurityType.Equity, mSymbol2, Resolution.Minute);
}
//Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
public void OnData(TradeBars data)
{
if(data.ContainsKey(mSymbol1) && data.ContainsKey(mSymbol2))
{
if (TimeFrameBar.Update(data[mSymbol1]))
{
if (mGetOut)
{
mGetOut = false;
mTakeProfit = Portfolio.TotalPortfolioValue * mTakeProfitRatio;
}
}
if(!mGetOut && data[mSymbol1].Time.Hour >= 15 && data[mSymbol1].Time.Minute >= 50 )
{
decimal wCash = Portfolio.Cash;
if (!mGetOut && Securities[mSymbol1].Holdings.Quantity == 0)
{
if (!mGetOut && Securities[mSymbol1].Holdings.Quantity == 0) Order(mSymbol1, (int)Math.Floor(mLeverage*0.5m*wCash / (data[mSymbol1].Close)));
if (!mGetOut && Securities[mSymbol2].Holdings.Quantity == 0) Order(mSymbol2, (int)Math.Floor(mLeverage*0.5m*wCash / (data[mSymbol2].Close)));
}
mTakeProfit = Portfolio.TotalPortfolioValue * mTakeProfitRatio;
}
if (Portfolio.TotalPortfolioValue >= mTakeProfit)
{
if(data[mSymbol1].Time.Hour >= 15 && data[mSymbol1].Time.Minute >= 50 ) mGetOut = true;
Order(mSymbol1, -Securities[mSymbol1].Holdings.Quantity);
Order(mSymbol2, -Securities[mSymbol2].Holdings.Quantity);
}
}
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect
{
/*
* TimeSpanConsolidator Helper Routine: Assemble generic timespan bar lengths: e.g. 10 minutes:
*
* 1. Setup the new Consolidator class with the timespan period:
* var _consolidator = new Consolidator(TimeSpan.FromMinutes(10));
*
* 2. Add in the data with the update routine. It will return true when bar ready
* if (_consolidator.Update(data["MSFT"])) { UseBar }
*/
public class Consolidator
{
private TradeBar _resultBar;
private TradeBar _workingBar;
private DateTime _start;
private TimeSpan _period;
//Result:
public TradeBar Bar
{
get
{
return _resultBar;
}
}
//Constructor: Set the period we'd like to scan
public Consolidator(TimeSpan span)
{
this._period = span;
this._resultBar = new TradeBar();
this._workingBar = new TradeBar(new DateTime(), "", Decimal.Zero, Decimal.MinValue, Decimal.MaxValue, 0, 0);
}
//Submit this bar, return true if we've started a new one.
public bool Update(TradeBar newBar)
{
//Intialize:
if (_start == new DateTime())
{
_start = newBar.Time;
}
//While we're less than end date, keep adding to this bar:
if (newBar.Time < (_start + _period))
{
//Building bar:
AddToBar(newBar);
return false;
}
else
{
//Completed bar: start new one:
_resultBar = _workingBar;
//Create a new bar:
_workingBar = new TradeBar(newBar.Time, newBar.Symbol, Decimal.Zero, Decimal.MinValue, Decimal.MaxValue, 0, 0);
//Start of this bar:
_start = newBar.Time;
AddToBar(newBar);
return true;
}
}
//Add to a tradebar
private void AddToBar(TradeBar newBar)
{
//Add this data to working bar:
if (_workingBar.Time == new DateTime()) _workingBar.Time = newBar.Time;
if (_workingBar.Symbol == "") _workingBar.Symbol = newBar.Symbol;
if (_workingBar.Open == Decimal.Zero) _workingBar.Open = newBar.Open;
if (newBar.High > _workingBar.High) _workingBar.High = newBar.High;
if (newBar.Low < _workingBar.Low) _workingBar.Low = newBar.Low;
_workingBar.Close = newBar.Close;
_workingBar.Volume = newBar.Volume;
}
}
}