| Overall Statistics |
|
Total Trades 240 Average Win 1.76% Average Loss -0.69% Compounding Annual Return 12.835% Drawdown 30.400% Expectancy 1.839 Net Profit 451.332% Sharpe Ratio 0.848 Loss Rate 20% Win Rate 80% Profit-Loss Ratio 2.56 Alpha 0.229 Beta -7.402 Annual Standard Deviation 0.127 Annual Variance 0.016 Information Ratio 0.718 Tracking Error 0.127 Treynor Ratio -0.015 Total Fees $0.00 |
namespace QuantConnect
{
public class BasicTemplateAlgorithm : QCAlgorithm
{
public string[] Symbols = {"SPY","TLT","GLD"};
private Dictionary<string, RelativeStrengthIndex> rsi = new Dictionary<string, RelativeStrengthIndex>();
private Dictionary<string, SimpleMovingAverage> smoothedRSI = new Dictionary<string, SimpleMovingAverage>();
RollingWindow<string> TopSymbol;
RollingWindow<string> BottomSymbol;
public int SmoothLen = 120;
public decimal Max = .5m;
public decimal Mid = .3m;
public decimal Min = .2m;
public decimal Lev = 1.5m;
public override void Initialize()
{
SetStartDate(2004, 1, 1);
SetEndDate(DateTime.Now);
SetCash(10000000);
foreach (var symbol in Symbols)
{
AddSecurity(SecurityType.Equity,symbol,Resolution.Daily);
rsi[symbol]=RSI(symbol, 14, MovingAverageType.Wilders);
smoothedRSI[symbol]=new SimpleMovingAverage(SmoothLen).Of(rsi[symbol]);
Securities[symbol].FeeModel = new ConstantFeeTransactionModel(0);
Securities[symbol].SetLeverage(5);
var history = History(symbol, SmoothLen+15);
foreach (var tradeBar in history)
{
rsi[symbol].Update(tradeBar.EndTime, tradeBar.Close);
smoothedRSI[symbol].Update(tradeBar.EndTime, rsi[symbol]);
}
}
TopSymbol = new RollingWindow<string>(2);
BottomSymbol = new RollingWindow<string>(2);
}
public void OnData(TradeBars data)
{
foreach (var symbol in Symbols){if (!data.ContainsKey(symbol)) return;}
DateTime Track = Time;
//////////// Entry Shit /////////////
var MaxMomentum = Math.Max(smoothedRSI["SPY"], Math.Max(smoothedRSI["TLT"], smoothedRSI["GLD"]));
var MinMomentum = Math.Min(smoothedRSI["SPY"], Math.Min(smoothedRSI["TLT"], smoothedRSI["GLD"]));
string TopTicker = "SPY";
if (smoothedRSI["TLT"] == MaxMomentum){TopTicker = "TLT";} else if (smoothedRSI["GLD"] == MaxMomentum){TopTicker = "GLD";}
TopSymbol.Add(TopTicker); if(!TopSymbol.IsReady) return;
string BottomTicker = "SPY";
if (smoothedRSI["TLT"] == MinMomentum){BottomTicker = "TLT";} else if (smoothedRSI["GLD"] == MinMomentum){BottomTicker = "GLD";}
BottomSymbol.Add(BottomTicker); if(!BottomSymbol.IsReady) return;
string MiddleTicker = "SPY";
foreach (var symbol in Symbols){if (symbol != TopTicker && symbol != BottomTicker){MiddleTicker = symbol;}}
if (TopSymbol[0]!=TopSymbol[1] || BottomSymbol[0]!=BottomSymbol[1] || !Portfolio.Invested)
{
SetHoldings(TopTicker, Max*Lev, false, "Overweight " + TopTicker);
SetHoldings(MiddleTicker, Mid*Lev, false, "Equalweight " + MiddleTicker);
SetHoldings(BottomTicker, Min*Lev, false, "Underweight " + BottomTicker);
}
}
}
}