| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
using System;
using System.Collections.Generic;
using QuantConnect.Data;
using QuantConnect.Data.Market;
using System.Linq;
using QuantConnect.Interfaces;
using QuantConnect.Indicators;
using QuantConnect.Securities;
using QuantConnect.Orders;
using QuantConnect.Data.Consolidators;
namespace Quant
{
public static class Contract_ES
{
public static FuturesContract GetFuturesContract_ES(this Slice slice, QCAlgorithm Algorithm)
{
foreach (var chain in slice.FutureChains)
{
if (chain.Value.Symbol.Value.StartsWith("ES"))
{
return (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Algorithm.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
}
}
return null;
}
}
public class TestAlgo : QCAlgorithm
{
public RollingWindow<decimal> Volume ;
public RollingWindow<decimal> Vol ;
public RollingWindow<decimal> Ask_Open ;
public RollingWindow<decimal> AskOpen ;
public RollingWindow<decimal> Bid_Open ;
public RollingWindow<decimal> BidOpen ;
public RollingWindow<decimal> Ask_High ;
public RollingWindow<decimal> AskHigh ;
public RollingWindow<decimal> Bid_High ;
public RollingWindow<decimal> BidHigh ;
public RollingWindow<decimal> Ask_Low ;
public RollingWindow<decimal> AskLow ;
public RollingWindow<decimal> Bid_Low ;
public RollingWindow<decimal> BidLow ;
public RollingWindow<decimal> Ask_Close ;
public RollingWindow<decimal> AskClose ;
public RollingWindow<decimal> Bid_Close ;
public RollingWindow<decimal> BidClose ;
public OrderEvent Entryorder {get; set;}
public List<int> Entryorder_Id = new List<int>() ;
public OrderTicket EntryOrder { get; set; }
public Func<QCAlgorithm, string, decimal, OneCancelsOtherTicketSet> OnOrderFilledEvent { get; set; }
public OneCancelsOtherTicketSet ProfitLossOrders { get; set; }
public override void Initialize()
{
SetStartDate(2013, 01, 01);
SetEndDate(2013, 01, 5);
SetCash(1000000);
var contract = AddFuture(Futures.Indices.SP500EMini, Resolution.Minute);
contract.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(182));
SetSecurityInitializer(x => x.SetSlippageModel(new CustomSlippageModel(this)));
SetBrokerageModel(BrokerageName.AlphaStreams);
SetExecution(new VolumeWeightedAveragePriceExecutionModel());
AddRiskManagement(new MaximumUnrealizedProfitPercentPerSecurity(0.09m));
AddRiskManagement(new MaximumDrawdownPercentPerSecurity(0.09m));
Volume = new RollingWindow<decimal>(2);
Vol = new RollingWindow<decimal>(2);
Ask_Open = new RollingWindow<decimal>(2);
AskOpen = new RollingWindow<decimal>(2);
Bid_Open = new RollingWindow<decimal>(2);
BidOpen = new RollingWindow<decimal>(2);
Ask_High = new RollingWindow<decimal>(2);
AskHigh = new RollingWindow<decimal>(2);
Bid_High = new RollingWindow<decimal>(2);
BidHigh = new RollingWindow<decimal>(2);
Ask_Low = new RollingWindow<decimal>(2);
AskLow = new RollingWindow<decimal>(2);
Bid_Low = new RollingWindow<decimal>(2);
BidLow = new RollingWindow<decimal>(2);
Ask_Close = new RollingWindow<decimal>(2);
AskClose = new RollingWindow<decimal>(2);
Bid_Close = new RollingWindow<decimal>(2);
BidClose = new RollingWindow<decimal>(2);
}
public void OnData(Slice slice)
{
var accountCurrencyCash = Portfolio.TotalPortfolioValue;
var ES = slice.GetFuturesContract_ES(new QCAlgorithm());
var consolidator_Quote = new QuoteBarConsolidator(TimeSpan.FromMinutes(60));
consolidator_Quote.DataConsolidated += DataConsolidate_Quote;
SubscriptionManager.AddConsolidator(ES.Symbol, consolidator_Quote);
var consolidator_Trade = new TradeBarConsolidator(TimeSpan.FromMinutes(60));
consolidator_Trade.DataConsolidated += DataConsolidate_Trade;
SubscriptionManager.AddConsolidator(ES.Symbol, consolidator_Trade);
if(!Portfolio.Invested)
{
if (ES == null) {return ;}
if (AskOpen.IsReady && AskClose.IsReady && BidOpen.IsReady && BidClose.IsReady && Vol.IsReady)
{
var Quantity = 1;
var _minSize = 0.25m;
if (Vol[1] < Vol[0])
{
OnOrderFilledEvent = (algoo_ES, symbol, FillPrice) =>
{
return new OneCancelsOtherTicketSet(
algoo_ES.LimitOrder(ES.Symbol, -Quantity, FillPrice * Var.TPLong, "Profit Long _Target"),
algoo_ES.StopMarketOrder(ES.Symbol, -Quantity, FillPrice * Var.SLLong, "Stop Long _Loss"));
};
EntryOrder = MarketOrder(ES.Symbol, Quantity, true, "Entry");
Debug("EntrOrder_Ask_Open[0] : " + Ask_Open[0]);
Debug("EntrOrder_AskOpen[0] : " + AskOpen[0]);
Debug("EntrOrder_Volume[0] : " + Volume[0]);
Debug("EntrOrder_VolumeTime[0] : " + Volume[0]);
Debug("EntrOrder_Volume[1] : " + Volume[1]);
Debug("EntrOrder_Vol[0] : " + Vol[0]);
Debug("EntrOrder_Vol[1] : " + Vol[1]);
Debug("AverageFillPrice : " + EntryOrder.AverageFillPrice);
}
}
}
}
public void DataConsolidate_Trade(object sender, TradeBar tradeBar)
{
Volume.Add(tradeBar.Volume);
if (Volume.IsReady)
{
if (Volume[0] != Volume[1])
{
Vol.Add(tradeBar.Volume);
}
}
}
public void DataConsolidate_Quote(object sender, QuoteBar quoteBar)
{
Ask_Open.Add(quoteBar.Ask.Open);
if (Ask_Open.IsReady)
{
if (Ask_Open[0] != Ask_Open[1])
{
AskOpen.Add(quoteBar.Ask.Open);
}
}
Bid_Open.Add(quoteBar.Bid.Open);
if (Bid_Open.IsReady)
{
if (Bid_Open[0] != Bid_Open[1])
{
BidOpen.Add(quoteBar.Bid.Open);
}
}
Ask_High.Add(quoteBar.Ask.High);
if (Ask_High.IsReady)
{
if (Ask_High[0] != Ask_High[1])
{
AskHigh.Add(quoteBar.Ask.High);
}
}
Bid_High.Add(quoteBar.Bid.High);
if (Bid_High.IsReady)
{
if (Bid_High[0] != Bid_High[1])
{
BidHigh.Add(quoteBar.Bid.High);
}
}
Ask_Low.Add(quoteBar.Ask.Low);
if (Ask_Low.IsReady)
{
if (Ask_Low[0] != Ask_Low[1])
{
AskLow.Add(quoteBar.Ask.Low);
}
}
Bid_Low.Add(quoteBar.Bid.Low);
if (Bid_Low.IsReady)
{
if (Bid_Low[0] != Bid_Low[1])
{
BidLow.Add(quoteBar.Bid.Low);
}
}
Ask_Close.Add(quoteBar.Ask.Close);
if (Ask_Close.IsReady)
{
if (Ask_Close[0] != Ask_Close[1])
{
AskClose.Add(quoteBar.Bid.Close);
}
}
Bid_Close.Add(quoteBar.Bid.Close);
if (Bid_Close.IsReady)
{
if (Bid_Close[0] != Bid_Close[1])
{
BidClose.Add(quoteBar.Bid.Close);
}
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
if (EntryOrder != null)
{
this.EntryOrder = null;
}
if (orderEvent.Status == OrderStatus.Filled || orderEvent.Status == OrderStatus.PartiallyFilled)
{
if (this.OnOrderFilledEvent != null)
{
this.ProfitLossOrders = OnOrderFilledEvent(this, orderEvent.Symbol, orderEvent.FillPrice);
OnOrderFilledEvent = null;
}
else if (this.ProfitLossOrders != null)
{
this.ProfitLossOrders.Filled();
this.ProfitLossOrders = null;
}
}
}
public class CustomSlippageModel : ISlippageModel
{
private readonly QCAlgorithm _algorithm;
public CustomSlippageModel(QCAlgorithm algorithm)
{
_algorithm = algorithm;
}
public decimal GetSlippageApproximation(Security asset, Order order)
{
var orderVolume = order.Quantity;
var slippage = ((asset.AskSize - asset.BidSize) * 0.0001m / (asset.Volume/orderVolume));
if (asset.Symbol.StartsWith("ES"))
{
if (((asset.AskSize - asset.BidSize) * 0.0001m / (asset.Volume/orderVolume)) < Var.minprizefluct)
{
return 0.25m ;
}
}
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 };
}
}namespace Quant
{
public class OneCancelsOtherTicketSet
{
public OneCancelsOtherTicketSet(params OrderTicket[] orderTickets)
{
this.OrderTickets = orderTickets;
}
private OrderTicket[] OrderTickets { get; set; }
public void Filled()
{
// Cancel all the outstanding tickets.
foreach (var orderTicket in this.OrderTickets)
{
if (orderTicket.Status == OrderStatus.Submitted && orderTicket.Symbol.StartsWith("ES"))
{
orderTicket.Cancel();
}
if (orderTicket.Status == OrderStatus.Submitted && orderTicket.Symbol.StartsWith("YM"))
{
orderTicket.Cancel();
}
}
}
}
}namespace Quant
{
public static class Var
{
public const decimal MaxQuantity = 50m ;
public const decimal CentageLoss = 0.1m ;
public const decimal valpoint = 12.5m ;
public const decimal minprizefluct = 0.25m ;
public const decimal coefVolume = 1.1m ;
public const decimal TPLong = 1.001m ;
public const decimal SLLong = 0.972m ;
public const decimal TPShort = 1.001m ;
public const decimal SLShort = 0.972m ;
}
}