| Overall Statistics |
|
Total Trades 87 Average Win 0.73% Average Loss -1.16% Compounding Annual Return -17.102% Drawdown 18.400% Expectancy -0.285 Net Profit -17.781% Sharpe Ratio -1.504 Loss Rate 56% Win Rate 44% Profit-Loss Ratio 0.63 Alpha -0.137 Beta 0.128 Annual Standard Deviation 0.085 Annual Variance 0.007 Information Ratio -1.632 Tracking Error 0.126 Treynor Ratio -0.992 Total Fees $0.00 |
import numpy as np
import math
class BasicTemplateAlgorithm(QCAlgorithm):
def __init__(self):
self.stoploss = 0.02
self.take_profit = 0.006
def Initialize(self):
self.SetCash(25000)
self.SetStartDate(2016,1,1)
self.SetEndDate(2017,1,15)
self.gbp = self.AddForex("GBPUSD", Resolution.Daily).Symbol
history = self.History(7,Resolution.Daily)
self.historical = []
for slice in history:
bar = slice[self.gbp]
self.historical.append(float(bar.Close))
self.mid = (self.historical[0] + self.historical[-1])/2
self.Schedule.On(self.DateRules.Every(DayOfWeek.Sunday,DayOfWeek.Sunday), self.TimeRules.At(12, 0), Action(self.action))
def OnData(self, slice):
self.historical.append(float(slice[self.gbp].Close))
self.historical = self.historical[-7:]
self.data = slice
price = float(slice[self.gbp].Close)
if self.Portfolio[self.gbp].Quantity > 0:
if price/self.long_price -1 >= self.take_profit:
self.Liquidate()
elif price/self.long_price <= 1-self.stoploss:
self.Liquidate()
else:
return
elif self.Portfolio[self.gbp].Quantity < 0:
if price/self.long_price -1 >= self.stoploss:
self.Liquidate()
elif price/self.long_price <= 1-self.take_profit:
self.Liquidate()
else:
return
else:
return
def action(self):
self.mid = (self.historical[0] + self.historical[-1])/2
price = float(self.data[self.gbp].Close)
quantity = math.floor(float(self.Portfolio.Cash)/price)
if price > self.mid:
self.LimitOrder(self.gbp, -quantity, price)
self.short_price = price
elif price< self.mid:
self.LimitOrder(self.gbp, quantity, price)
self.long_price = price
# def OnOrderEvent(self,event):
# if event.Status not in (2,3):
# return
# if (self.profit_order) == None or (self.loss_order) == None:
# return
# filled = event.OrderId
# if self.profit_order == filled:
# self.loss_order.Cancel()
# self.Log(str('loss order canceled'))
# elif self.loss_order.OrderId == filled:
# self.profit_order.Cancel()
# self.Log(str('profit order canceled'))
# else:
# return