| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
from QuantConnect.Python import PythonQuandl
from QuantConnect.Data.Custom import *
from System import *
from QuantConnect import *
from QuantConnect.Data import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
from QuantConnect.Securities import *
from QuantConnect.Data.Consolidators import *
from datetime import timedelta
from collections import deque
from QuantConnect.Orders import OrderStatus
import pandas as pd
import numpy as np
from datetime import timedelta, datetime
### <summary>
### Example structure for structuring an algorithm with indicator and consolidator data for many tickers.
### </summary>
### <meta name="tag" content="consolidating data" />
### <meta name="tag" content="indicators" />
### <meta name="tag" content="using data" />
### <meta name="tag" content="strategy example" />
class MultipleSymbolConsolidationAlgorithm(QCAlgorithm):
# Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
def Initialize(self):
self._contract = None
self._nextContract = None
self._bb = None
self._nextBb = None
self._newDay = True
self.reset = True
# brokerage model
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage,
AccountType.Margin)
self.SetStartDate(2014, 12, 1)
self.SetEndDate(2016, 2, 1)
self.SetCash(100000)
self.SetWarmUp(TimeSpan.FromDays(5))
future = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute)
future.SetFilter(TimeSpan.Zero, TimeSpan.FromDays(185))
def OnData(self, slice):
if (self.Time.minute==0):
self.Log('OnData')
if not self.InitContract(slice): return
if self.reset:
self.reset=False
if (self.Time.minute==0):
if (self._bb != None and self._bb.IsReady):
price = 0.
if (slice.Bars.ContainsKey(self._contract.Symbol)):
#self.Log(self._contract.Symbol)
price = slice.Bars[self._contract.Symbol].Close
args = (self.Time,self._contract,price,self._bb.LowerBand,self._bb.MiddleBand,self._bb.UpperBand)
self.Log('onData: {} contract: {}, price: {}, BBL: {}, BBM: {}, BBU: {}'.format(*args))
if (slice.Bars.ContainsKey(self._nextContract.Symbol)):
price = slice.Bars[self._nextContract.Symbol].Close
args = (self.Time,self._nextContract,price,self._nextBb.LowerBand,self._nextBb.MiddleBand,self._nextBb.UpperBand)
self.Log('onData: {} contract: {}, price: {}, BBL: {}, BBM: {}, BBU: {}'.format(*args))
else:
self.Log('BB not ready')
return
def InitContract(self, slice):
if not self._newDay:
return True
if (self._contract != None and (self._contract.Expiry - self.Time).days >=3):
return True
for chain in slice.FutureChains.Values:
contracts = chain.Contracts.Values
#self.Log(str(chain))
skip = 0
if (self._contract != None):
self.Log('Expiry days away {} - {} - {}'.format((self._contract.Expiry-self.Time).days, self._contract.Expiry, self.Time.date))
if (self._contract != None and (self._contract.Expiry-self.Time).days <= 3):
skip = 1
chainContracts = list(contracts) #[contract for contract in chain]
chainContracts = sorted(chainContracts, key=lambda x: x.Expiry)
if (len(chainContracts) < skip+2):
return False
first = chainContracts[skip]
second = chainContracts[skip+1]
if (first != None and second != None):
self.Log('RESET: ' + first.Symbol.Value + ' - ' + second.Symbol.Value)
self.reset=True
if (first != None and (self._contract == None or self._contract.Symbol != first.Symbol)):
if (self._nextContract != None):
self._bb = self._nextBb
self._contract = self._nextContract
else:
self._contract = first
oneHour = TradeBarConsolidator(TimeSpan.FromMinutes(60))
oneHour.DataConsolidated += self.OnHour
self.SubscriptionManager.AddConsolidator(self._contract.Symbol, oneHour)
self._bb = self.BB(self._contract.Symbol, 20, 2, MovingAverageType.Exponential, Resolution.Hour)
history = self.History(self._contract.Symbol, 50*60, Resolution.Minute).reset_index(drop=False)
self.Log(len(history))
for bar in history.itertuples():
#if (bar.EndTime.Minute == 0 and (self.Time-bar.EndTime).TotalMinutes >=2):
if (bar.time.minute == 0 and ((self.Time-bar.time)/pd.Timedelta(minutes=1)) >=2):
self.Log(str(bar))
#self._bb.Update(self._contract.Symbol, bar.time, bar.close)
self._bb.Update(bar.time, bar.close)
self.Log(str(self._bb.IsReady))
if (second != None and (self._nextContract == None or (self._nextContract.Symbol != second.Symbol))):
self._nextContract = second
oneHour = TradeBarConsolidator(TimeSpan.FromMinutes(60))
oneHour.DataConsolidated += self.OnHour
self.SubscriptionManager.AddConsolidator(self._nextContract.Symbol, oneHour)
self._nextBb = self.BB(self._nextContract.Symbol, 20, 2, MovingAverageType.Exponential, Resolution.Hour)
self._newDay=False
return True
return False
def OnHour(self, sender, TradeBar):
pass
def OnEndOfDay(self):
self._newDay=True