| Overall Statistics |
|
Total Trades 7619 Average Win 112.80% Average Loss 0% Compounding Annual Return 37.762% Drawdown 68.700% Expectancy 0 Net Profit 2369.988% Sharpe Ratio 0.71 Probabilistic Sharpe Ratio 11.432% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.586 Beta -0.009 Annual Standard Deviation 0.826 Annual Variance 0.682 Information Ratio 0.671 Tracking Error 0.854 Treynor Ratio -67.458 Total Fees $34126.95 |
using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Data;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Indicators;
using QuantConnect.Securities;
using QuantConnect.Orders;
namespace QuantConnect.Algorithm.Framework.Alphas
{
public class Algorithm_YM : NullAlphaModel
{
public RollingWindow<decimal> BidPriceYM = new RollingWindow<decimal>(3);
public RollingWindow<decimal> AskPriceYM = new RollingWindow<decimal>(3);
public RollingWindow<decimal> VolumeYM = new RollingWindow<decimal>(3);
private readonly Symbol _symbol;
public Algorithm_YM(Symbol symbol)
{
_symbol = symbol;
}
public OrderTicket EntryOrder_Long_YY_YM { get; set; }
public OrderTicket Stop_Long_YY_YM { get; set; }
public OrderTicket Limit_Long_YY_YM { get; set; }
public OrderTicket EntryOrder_Long_Y_YM { get; set; }
public OrderTicket Stop_Long_Y_YM { get; set; }
public OrderTicket Limit_Long_Y_YM { get; set; }
public OrderTicket EntryOrder_Short_YY_YM { get; set; }
public OrderTicket Stop_Short_YY_YM { get; set; }
public OrderTicket Limit_Short_YY_YM { get; set; }
public OrderTicket EntryOrder_Short_Y_YM { get; set; }
public OrderTicket Stop_Short_Y_YM { get; set; }
public OrderTicket Limit_Short_Y_YM { get; set; }
public QCAlgorithm algorithm {get; set;}
public void OnOrderEvent(OrderEvent orderEvent)
{
if (!orderEvent.Status.IsFill()) return;
if (EntryOrder_Long_YY_YM != null ||
EntryOrder_Long_Y_YM != null ||
EntryOrder_Short_YY_YM != null ||
EntryOrder_Short_Y_YM != null)
{
var orderId = orderEvent.OrderId;
var orderId_EntryOrder_Long_YY_YM = EntryOrder_Long_YY_YM.OrderId;
var orderId_EntryOrder_Long_Y_YM = EntryOrder_Long_Y_YM.OrderId;
var orderId_EntryOrder_Short_YY_YM = EntryOrder_Short_YY_YM.OrderId;
var orderId_EntryOrder_Short_Y_YM = EntryOrder_Short_Y_YM.OrderId;
var order_ES = orderEvent.Symbol.StartsWith("YM");
var orderFill = orderEvent.FillPrice;
if (orderId == orderId_EntryOrder_Long_YY_YM)
{
var FillPrice_EntryOrder_Long_YY_YM = orderEvent.FillPrice;
var Symbol = orderEvent.Symbol;
var Quantity = 100;
OrderTicket Limit_Long_YY_YM = algorithm.MarketOrder(Symbol, Quantity, true, "Entry OnOrderEvent YM Test: ");
}
}
}
public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
{
var accountCurrencyCash = algorithm.Portfolio.TotalPortfolioValue;
foreach(var chain in data.FutureChains)
{
// remplacer les lettre entre guillemet par l'abreviation correspondant au contract analysé.
if (chain.Value.Symbol.StartsWith("YM"))
{
var YM = (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > algorithm.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
if (YM != null)
{
BidPriceYM.Add(YM.BidPrice);
AskPriceYM.Add(YM.AskPrice);
VolumeYM.Add(YM.Volume);
if (!BidPriceYM.IsReady || !AskPriceYM.IsReady || !VolumeYM.IsReady)
continue;
if (YM.BidPrice != 0 && YM.AskPrice != 0)
{
var _quantityy = (decimal)(VolumeYM[0]+VolumeYM[1]) * 0.001m;
if (BidPriceYM[0]>AskPriceYM[1])
{
EntryOrder_Long_YY_YM = algorithm.MarketOrder(YM.Symbol, _quantityy, false, "Entry");
break;
}
if (AskPriceYM[0]<BidPriceYM[1])
{
EntryOrder_Long_Y_YM = algorithm.MarketOrder(YM.Symbol, _quantityy, false, "Entry");
break;
}
}}}
}
return Enumerable.Empty<Insight>();
}
}
}namespace QuantConnect.Algorithm.Framework.Alphas
{
public static class VarES
{
public const decimal minprizefluct = 0.25m ;
public const decimal TPLong = 1.001m ;
public const decimal SLLong = 0.972m ;
public const decimal TPShort = 1.001m ;
public const decimal SLShort = 0.972m ;
}
}namespace QuantConnect.Algorithm.Framework.Alphas
{
public static class VarYM
{
public const decimal minprizefluct = 1m ;
public const decimal TPLong = 1.0005m ;
public const decimal SLLong = 0.94m ;
public const decimal TPShort = 1.0005m ;
public const decimal SLShort = 0.94m ;
}
}using System;
using System.Collections.Generic;
using System.Linq;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Data;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Indicators;
using QuantConnect.Securities;
using QuantConnect.Orders;
namespace QuantConnect.Algorithm.Framework.Alphas
{
public class Algorithm_ES : NullAlphaModel
{
public RollingWindow<decimal> BidPriceES = new RollingWindow<decimal>(3);
public RollingWindow<decimal> AskPriceES = new RollingWindow<decimal>(3);
public RollingWindow<decimal> VolumeES = new RollingWindow<decimal>(3);
private readonly Symbol _symbol;
public Algorithm_ES(Symbol symbol)
{
_symbol = symbol;
}
public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
{
var accountCurrencyCash = algorithm.Portfolio.TotalPortfolioValue;
foreach(var chain in data.FutureChains)
{
// remplacer les lettre entre guillemet par l'abreviation correspondant au contract analysé.
if (chain.Value.Symbol.StartsWith("ES"))
{
var ES = (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > algorithm.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
if (ES != null)
{
BidPriceES.Add(ES.BidPrice);
AskPriceES.Add(ES.AskPrice);
VolumeES.Add(ES.Volume);
if (!BidPriceES.IsReady || !AskPriceES.IsReady || !VolumeES.IsReady)
continue;
if (ES.BidPrice != 0 && ES.AskPrice != 0)
{
var _quantityy = (decimal)(VolumeES[0]+VolumeES[1]) * 0.00001m;
if (BidPriceES[0]>AskPriceES[1])
{
algorithm.MarketOrder(ES.Symbol, _quantityy, false, "Entry");
break;
}
if (AskPriceES[0]<BidPriceES[1])
{
algorithm.MarketOrder(ES.Symbol, _quantityy, false, "Entry");
break;
}
}}}
}
return Enumerable.Empty<Insight>();
}
}
}using System;
using System.Collections.Generic;
using QuantConnect.Data.Market;
using QuantConnect.Securities.Future;
using QuantConnect.Indicators;
using QuantConnect.Securities;
using QuantConnect.Algorithm.Framework.Execution ;
using QuantConnect.Orders;
using QuantConnect.Algorithm.Framework.Risk;
using QuantConnect.Brokerages;
using QuantConnect.Algorithm.Framework.Selection;
using QuantConnect.Orders.Slippage;
using QuantConnect.Interfaces;
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Data;
using QuantConnect.Data.Consolidators;
using QuantConnect.Data.UniverseSelection;
using QuantConnect.Algorithm.Framework.Execution;
namespace QuantConnect.Algorithm.Framework.Alphas
{
public partial class Algorithm : QCAlgorithm, IRegressionAlgorithmDefinition
{
private String[] futureSymbols = new[] {"ES", "YM"};
private Dictionary<Symbol, FuturesChain> contract_chains = new Dictionary<Symbol, FuturesChain>();
private Dictionary<Symbol, Future> contracts = new Dictionary<Symbol, Future>();
private Symbol _YM;
private Symbol _ES;
public override void Initialize()
{
SetStartDate(2000, 01, 01);
SetEndDate(2010, 01, 01);
SetCash(1000000);
foreach (var futureSymbol in futureSymbols)
{
Debug($"Registering {futureSymbol}");
Future fut = AddFuture(futureSymbol, Resolution.Minute);
fut.SetFilter(universe => universe.FrontMonth());
}
_ES = QuantConnect.Symbol.Create("ES", SecurityType.Future, Market.USA);
_YM = QuantConnect.Symbol.Create("YM", SecurityType.Future, Market.USA);
SetSecurityInitializer(x => x.SetSlippageModel(new CustomSlippageModel(this)));
SetBrokerageModel(BrokerageName.AlphaStreams);
SetExecution(new VolumeWeightedAveragePriceExecutionModel());
AddRiskManagement(new MaximumUnrealizedProfitPercentPerSecurity(0.1m));
AddRiskManagement(new MaximumDrawdownPercentPerSecurity(0.1m));
AddAlpha(new Algorithm_ES(_ES));
AddAlpha(new Algorithm_YM(_YM));
}
public class FuturesUniverseSelectionModel : FutureUniverseSelectionModel
{
public FuturesUniverseSelectionModel(Func<DateTime, IEnumerable<Symbol>> futureChainSymbolSelector)
:base(TimeSpan.FromDays(1), futureChainSymbolSelector){}
public FutureFilterUniverse filter(FutureFilterUniverse filter){
return filter.Expiration(TimeSpan.Zero, TimeSpan.FromDays(182)).OnlyApplyFilterAtMarketOpen();}
}
public class CustomSlippageModel : ISlippageModel
{
private readonly QCAlgorithm _algorithm;
public RollingWindow<decimal> High = new RollingWindow<decimal>(2);
public RollingWindow<decimal> Low = new RollingWindow<decimal>(2);
public RollingWindow<decimal> Volume = new RollingWindow<decimal>(2);
public CustomSlippageModel(QCAlgorithm algorithm)
{
_algorithm = algorithm;
}
public decimal GetSlippageApproximation(Security asset, Order order)
{
High.Add(asset.High);
Low.Add(asset.Low);
Volume.Add(asset.Volume);
var orderVolume = order.AbsoluteQuantity;
var slippage = (High[0]-Low[0]) * 0.01m / (Volume[0]/orderVolume);
if (asset.Symbol.Value.StartsWith("ES"))
{
if (((High[0]-Low[0]) * 0.01m / (Volume[0]/orderVolume)) < VarES.minprizefluct)
{
return VarES.minprizefluct ;
}
}
if (asset.Symbol.Value.StartsWith("YM"))
{
if (((High[0]-Low[0]) * 0.01m / (Volume[0]/orderVolume)) < VarES.minprizefluct)
{
return VarYM.minprizefluct ;
}
}
return slippage;
}
}
/// <summary>
/// This is used by the regression test system to indicate if the open source Lean repository has the required data to run this algorithm.
/// </summary>
public bool CanRunLocally { get; } = true;
/// <summary>
/// This is used by the regression test system to indicate which languages this algorithm is written in.
/// </summary>
public Language[] Languages { get; } = { Language.CSharp, Language.Python };
/// <summary>
/// This is used by the regression test system to indicate what the expected statistics are from running the algorithm
/// </summary>
public Dictionary<string, string> ExpectedStatistics => new Dictionary<string, string>
{
{"Total Trades", "2"},
{"Average Win", "0%"},
{"Average Loss", "0%"},
{"Compounding Annual Return", "-91.448%"},
{"Drawdown", "5.000%"},
{"Expectancy", "0"},
{"Net Profit", "-3.312%"},
{"Sharpe Ratio", "-14.22"},
{"Loss Rate", "0%"},
{"Win Rate", "0%"},
{"Profit-Loss Ratio", "0"},
{"Alpha", "-1.479"},
{"Beta", "0.204"},
{"Annual Standard Deviation", "0.099"},
{"Annual Variance", "0.01"},
{"Information Ratio", "-10.043"},
{"Tracking Error", "0.176"},
{"Treynor Ratio", "-6.907"},
{"Total Fees", "$3.70"},
{"Total Insights Generated", "6"},
{"Total Insights Closed", "5"},
{"Total Insights Analysis Completed", "5"},
{"Long Insight Count", "6"},
{"Short Insight Count", "0"},
{"Long/Short Ratio", "100%"},
{"Estimated Monthly Alpha Value", "$-90.70258"},
{"Total Accumulated Estimated Alpha Value", "$-15.621"},
{"Mean Population Estimated Insight Value", "$-3.1242"},
{"Mean Population Direction", "0%"},
{"Mean Population Magnitude", "0%"},
{"Rolling Averaged Population Direction", "0%"},
{"Rolling Averaged Population Magnitude", "0%"}
};
}
}