| Overall Statistics |
|
Total Trades 17 Average Win 0% Average Loss -3.98% Compounding Annual Return -98.156% Drawdown 39.100% Expectancy -1 Net Profit -29.536% Sharpe Ratio -2.931 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.205 Beta -186.825 Annual Standard Deviation 0.783 Annual Variance 0.613 Information Ratio -2.948 Tracking Error 0.783 Treynor Ratio 0.012 Total Fees $749.33 |
namespace QuantConnect.Algorithm.CSharp
{
public class DualSellOrderTest : QCAlgorithm
{
private OrderTicket EntryOrder { get; set; }
private OneCancelsOtherTicketSet ProfitLossOrders { get; set; }
public override void Initialize()
{
SetStartDate(2018, 8, 1); //Set Start Date
SetEndDate(2018, 9, 1); //Set Start Date
SetCash(100000); //Set Strategy Cash
SetCash(100000); //Set Strategy Cash
SetCash("BTC", 0);
SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Cash);
var btc = AddCrypto("BTCUSD", Resolution.Hour);
}
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// Slice object keyed by symbol containing the stock data
public override void OnData(Slice data)
{
if (EntryOrder == null)
{
decimal quantity = (Portfolio.CashBook["USD"].Amount * .25M) / Securities["BTCUSD"].Price;
quantity = Math.Round(quantity, 8);
EntryOrder = MarketOrder("BTCUSD", quantity, false, "Entry");
if (EntryOrder.Status == OrderStatus.Filled || EntryOrder.Status == OrderStatus.PartiallyFilled)
{
var filledPrice = this.EntryOrder.AverageFillPrice;
ProfitLossOrders = new OneCancelsOtherTicketSet(
StopMarketOrder("BTCUSD", -quantity, Math.Round(filledPrice * (.97m), 2), "Stop Loss"),
LimitOrder("BTCUSD", -quantity, Math.Round(filledPrice * (1.03m), 2), "Profit Target")
);
}
else { EntryOrder = null; }
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
// If we sold, remove stop loss or profit taking
if (orderEvent.Direction == OrderDirection.Sell && (orderEvent.Status == OrderStatus.Filled || orderEvent.Status == OrderStatus.PartiallyFilled))
{
var sellOrder = Transactions.GetOrderTicket(orderEvent.OrderId);
if (ProfitLossOrders != null)
{
ProfitLossOrders.Filled();
ProfitLossOrders = null;
EntryOrder = null;
}
}
}
}
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();
}
}
}
}
}