| Overall Statistics |
|
Total Trades 195 Average Win 11.67% Average Loss -3.44% Compounding Annual Return 20.379% Drawdown 47.500% Expectancy 0.360 Net Profit 140.245% Sharpe Ratio 0.571 Loss Rate 69% Win Rate 31% Profit-Loss Ratio 3.40 Alpha 0.333 Beta -6.562 Annual Standard Deviation 0.4 Annual Variance 0.16 Information Ratio 0.531 Tracking Error 0.4 Treynor Ratio -0.035 Total Fees $0.00 |
import numpy as np
from datetime import datetime
import decimal
### <summary>
### Basic EMA algorithm simply buys above EMA and sells below EMA.
### </summary>
class BasicEMAAlgorithm(QCAlgorithm):
'''Basic template algorithm simply initializes the date range and cash'''
def Initialize(self):
'''Initializes cash and max trade size. Sets target currencies to run on.'''
self.SetStartDate(2013,10, 7) #Set Start Date
#self.SetEndDate(2016,6,11) #Set End Date
self.SetCash(1000) #Set Strategy Cash
self.maxTradeSize = 10000
self.SetBrokerageModel(BrokerageName.OandaBrokerage)
self.ema = {}
self.currenciesToUse = {"AUDUSD"}
for cur in self.currenciesToUse:
# Add symbols to universe
self.forex = self.AddForex(cur, Resolution.Daily, Market.Oanda)
self.ema[cur] = self.EMA(cur, 30, Resolution.Daily)
self.__previous = datetime.min
self.tradesize = round(self.maxTradeSize / len(self.currenciesToUse))
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
# only once per day
if self.__previous.date() == self.Time.date():
return
self.__previous = self.Time
# Grab our universe, is there an easier way?
for universe in self.UniverseManager.Values:
# User defined universe has symbols from AddSecurity/AddEquity calls
if universe is UserDefinedUniverse:
break
symbols = universe.Members.Keys
for symbol in symbols:
self.symStr = str(symbol)
holdings = self.Portfolio[self.symStr].Quantity
if holdings == 0:
# initiate new position
# Price above EMA, so buy
if self.ema[self.symStr].Current.Value < data[symbol.Value].Ask.Close:
self.MarketOrder(self.forex.Symbol, self.tradesize)
# Price below EMA, so sell
elif self.ema[self.symStr].Current.Value > data[self.symStr].Ask.Close:
self.MarketOrder(self.forex.Symbol, -self.tradesize)
else:
# We have holdings, so determine if we liquidate
# if long and we drop below EMA, close it
if holdings > 0 and self.ema[self.symStr].Current.Value > data[self.symStr].Ask.Close:
self.Liquidate(self.symStr)
# if short and we go above EMA, close it
elif holdings < 0 and self.ema[self.symStr].Current.Value < data[self.symStr].Ask.Close:
self.Liquidate(self.symStr)