| Overall Statistics |
|
Total Trades 451 Average Win 2.22% Average Loss -1.18% Compounding Annual Return 12.457% Drawdown 16.900% Expectancy 0.192 Net Profit 61.885% Sharpe Ratio 0.995 Loss Rate 59% Win Rate 41% Profit-Loss Ratio 1.88 Alpha -0.015 Beta 0.977 Annual Standard Deviation 0.125 Annual Variance 0.016 Information Ratio -1.069 Tracking Error 0.017 Treynor Ratio 0.127 Total Fees $451.00 |
namespace QuantConnect
{
public class BasicTemplateAlgorithm : QCAlgorithm
{
private OrderTicket EntryOrder { get; set; }
private Func<QCAlgorithm, string, decimal, OneCancelsOtherTicketSet> OnOrderFilledEvent { get; set; }
private OneCancelsOtherTicketSet ProfitLossOrders { get; set; }
public override void Initialize()
{
SetStartDate(2013, 1, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(25000);
AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute);
}
public void OnData(TradeBars data)
{
if (!Portfolio.HoldStock)
{
int quantity = (int)Math.Floor(Portfolio.Cash / data["SPY"].Close);
this.OnOrderFilledEvent = (algo, symbol, filledPrice) =>
{
return new OneCancelsOtherTicketSet(
algo.LimitOrder(symbol, -quantity, filledPrice + 4m, "Profit Target"),
algo.StopMarketOrder(symbol, -quantity, filledPrice - 2m, "Stop Loss"));
};
this.EntryOrder = MarketOrder("SPY", quantity, false, "Entry");
}
}
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;
}
}
}
}
}namespace QuantConnect {
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.Cancel();
}
}
}
}
}