| Overall Statistics |
|
Total Trades 1518 Average Win 1.51% Average Loss -0.57% Compounding Annual Return 72.046% Drawdown 15.200% Expectancy 0.331 Net Profit 1408.893% Sharpe Ratio 2.884 Probabilistic Sharpe Ratio 99.465% Loss Rate 63% Win Rate 37% Profit-Loss Ratio 2.65 Alpha 0.782 Beta 0.03 Annual Standard Deviation 0.273 Annual Variance 0.075 Information Ratio 1.811 Tracking Error 0.328 Treynor Ratio 26.532 Total Fees $3340.39 Estimated Strategy Capacity $45000000.00 Lowest Capacity Asset AMZN R735QTJ8XC9X |
//Copyright HardingSoftware.com, 2021. Released to the public domain.
//Use entirely at your own risk.
//This algorithm contains open source code from other sources,
//no claim is being made to such code.
//Do not remove this copyright notice.
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Data.Market;
using QuantConnect.Data.UniverseSelection;
namespace QuantConnect.Algorithm.CSharp
{
public class TrendSingle : QCAlgorithm
{
string ticker = "AMZN";
Symbol symbol;
Resolution resolution=Resolution.Hour;
int period = 10;
decimal exponent = 1.5m;
List<decimal> prices = new List<decimal>();
decimal trend = 0;
public override void Initialize()
{
UniverseSettings.Resolution = resolution;
SetStartDate(2016, 6, 10);
//SetEndDate(2017, 8, 30);
SetCash(100000);
symbol = AddEquity(ticker, resolution).Symbol;
}
public void OnData(TradeBars data)
{
if (data.ContainsKey(symbol))
{
TradeBar bar=data[symbol];
prices.Add(bar.Close);
if (prices.Count > period)
{
prices.RemoveAt(0);
}
if (prices.Count == period)
{
trend = Trend(prices.ToArray(), exponent);
}
}
if (trend > 0 && Portfolio[symbol].Quantity <= 0)
{
SetHoldings(symbol, 0.99m);
}
else if (trend < 0 && Portfolio[symbol].Quantity >= 0)
{
SetHoldings(symbol, -0.99m);
}
}
public static decimal Trend(decimal[] values, decimal exponent)
{
decimal[] changes = ChangesPercent(values);
return ExponentialMovingAverage(changes, exponent);
}
public static decimal[] ChangesPercent(decimal[] values)
{
List<decimal> lOut = new List<decimal>();
for (int i = 0; i < values.Length - 1; i++)
{
lOut.Add((values[i + 1] - values[i]) / values[i]);
}
return lOut.ToArray();
}
public static decimal[] ExponentialWeights(int length, decimal exponent)
{
List<decimal> weights = new List<decimal>();
double e = Convert.ToDouble(exponent);
for (int i=0;i<length;i++)
{
double w = (double)(i + 1);
weights.Add(Convert.ToDecimal(Math.Pow(w, e)));
}
return weights.ToArray();
}
public static decimal ExponentialMovingAverage(decimal[] values, decimal exponent)
{
return WeightedAverage(values, ExponentialWeights(values.Length, exponent));
}
public static decimal WeightedAverage(decimal[] values, decimal[] weights)
{
return values.Zip(weights, (x, y) => x * y).Sum() / weights.Sum();
}
}
}