| Overall Statistics |
|
Total Trades 5366 Average Win 0.09% Average Loss -0.15% Compounding Annual Return 14.419% Drawdown 12.300% Expectancy 0.017 Net Profit 6.552% Sharpe Ratio 0.624 Probabilistic Sharpe Ratio 37.105% Loss Rate 36% Win Rate 64% Profit-Loss Ratio 0.60 Alpha 0.051 Beta -0.246 Annual Standard Deviation 0.189 Annual Variance 0.036 Information Ratio 1.221 Tracking Error 0.318 Treynor Ratio -0.478 Total Fees $6425.71 Estimated Strategy Capacity $29000000.00 Lowest Capacity Asset BIL TT1EBZ21QWKL |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.Linq;
using QuantConnect;
using QuantConnect.Parameters;
using QuantConnect.Benchmarks;
using QuantConnect.Brokerages;
using QuantConnect.Util;
using QuantConnect.Interfaces;
using QuantConnect.Indicators;
using QuantConnect.Algorithm;
using QuantConnect.Algorithm.Framework;
using QuantConnect.Algorithm.Framework.Selection;
using QuantConnect.Algorithm.Framework.Alphas;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Algorithm.Framework.Execution;
using QuantConnect.Algorithm.Framework.Risk;
using QuantConnect.Data;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.Custom;
using QuantConnect.Data.Fundamental;
using QuantConnect.Data.Market;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Notifications;
using QuantConnect.Orders;
using QuantConnect.Orders.Fees;
using QuantConnect.Orders.Fills;
using QuantConnect.Orders.Slippage;
using QuantConnect.Scheduling;
using QuantConnect.Securities;
using QuantConnect.Securities.Equity;
using QuantConnect.Securities.Forex;
using QuantConnect.Securities.Interfaces;
using QuantConnect.Python;
using QuantConnect.Storage;
using Ind = SharpMacaco.Indicator;
using SharpMacaco.Indicator;
using SharpMacaco.Alpha.Model;
using SharpMacaco.Alpha.Decorator.Strategy.Volatility;
// using SharpMacaco.Alpha.Model.Trap;
using SharpMacaco.Alpha.Decorator.Strategy.ToccataEFuga;
using SharpMacaco.Alpha.Decorator.Strategy.ShadowLine;
// using SharpMacaco.Alpha.Model.OscillatorCross;
using SharpMacaco.Alpha.Decorator;
using SharpMacaco.DataManagement;
using SharpMacaco.RiskManagement.Model;
using SharpMacaco.RiskManagement.Decorator;
using IAlpha = SharpMacaco.Alpha.Model.IAlphaModel;
using IRisk = SharpMacaco.RiskManagement.Model.IRiskManagementModel;
namespace QuantConnect.Algorithm.CSharp
{
public class OneAlphaExampleAlgorithm : QCAlgorithm
{
private DataManager dataManager; // the place where we store and manage all shared data. We give this as a parametert to each and every alpha base
public override void Initialize()
{
SetStartDate(2022, 1, 1);
// SetEndDate(2018, 6, 1); // if commented goes until today
// Initialize data manager
dataManager = new DataManager(algorithm: this);
// Define benchmark to use
Symbol benchmarkSymbol = AddEquity("SPY").Symbol;
// DEFINE INDICATOR GENERATORS
(string id, TimeSpan resolution, Func<SingleIndicatorData<Ind.KeltnerChannels, IBaseDataBar>> generator) keltnerIndicatorInfo
= ("keltnerIndicatorInfo", TimeSpan.FromMinutes(15), () => new SingleIndicatorData<Ind.KeltnerChannels, IBaseDataBar>(
new Ind.KeltnerChannels(period: 10, k: 1M)
)
);
// crisis
(string id, TimeSpan resolution, Func<MovingAverageGroupIndicatorData> generator) crisisIndicatorInfo
= (
id: "crisisIndicator",
resolution: TimeSpan.FromDays(1),
generator: () => new MovingAverageGroupIndicatorData(
new()
{
{ "hullSlow", new MovingAverageIndicatorData(new Ind.HullMovingAverage(80)) },
{ "hullFast", new MovingAverageIndicatorData(new Ind.HullMovingAverage(25)) }
}
));
// DEFINE UNIVERSES
var universe1 = Universe.DollarVolume.Top(20);
universe1.UniverseSettings.Resolution = Resolution.Minute;
// var universe1 = new ManualUniverseSelectionModel(new[]{AddEquity("VOO").Symbol}).CreateUniverses(this).First();
// DEFINE ALPHAS
// this is the base of the pizza
var base1 = new AlphaModelBase(
resolution: TimeSpan.FromMinutes(15), // candle size is one day
universes: new() { universe1 }, // list of universes to run this alpha on. If empty, uses all universes of the algorithm.
symbolsToSkip: new() { benchmarkSymbol }, // list of assets we do not want to trade
dataManager: dataManager // we use data manager to store data
);
// let's add the tomato sauce, the first topping
// first topping is always the strategy!
AlphaDecoratorBase alpha1=new KeltnerEntryAlphaModel(
alphaModelBase:base1,
options:new(
keltnerIndicatorInfo:keltnerIndicatorInfo
)
);
alpha1=new TrailingHighLowExitAlphaDecorator(
alphaModel:alpha1,
options:new(
nrCandlesAgo:2,
nrBarsBeforeActivation:1
)
);
// alpha1=new FullProfitableCandleExitAlphaDecorator(
// alphaModel:alpha1,
// options:new(
// nrBarsBeforeActivation:1
// )
// );
alpha1 = new DistanceFromEntryStopLossAlphaDecorator(
alphaModel:alpha1,
options: new(
function: DistanceFromEntryStopLossAlphaDecorator.Fixed(
distancePercent: 2m / 100
)
,nrBarsBeforeActivation: 6
)
);
// (string id, TimeSpan resolution, Func<MovingAverageIndicatorData> generator) sma5Daily
// = ("sma5Daily", TimeSpan.FromDays(1), () => new MovingAverageIndicatorData(new Ind.SimpleMovingAverage(5)));
// (string id, TimeSpan resolution, Func<MovingAverageIndicatorData> generator) ema3Daily
// = ("ema3Daily", TimeSpan.FromDays(1), () => new MovingAverageIndicatorData(new Ind.ExponentialMovingAverage(3)));
// alpha1 = new GeneralEntryExitRulesAlphaDecorator(
// alphaModel: alpha1,
// options: new(
// exitEndOfDay: false,
// exitEndOfDayOnlyIfPofitable: false,
// strategyExitOnlyIfProfitable: false,
// allowLong: true,
// allowShort: true,
// lastMinutes: TimeSpan.FromMinutes(5),
// allowEntryOnLastMinutes: false,
// allowExitOnLastMinutes: true,
// allowExitOnSameBar: true
// )
// );
// alpha1 = new MovingAverageStopLossAlphaDecorator(
// alphaModel: alpha1,
// options: new(
// stopLossIndicatorInfo: sma5Daily,
// exitTrendIndicatorInfo: ema3Daily,
// activateOnlyIfProfitable: false,
// activateOnlyIfItFollowsExitTrend: true,
// forceAfterGapSizePercent: 5m / 100, // TODO: discuss about this parameter
// distancePercent: 3m / 100
// )
// );
// alpha1 = new CrisisRulesAlphaDecorator(
// alphaModel: alpha1,
// options: new(
// crisisIndicatorInfo: crisisIndicatorInfo
// )
// );
// DEFINE PORTFOLIO
Dictionary<string, SharpMacaco.Portfolio.AlphaDiversificationOptions> alphaDiversificationOptions
= new(){
// {rsiAlpha.Name, new(
// maxNrEntries: 5,
// maxValue: 50_000,
// period: TimeSpan.FromDays(1)
// )},
};
var portfolioModel = new SharpMacaco.Portfolio.PortfolioConstructionModel(
alphaDiversificationOptions: alphaDiversificationOptions,
startHoursToEnterPositions: 10,
endHoursToEnterPositions: 15.5,
minimumHoursBetweenTrades: 0,
oneTradePerPeriod: false,
lowestOrderLimit: 10000,
feeBudget: 1000,
highestOrderLimitPercent: 20m / 100
);
// DEFINE risk management
// // this is the base of the pizza
// var riskBase1 = new RiskManagementModelBase(
// dataManager: dataManager,
// universes: new() {} // list of universes. If empty it means it manages risk for all universes
// );
// // empty topping (Noop = No-Operation)
// IRisk riskManagementModel1 = new NoopRiskManagementDecorator(riskBase1);
// riskManagementModel1 = new CrisisRiskManagementDecorator(
// riskManagementModel1,
// new(
// indicatorInfo: crisisIndicatorInfo,
// symbols: new() { benchmarkSymbol },
// allowLongDuringBearishMarket: false,
// allowLongDuringSidewaysMarket: true,
// allowShortDuringSidewaysMarket: true,
// allowShortDuringBullishMarket: false
// ));
// DEFINE execution model
var executionModel = new SharpMacaco.Execution.ExecutionModel();
// ALGORITHM is always made of the following modules
// - universes
// - alphas
// - portfolio management
// - risk management [OPTIONAL]
// - execution management
SharpMacaco.Analysis.Charts.AddAllPlots(new(showInDashboard: false, saveInObjectStore: true));
SharpMacaco.Analysis.Charts.PlotDailyPerformance(this);
SharpMacaco.Analysis.Charts.SetUpChartingObjectStoreWrites(this);
// here we SERVE the pizza
AddUniverse(universe1);
AddAlpha(alpha1);
SetPortfolioConstruction(portfolioModel);
// AddRiskManagement(riskManagementModel1); // facultative
SetExecution(executionModel);
}
public override void OnEndOfAlgorithm() {
SharpMacaco.Analysis.Charts.WriteChartsCacheToObjectStore(this);
}
}
}