| Overall Statistics |
|
Total Trades 42 Average Win 47.30% Average Loss 0% Compounding Annual Return 46.504% Drawdown 32.400% Expectancy 0 Net Profit 46.913% Sharpe Ratio 1.404 Probabilistic Sharpe Ratio 53.640% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.101 Beta 1.24 Annual Standard Deviation 0.44 Annual Variance 0.194 Information Ratio 0.503 Tracking Error 0.4 Treynor Ratio 0.498 Total Fees $42.00 Estimated Strategy Capacity $73000.00 Lowest Capacity Asset IBM R735QTJ8XC9X |
using System;
using System.Drawing;
namespace QuantConnect.Algorithm.CSharp
{
public class CasualYellowGreenLemur : QCAlgorithm
{
string Symbol = "IBM";
int limitPrice = 0;
int stopMarketTicket = 0;
decimal st = 0.01m;
decimal tp = 0.0m;
decimal close = 0.0m;
string type = "Buy";
int numberOfOrders =0;
private ExponentialMovingAverage slow;
private ExponentialMovingAverage fast;
private ExponentialMovingAverage ema;
public List<OrderTicket> Orders = new List<OrderTicket>();
private OrderTicket _limitTicket;
private OrderTicket _stopLimitTicket;
decimal TP2;
private RollingWindow<TradeBar> _window;
public override void Initialize()
{
SetStartDate(2020, 7, 4);
SetEndDate(2021, 7, 6);
SetCash(10000);
AddSecurity(SecurityType.Equity, Symbol, Resolution.Minute);
_window = new RollingWindow<TradeBar>(3); // For other security types, use QuoteBar
fast = EMA(Symbol, 72, Resolution.Minute);
slow = EMA(Symbol, 89, Resolution.Minute);
ema = EMA(Symbol, 9, Resolution.Minute);
tp = st*2;
Schedule.On(DateRules.On(EndDate),
TimeRules.At(15, 0),
SpecificTime);
}
public void SpecificTime()
{
Liquidate(Symbol);
Debug("liquidated on the last day");
}
public override void OnData(Slice data)
{
// Add SPY TradeBar in rollling window
_window.Add(data[Symbol]);
// Wait for windows to be ready.
if (!_window.IsReady) return;
var chart = Portfolio[Symbol];
if(_window[1] != null)
close = _window[1].Price;
if (chart.Price >= slow && numberOfOrders ==0 && _window[1] != null)
{
type= "BUY";
Log("BUY >> " + Securities[Symbol].Price);
//SetHoldings(Symbol, .50);
//var stopMarketTicket = StopMarketOrder(Symbol, -1, close * 0.99m);
//var limitTicket = LimitOrder(Symbol, 10, close * .99m);
var close1 = Securities[Symbol].Close;
//var stopMarketTicket = StopMarketOrder(Symbol, 10, close-close * st);
var stopMarketTicket = StopMarketOrder(Symbol, 10,close);
//MarketOrder(Symbol, 100);
var limitTicket = LimitOrder(Symbol, 10, close+close * tp);
Orders.Add(limitTicket);
numberOfOrders = 1;
Log("1st Stoploss >>" + stopMarketTicket);
Log("TP1 >>" + limitTicket);
}
if (chart.Price <= fast && numberOfOrders ==0)
{
type= "SELL";
Log("SELL >> " + Securities[Symbol].Price);
// var close = Securities[Symbol].Close;
var stopMarketTicket = StopMarketOrder(Symbol, 10, close+close * st);
var limitTicket = LimitOrder(Symbol, 10, close-close * tp);
//MarketOrder(Symbol, 100);
Orders.Add(limitTicket);
numberOfOrders =1;
Log("Stoploss >>" + stopMarketTicket);
Log("TP1 >>" + limitTicket);
}
if (!Portfolio.Invested)
{
//var close = Securities[Symbol].Close;
//MarketOrder(Symbol, 100);
//Debug("Purchased Stock");
}
}
public override void OnOrderEvent(OrderEvent orderEvent)
{
if (orderEvent.Status == OrderStatus.Filled && numberOfOrders == 0){
return;
}
///TP2
if(numberOfOrders == 1)
{
if(Orders[0].OrderId == orderEvent.OrderId && orderEvent.Status != OrderStatus.CancelPending)
{
var e = ema * 1;
var currentprice = Securities[Symbol].Price;
if(currentprice < e)
{
Log(type + " >> " + Securities[Symbol].Price);
var qty = orderEvent.FillQuantity * 0.5m;
var stopMarketTicket = StopMarketOrder(Symbol, qty, orderEvent.FillPrice); //SL
var limitTicket2 = LimitOrder(Symbol, qty, _window[1].Price);
if(limitTicket2.OrderId ==-10)
Log("OrderId - 10");
Orders.Add(limitTicket2);
numberOfOrders =2;
Log("Status" + orderEvent.Status);
Log("STOP >>" + stopMarketTicket);
Log("TP2 >>" + limitTicket2);
}
}
else
{
Log(" **Hit stop loss: Resetting the Orders **");
Log("No of orders >>" + Orders.Count);
var order = Orders[Orders.Count-1];
order.Cancel();
numberOfOrders=0;
Orders = new List<OrderTicket>();
//Liquidate(Symbol);
}
}
else if(numberOfOrders == 2)
{
//TP3 goes here
if(Orders[0].OrderId == orderEvent.OrderId && orderEvent.Status != OrderStatus.CancelPending)
{
Log(" ** Hit TP2: Resetting the Orders **");
Orders = new List<OrderTicket>();
numberOfOrders=0;
//Liquidate(Symbol);
}
else if(Orders[0].OrderId != -3)
{
var r =Orders[0];
Orders[0].Cancel();
Log(" **Hit stop loss for TP2: Resetting the Orders **");
Orders = new List<OrderTicket>();
numberOfOrders=0;
//Liquidate(Symbol);
}
else
{
Log(" ** Hit Order 2: **");
Orders = new List<OrderTicket>();
numberOfOrders =0;
//Liquidate(Symbol);
}
}
else if(Orders.Count>=3)
{
Orders[Orders.Count-1].Cancel();
Log(" **Orders >=3 **");
Orders = new List<OrderTicket>();
numberOfOrders=0;
//Liquidate(Symbol);
}
}
}
}