| Overall Statistics |
|
Total Trades 727 Average Win 0.49% Average Loss -0.26% Compounding Annual Return 4.340% Drawdown 6.200% Expectancy 0.060 Net Profit 5.821% Sharpe Ratio 0.468 Loss Rate 63% Win Rate 37% Profit-Loss Ratio 1.89 Alpha 0.031 Beta 0.008 Annual Standard Deviation 0.068 Annual Variance 0.005 Information Ratio -0.412 Tracking Error 0.118 Treynor Ratio 4.13 Total Fees $1454.00 |
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Market;
namespace QuantConnect.Algorithm.Examples
{
public class RenkoConsolidatorAlgorithm : QCAlgorithm
{
RollingWindow<decimal> _price = new RollingWindow<decimal>(2);
RollingWindow<decimal> _L0 = new RollingWindow<decimal>(2);
RollingWindow<decimal> _L1 = new RollingWindow<decimal>(2);
RollingWindow<decimal> _L2 = new RollingWindow<decimal>(2);
RollingWindow<decimal> _L3 = new RollingWindow<decimal>(2);
RollingWindow<decimal> _l = new RollingWindow<decimal>(2);
decimal L0;
decimal L1;
decimal L2;
decimal L3;
SimpleMovingAverage _sma;
StandardDeviation _sd;
string _symbol = "EURUSD";
decimal prevClose;
DateTime lastTradeTime;
decimal _delta;
decimal _laguerre;
//parameters
decimal _gamma = 0.07m;
int period = 50;
public override void Initialize()
{
SetStartDate(2014, 01, 01);
SetEndDate(2015, 05, 01);
SetCash(25000);
//add securities
AddSecurity(SecurityType.Forex, _symbol, Resolution.Minute, true, 50, true);
// break SPY into $2.5 renko bricks and send that data to our 'OnRenkoBar' method
var renkoClose = new RenkoConsolidator(0.002m);
renkoClose.DataConsolidated += (sender, consolidated) =>
{
// call our event handler for renko data
HandleRenkoClose(consolidated);
};
// register the consolidator for updates
SubscriptionManager.AddConsolidator(_symbol, renkoClose);
_sma = new SimpleMovingAverage(period);
_sd = new StandardDeviation(period);
}
// OnData
public void OnData(TradeBars data)
{
}
// OnData
public void HandleRenkoClose(RenkoBar data)
{
_price.Add((data.High + data.Low)/2m);
if(!_price.IsReady) return;
//Lagerre calculations
_L0.Add(L0);
if(!_L0.IsReady) return;
L0 = (1.0m - _gamma)*_price[0] + _gamma*_L0[1];
//if(_L0.Count < 2) return;
_L1.Add(L1);
if(!_L1.IsReady) return;
L1 = -_gamma*L0 + _L0[1] + _gamma*_L1[1];
_L2.Add(L2);
if (!_L2.IsReady) return;
L2 = -_gamma*L1 + _L1[1] + _gamma*_L2[1];
_L3.Add(L3);
if (!_L3.IsReady) return;
L3 = -_gamma*L2 + _L2[1] + _gamma*_L3[1];
decimal CU = 0;
decimal CD = 0;
if (_L0[0] >= _L1[0])
{
CU = _L0[0] - _L1[0];
} else
{
CD = _L1[0] - _L0[0];
}
if (_L1[0] >= _L2[0])
{
CU = CU + _L1[0] - _L2[0];
} else
{
CD = CD + _L2[0] - _L1[0];
}
if(_L2[0] >= _L3[0])
{
CU = CU + _L2[0] - _L3[0];
} else
{
CD = CD + _L3[0] - _L2[0];
}
if((CU + CD) != 0)
{
_laguerre = (_L0[0] + 2 * _L1[0] + 2 * _L2[0] + _L3[0]) / 6m;
}
_l.Add(_laguerre);
if(!_l.IsReady) return;
Plot("Indicators", "Laguerre", _laguerre*1000);
Plot("Indicators", "Price", _price[0]*1000);
//_sma.Update(data.Time, (data.Close-prevClose));
//_sd.Update(data.Time, (data.Close-prevClose));
//exits
if(_l[0] != 0)
{
//if(Portfolio[symbol].Invested && (data.Time-lastTradeTime).TotalDays > 1)
if(Portfolio[_symbol].IsLong && _price[0] < _l[0])
{
Liquidate();
}
if(Portfolio[_symbol].IsShort && _price[0] > _l[0])
{
Liquidate();
}
//entries
if(!Portfolio[_symbol].Invested && _price[0] > _l[0])
{
SetHoldings(data.Symbol, 1);
lastTradeTime = data.Time;
}
if(!Portfolio[_symbol].Invested && _price[0] < _l[0])
{
SetHoldings(data.Symbol, -1);
lastTradeTime = data.Time;
}
}
//System.Console.WriteLine("CLOSE - {0} - {1} {2}", data.Time.ToString("o"), data.Open, data.Close);
//prevClose = data.Close;
}
/// <summary>
/// This function is called by our renko7bar onsolidator defined in Initialize()
/// </summary>
/// <param name="data">The new renko bar produced by the consolidator</param>
public void HandleRenko7Bar(RenkoBar data)
{
//System.Console.WriteLine("7BAR - {0} - {1} {2}", data.Time.ToString("o"), data.Open, data.Close);
}
}
}