| Overall Statistics |
|
Total Orders 54 Average Win 2.18% Average Loss -1.94% Compounding Annual Return -1.397% Drawdown 16.000% Expectancy -0.152 Start Equity 100000.00 End Equity 91787.04 Net Profit -8.213% Sharpe Ratio -0.321 Sortino Ratio -0.234 Probabilistic Sharpe Ratio 0.024% Loss Rate 60% Win Rate 40% Profit-Loss Ratio 1.12 Alpha -0.02 Beta -0.128 Annual Standard Deviation 0.05 Annual Variance 0.002 Information Ratio 0.162 Tracking Error 0.104 Treynor Ratio 0.125 Total Fees $0.00 Estimated Strategy Capacity $1400000.00 Lowest Capacity Asset EURUSD 8G Portfolio Turnover 2.32% |
#region imports
from AlgorithmImports import *
from datetime import datetime
import decimal
import numpy as np
#endregion
class DynamicBreakoutAlgorithm(QCAlgorithm):
def initialize(self):
self.set_start_date(2010,1,15)
self.set_end_date(2016,2,15)
self.set_cash(100000)
fx = self.add_forex("EURUSD", Resolution.HOUR, Market.OANDA)
self._syl = fx.symbol
self.schedule.on(self.date_rules.every_day(self._syl), self.time_rules.before_market_close(self._syl,1), self._set_signal)
self._numdays = 20
self._ceiling,self._floor = 60,20
self._buypoint, self._sellpoint= None, None
self._long_liq_point, self._short_liq_point, self._yesterdayclose= None, None, None
self.set_benchmark(self._syl)
self._bolband = self.bb(self._syl, self._numdays, 2, MovingAverageType.SIMPLE, Resolution.DAILY)
def _set_signal(self):
close = self.history(self._syl, 31, Resolution.DAILY)['close']
todayvol = np.std(close[1:31])
yesterdayvol = np.std(close[0:30])
deltavol = (todayvol - yesterdayvol) / todayvol
self._numdays = int(round(self._numdays * (1 + deltavol)))
if self._numdays > self._ceiling:
self._numdays = self._ceiling
elif self._numdays < self._floor:
self._numdays = self._floor
high = self.history(self._syl, self._numdays, Resolution.DAILY)['high']
low = self.history(self._syl, self._numdays, Resolution.DAILY)['low']
self._buypoint = max(high)
self._sellpoint = min(low)
historyclose = self.history(self._syl, self._numdays, Resolution.DAILY)['close']
self._long_liq_point = np.mean(historyclose)
self._short_liq_point = np.mean(historyclose)
self._yesterdayclose = historyclose.iloc[-1]
# wait for our BollingerBand to fully initialize
if not self._bolband.is_ready: return
holdings = self.portfolio[self._syl].quantity
if self._yesterdayclose > self._bolband.upper_band.current.value and self.portfolio[self._syl].price >= self._buypoint:
self.set_holdings(self._syl, 1)
elif self._yesterdayclose < self._bolband.lower_band.current.value and self.portfolio[self._syl].price <= self._sellpoint:
self.set_holdings(self._syl, -1)
if holdings > 0 and self.portfolio[self._syl].price <= self._short_liq_point:
self.liquidate(self._syl)
elif holdings < 0 and self.portfolio[self._syl].price >= self._short_liq_point:
self.liquidate(self._syl)
self.log(str(self._yesterdayclose)+(" # of days ")+(str(self._numdays)))