Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-0.231%
Drawdown
16.400%
Expectancy
0
Net Profit
0%
Sharpe Ratio
-0.049
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.001
Beta
-0.01
Annual Standard Deviation
0.026
Annual Variance
0.001
Information Ratio
-0.272
Tracking Error
0.167
Treynor Ratio
0.122
Total Fees
$0.00
#-------------------------------------------------------------------------------
# example of rolling windows and consolidators in python
#-------------------------------------------------------------------------------
import clr
clr.AddReference("System")
clr.AddReference("QuantConnect.Algorithm")
clr.AddReference("QuantConnect.Indicators")
clr.AddReference("QuantConnect.Common")
#
#import numpy as np
#import pandas as pd
#import datetime as dt
#import statsmodels.formula.api as sm
#import statsmodels.tsa.stattools as ts
#import statsmodels.formula.api as sm
#
from System.Collections.Generic import List
from scipy import stats
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
import decimal as d 
from QuantConnect.Data.Consolidators import *
from QuantConnect.Data.Market import *
from datetime import timedelta
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# Class Forex
class Forex(QCAlgorithm):
	
	#---------------------------------------------------------------------------
	# init class
	def __init__(self):
		self.Debug("__init__:")
		
	#---------------------------------------------------------------------------
	
	
	#---------------------------------------------------------------------------
	# init some vars
	def Initialize(self):
		self.Debug("Initialize:")
		
		self.SetStartDate(2006,1,1)
		self.SetEndDate(2016,1,2)
		self.SetCash(10000)
		
		# add symbols
		self.symbols = ['EURUSD', 'GBPJPY']
		self.assign(self.symbols)
		
		# Rolling Window
		self.SetWarmup(timedelta(400))
		self.HIST = 200
		self.FHDW = RollingWindow[QuoteBar](self.HIST)
		self.OMDW = RollingWindow[QuoteBar](self.HIST)
		
		# 4 hour studies
		# Rolling Indicator Windows
		self.emaSW = RollingWindow[IndicatorDataPoint](self.HIST)
		self.emaFW = RollingWindow[IndicatorDataPoint](self.HIST)
		
		# indicator
		self.slow = ExponentialMovingAverage(200)
		self.fast = ExponentialMovingAverage(2)
		
		# update rolling Windows
		self.slow.Updated += self.emaSlowUpdated
		self.fast.Updated += self.emaFastUpdated
		
		#define consolidator
		con4h = QuoteBarConsolidator(timedelta(minutes=240))
		
		#attach our event handler
		con4h.DataConsolidated += self.FourHourBarHandler
		
		# add our consolidator to manager
		self.SubscriptionManager.AddConsolidator(self.symbols[1],con4h)
		
		# Register 
		self.RegisterIndicator(self.symbols[1], self.slow, con4h)
		self.RegisterIndicator(self.symbols[1], self.fast, con4h)
		
		self.previous_bar = None
		
		# define a small tolerance to avoid bouncing
		self.tolerance = 0.00010
		
		#charts
		stockPlot = Chart('Plot 0')
		stockPlot.AddSeries(Series('emaSW', SeriesType.Line,0))
		stockPlot.AddSeries(Series('emaFW', SeriesType.Line,0))
		#stockPlot.AddSeries(Series('FHDW', SeriesType.Line,0))
		self.AddChart(stockPlot)
		
		self.dbg = False
	#---------------------------------------------------------------------------
	
	
	#---------------------------------------------------------------------------
	def FourHourBarHandler(self, sender, bar):
		#if (self.dbg): self.Debug("FourHourBarHandler:")
    	
		# add quotebar to rolling window
		self.FHDW.Add(bar)
		
		# Wait for windows to be ready.
		if not (self.FHDW.IsReady): return
		
		# Wait for windows to be ready.
		if not (self.emaSW.IsReady and self.emaFW.IsReady): return
		
		holdings0 = self.Portfolio[self.symbols[0]].Quantity
		holdings1 = self.Portfolio[self.symbols[1]].Quantity
		
		weighting = 1.0 / self.Securities.Count
		
		profit = self.Portfolio.TotalUnrealizedProfit
		
		# conditions
		if self.emaFW[0].Value > self.emaSW[0].Value * d.Decimal(1 + self.tolerance):
			up0=True
		if self.emaFW[0].Value < self.emaSW[0].Value * d.Decimal(1 + self.tolerance):
			up0=False
		if self.emaFW[0].Value > self.emaSW[0].Value * d.Decimal(1 + self.tolerance):
			dn0=False
		if self.emaFW[0].Value < self.emaSW[0].Value * d.Decimal(1 + self.tolerance):
			dn0=True
		if self.emaFW[1].Value > self.emaSW[1].Value * d.Decimal(1 + self.tolerance):
			up1=True
		if self.emaFW[1].Value < self.emaSW[1].Value * d.Decimal(1 + self.tolerance):
			up1=False
		if self.emaFW[1].Value > self.emaSW[1].Value * d.Decimal(1 + self.tolerance):
			dn1=False
		if self.emaFW[1].Value < self.emaSW[1].Value * d.Decimal(1 + self.tolerance):
			dn1=True
		if profit > 10.00:
			pr0=True
		elif profit < 10.00:
			pr0=False
        
		# Trades
		if holdings1 == 0:
			if dn1 and up0: 
				#self.Log("Buy  >> {0}".format(self.Securities[self.symbols[1]].Price))
				self.SetHoldings(self.symbols[1], weighting)
			elif up1 and dn0:
				#self.Log("Sell  >> {0}".format(self.Securities[self.symbols[1]].Price))
				self.SetHoldings(self.symbols[1], -weighting)
			elif holdings1 >0:
				if not up1:
					#self.Log("exit long  >> {0}".format(self.Securities[self.symbols[1]].Price))
					self.SetHoldings(self.symbols[1], 0)
					
				if (self.Portfolio.TotalUnrealizedProfit > 10.00):
					self.Debug("Profit: "+str(profit))
					self.Liquidate()
		elif holdings1 <0:
			if not dn1:
				#self.Log("exit short  >> {0}".format(self.Securities[self.symbols[1]].Price))
				self.SetHoldings(self.symbols[1], 0)
			if (self.Portfolio.TotalUnrealizedProfit > 10.00):
				self.Debug("Profit: "+str(profit))
				self.Liquidate()
		#        
		#if profit>0:
		#	self.Debug("Profit: "+str(profit))
        #
		pass
    #---------------------------------------------------------------------------
	
	
    #---------------------------------------------------------------------------
	def emaSlowUpdated(self, sender, updated):
		if (self.dbg): self.Debug("emaSlowUpdated:")
		self.emaSW.Add(updated)
		#self.Debug("emaSlowUpdated[i]: "+str(self.emaSW[0]))
		pass
    #---------------------------------------------------------------------------
	
	
    #---------------------------------------------------------------------------
	def emaFastUpdated(self, sender, updated):
		if (self.dbg): self.Debug("emaFastUpdated:")
		self.emaFW.Add(updated)
		#self.Debug("ema'FastUpdated[i]: "+str(self.emaFW[0]))
		pass
    #---------------------------------------------------------------------------	
	
	
    #---------------------------------------------------------------------------
    # add the pairs
	def assign(self,list):
		#if (self.dbg): self.Debug("assign:")
		for i in range(len(list)):
			currency = self.AddForex(list[i],Resolution.Minute,Market.Oanda,False,50)
		#self.Debug("currency "+str(currency))
		pass
    #---------------------------------------------------------------------------
	
	
    #---------------------------------------------------------------------------
    # every bar do something
	def OnData(self,data):
		#if (self.dbg): self.Debug("OnData:")
		
		#Add QuoteBar to RollingWindow
		#self.OMDW.Add(data)  #broken
		pass
    #---------------------------------------------------------------------------
	
#-------------------------------------------------------------------------------