| Overall Statistics |
|
Total Trades 60 Average Win 0.17% Average Loss -0.07% Compounding Annual Return 9.636% Drawdown 0.200% Expectancy 0.965 Net Profit 1.899% Sharpe Ratio 6.661 Loss Rate 47% Win Rate 53% Profit-Loss Ratio 2.68 Alpha 0.049 Beta 2.079 Annual Standard Deviation 0.013 Annual Variance 0 Information Ratio 5.257 Tracking Error 0.013 Treynor Ratio 0.043 Total Fees $60.00 |
namespace QuantConnect.Algorithm.CSharp{
public class BasicTemplateAlgorithm : QCAlgorithm{
String symbol = "SPY";
SimpleMovingAverage smaFast;
SimpleMovingAverage smaSlow;
RollingWindow<Decimal> high = new RollingWindow<Decimal>(200);
RollingWindow<Decimal> low = new RollingWindow<Decimal>(200);
RollingWindow<Decimal> close = new RollingWindow<Decimal>(200);
RollingWindow<Decimal> open = new RollingWindow<Decimal>(200);
bool longEntry = false;
int size = 100;
private OrderTicket CurrentOrder;
private OrderTicket StopLoss;
private OrderTicket ProfitTarget;
const decimal StopLossPercent = 0.002m;
const decimal TakeProfitPercent = 0.006m;
public override void Initialize(){
//SetStartDate(DateTime.Now.Date.AddDays(-600));
SetStartDate(2018, 01, 01);
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(100000);
AddEquity(symbol, Resolution.Minute);
smaFast = SMA(symbol, 100, Resolution.Minute);
smaSlow = SMA(symbol, 200, Resolution.Minute);
}
public override void OnData(Slice data){
high.Add(data[symbol].High);
low.Add(data[symbol].Low);
close.Add(data[symbol].Close);
open.Add(data[symbol].Open);
if(!smaSlow.IsReady) return;
if(!Portfolio.Invested && isHighest(high, 9) && smaFast > smaSlow){
if(dippEntry(open, close, 9, 6)){
CurrentOrder = Order(symbol, size);
StopLoss = StopMarketOrder(symbol, -size, close[0]*(1m - StopLossPercent));
ProfitTarget = LimitOrder(symbol, -size, close[0]*(1m + TakeProfitPercent));
}
}
}
public bool isHighest(RollingWindow<Decimal> high, int n){
int count = 0;
for(int i = n+1; i < high.Count; i++){
if(high[n] >= high[i]){
count++;
}
}if(count == high.Count-(n+1)){
return true;
}else return false;
}
public bool dippEntry(RollingWindow<Decimal> open,RollingWindow<Decimal> close, int n, int p){
int count = 0;
for(int i = 0; i < n; i++){
if(open[i] > close[i]){
count++;
}
}if(count == p){
return true;
}else return false;
}
public override void OnOrderEvent(OrderEvent orderEvent){
if (!orderEvent.Status.IsClosed()){
return;
}
if (ProfitTarget == null || StopLoss == null){
return;
}
var filledOrderId = orderEvent.OrderId;
if (ProfitTarget.OrderId == filledOrderId){
StopLoss.Cancel();
}
if (StopLoss.OrderId == filledOrderId){
ProfitTarget.Cancel();
}
}
}
}