| Overall Statistics |
|
Total Trades 17292 Average Win -0.01% Average Loss 1.59% Compounding Annual Return -89.566% Drawdown 78.000% Expectancy -0.701 Net Profit -76.944% Sharpe Ratio -9.956 Loss Rate 70% Win Rate 30% Profit-Loss Ratio -0.01 Alpha -1.557 Beta 0.097 Annual Standard Deviation 0.156 Annual Variance 0.024 Information Ratio -8.569 Tracking Error 0.19 Treynor Ratio -16.027 Total Fees $3506.16 |
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 FxcmFeeModel();
_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;
}
}
}