Overall Statistics |
Total Trades 50463 Average Win 0.03% Average Loss -0.06% Compounding Annual Return 642.964% Drawdown 3.300% Expectancy 0.090 Net Profit 502.965% Sharpe Ratio 10.295 Loss Rate 29% Win Rate 71% Profit-Loss Ratio 0.53 Alpha 1.403 Beta -0.011 Annual Standard Deviation 0.136 Annual Variance 0.019 Information Ratio 7.507 Tracking Error 0.178 Treynor Ratio -122.888 Total Fees $0.00 |
// Accord.NET Extensions Framework // https://github.com/dajuric/accord-net-extensions // // Copyright © Darko Jurić, 2014-2015 // darko.juric2@gmail.com // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see <https://www.gnu.org/licenses/lgpl.txt>. // using System; using System.Collections.Generic; namespace Accord.Extensions330 { /// <summary> /// <para>Defined functions can be used as object extensions.</para> /// Provides methods for finding the index of the max element in a sequence. /// </summary> public static class IndexOfMaxExtensions { /// <summary> /// Finds the index of the max element in a sequence. /// <para>Default comparer is used for a selected key.</para> /// </summary> /// <typeparam name="TSource">Collection type.</typeparam> /// <param name="collection">Collection.</param> /// <returns> /// The index of the maximum element. /// </returns> /// <exception cref="InvalidOperationException">in case when the collection is empty.</exception> public static int IndexOfMax<TSource>(this IEnumerable<TSource> collection) { return collection.IndexOfMax((x, i) => x, Comparer<TSource>.Default); } /// <summary> /// Finds the index of the max element in a sequence. /// <para>Default comparer is used for a selected key.</para> /// </summary> /// <typeparam name="TSource">Collection type.</typeparam> /// <typeparam name="TKey">Key type.</typeparam> /// <param name="collection">Collection.</param> /// <param name="selector">Key selector. Parameters are: the current element and an index of an element in the sequence.</param> /// <returns> /// The index of the maximum element. /// </returns> /// <exception cref="InvalidOperationException">in case when the collection is empty.</exception> public static int IndexOfMax<TSource, TKey>(this IEnumerable<TSource> collection, Func<TSource, int, TKey> selector) { return collection.IndexOfMax(selector, Comparer<TKey>.Default); } /// <summary> /// Finds the index of the max element in a sequence. /// </summary> /// <typeparam name="TSource">Collection type.</typeparam> /// <typeparam name="TKey">Key type.</typeparam> /// <param name="collection">Collection.</param> /// <param name="selector">Key selector. Parameters are: the current element and an index of an element in the sequence.</param> /// <param name="comparer">Comparer for the selected key type.</param> /// <returns> /// The index of the maximum element. /// </returns> /// <exception cref="InvalidOperationException">in case when the collection is empty.</exception> public static int IndexOfMax<TSource, TKey>(this IEnumerable<TSource> collection, Func<TSource, int, TKey> selector, IComparer<TKey> comparer) { int idx = 0; int idxOfMax = 0; using (var sourceIterator = collection.GetEnumerator()) { if (!sourceIterator.MoveNext()) throw new InvalidOperationException("Sequence contains no elements"); var minKey = selector(sourceIterator.Current, idx); while (sourceIterator.MoveNext()) { idx++; var item = sourceIterator.Current; var key = selector(item, idx); if (comparer.Compare(key, minKey) > 0) { minKey = key; idxOfMax = idx; } } return idxOfMax; } } } }
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.Extensions330; 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; } } }
// Accord.NET Extensions Framework // https://github.com/dajuric/accord-net-extensions // // Copyright © Darko Jurić, 2014-2015 // darko.juric2@gmail.com // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see <https://www.gnu.org/licenses/lgpl.txt>. // using System; using System.Collections.Generic; namespace Accord.Extensions330 { /// <summary> /// Contains extension methods for determining the index of the minimum element in collection. /// <para>All methods can be used as extensions.</para> /// </summary> public static class IndexOfMinExtensions { /// <summary> /// Finds the index of the min element in a sequence. /// <para>Default comparer is used for a selected key.</para> /// </summary> /// <typeparam name="TSource">Collection type.</typeparam> /// <param name="collection">Collection.</param> /// <returns> /// The index of the minimum element. /// </returns> /// <exception cref="InvalidOperationException">in case when the collection is empty.</exception> public static int IndexOfMin<TSource>(this IEnumerable<TSource> collection) { return collection.IndexOfMin((x, i) => x, Comparer<TSource>.Default); } /// <summary> /// Finds the index of the min element in a sequence. /// <para>Default comparer is used for a selected key.</para> /// </summary> /// <typeparam name="TSource">Collection type.</typeparam> /// <typeparam name="TKey">Key type.</typeparam> /// <param name="collection">Collection.</param> /// <param name="selector">Key selector. Parameters are: the current element and an index of an element in the sequence.</param> /// <returns> /// The index of the minimum element. /// </returns> /// <exception cref="InvalidOperationException">in case when the collection is empty.</exception> public static int IndexOfMin<TSource, TKey>(this IEnumerable<TSource> collection, Func<TSource, int, TKey> selector) { return collection.IndexOfMin(selector, Comparer<TKey>.Default); } /// <summary> /// Finds the index of the min element in a sequence. /// </summary> /// <typeparam name="TSource">Collection type.</typeparam> /// <typeparam name="TKey">Key type.</typeparam> /// <param name="collection">Collection.</param> /// <param name="selector">Key selector. Parameters are: the current element and an index of an element in the sequence.</param> /// <param name="comparer">Comparer for the selected key type.</param> /// <returns> /// The index of the minimum element. /// </returns> /// <exception cref="InvalidOperationException">in case when the collection is empty.</exception> public static int IndexOfMin<TSource, TKey>(this IEnumerable<TSource> collection, Func<TSource, int, TKey> selector, IComparer<TKey> comparer) { int idx = 0; int idxOfMin = 0; using (var sourceIterator = collection.GetEnumerator()) { if (!sourceIterator.MoveNext()) throw new InvalidOperationException("Sequence contains no elements"); var minKey = selector(sourceIterator.Current, idx); while (sourceIterator.MoveNext()) { idx++; var item = sourceIterator.Current; var key = selector(item, idx); if (comparer.Compare(key, minKey) < 0) { minKey = key; idxOfMin = idx; } } return idxOfMin; } } } }