| Overall Statistics |
|
Total Trades 32175 Average Win 0.04% Average Loss -0.06% Compounding Annual Return 816.692% Drawdown 2.900% Expectancy 0.096 Net Profit 316.298% Sharpe Ratio 10.604 Loss Rate 31% Win Rate 69% Profit-Loss Ratio 0.59 Alpha 1.543 Beta 0.1 Annual Standard Deviation 0.146 Annual Variance 0.021 Information Ratio 8.057 Tracking Error 0.182 Treynor Ratio 15.51 Total Fees $0.00 |
namespace QuantConnect.CSharp.Algorithms
{
public class ScalpingAlgorithm : QCAlgorithm
{
private WilliamsFractals _wf;
private string symbol = "NZDCHF";
public override void Initialize()
{
SetStartDate(2016, 1, 1);
SetEndDate(DateTime.Now);
SetCash(3000);
AddSecurity(SecurityType.Forex, symbol, Resolution.Minute);
Securities[symbol].FeeModel = new ConstantFeeModel(0.0m);
_wf = new WilliamsFractals();
}
public void OnData(TradeBars data)
{
_wf.Update(data[symbol]);
if (_wf.IsReady)
{
if (data[symbol].Price >= _wf.BarryUp)
{
SetHoldings(symbol, -1.0m);
}
else if (data[symbol].Price <= _wf.BarryDown)
{
SetHoldings(symbol, 1.0m);
}
}
}
}
}using Accord.Extensions;
using QuantConnect.Data.Market;
namespace QuantConnect.Indicators
{
public class WilliamsFractals : TradeBarIndicator
{
private readonly RollingWindow<TradeBar> _fractal;
private readonly int _fractalMidIndex;
private decimal _barryUp;
private decimal _barryDown;
public decimal BarryUp => _barryUp;
public decimal BarryDown => _barryDown;
public decimal MidPoint => (_barryUp - _barryDown) / 2m;
public override bool IsReady => _fractal.IsReady;
public WilliamsFractals(int fractalLength = 5) : this("WilliamsFractals" + fractalLength, fractalLength)
{
}
public WilliamsFractals(string name, int fractalLength = 5) : base(name)
{
_fractal = new RollingWindow<TradeBar>(fractalLength);
_fractalMidIndex = fractalLength / 2 - (fractalLength % 2 == 0 ? 1 : 0);
}
protected override decimal ComputeNextValue(TradeBar input)
{
_fractal.Add(input);
if (!_fractal.IsReady) return MidPoint;
if (_fractal.IndexOfMax((bar, index) => bar.High) == _fractalMidIndex)
{
_barryUp = input.High;
}
if (_fractal.IndexOfMin((bar, index) => bar.Low) == _fractalMidIndex)
{
_barryDown = input.Low;
}
return MidPoint;
}
}
}