| 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 collections import deque
from datetime import datetime, timedelta
from numpy import sum
class ConsolidatorAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 1, 1) # Set Start Date
self.SetEndDate(2017, 1, 2) # Set End Date
self._startingCash = 2000 # Assign starting cash
self.SetCash(self._startingCash) # Set Cash
self._ticker = "ETHUSD" # Assign ticker
self._resolution = Resolution.Hour # Assign resolution
self.crypto = self.AddCrypto(self._ticker, self._resolution) # Add Crpyto
self._fastPeriod = 12 # Set moving average period
self.SetBrokerageModel(BrokerageName.Bitfinex, AccountType.Cash); # Set brokerage model
# Build consolidator
consolidator = TradeBarConsolidator(TimeSpan.FromHours(1)) # Consolidate hourly resolution from hourly data
self.SubscriptionManager.AddConsolidator(self._ticker, consolidator) # Subscribe consolidator
consolidator.DataConsolidated += self.OnCustomHandler
# Define custom indicator using consolidated data
self._fastSmaCustomTimeFrame = SimpleMovingAverage("custom", self._fastPeriod)
self._fastSmaCustomTimeFrame.Updated += self.CustomUpdated
self.customWindow = RollingWindow[IndicatorDataPoint](5)
self.RegisterIndicator(self._ticker, self._fastSmaCustomTimeFrame, consolidator)
# Define built-in indicator using standard resolution data
self._fastSmaStandardResolution = self.SMA(self._ticker, self._fastPeriod, self._resolution)
def CustomUpdated(self, sender, updated):
self.customWindow.Add(updated)
def OnData(self, data):
if (not self._fastSmaCustomTimeFrame.IsReady and not self._fastSmaStandardResolution.IsReady):
return
self.Debug(f"Sma standard time resolution: {self._fastSmaStandardResolution}")
def OnCustomHandler(self, sender, data):
if (not self._fastSmaCustomTimeFrame.IsReady and not self._fastSmaStandardResolution.IsReady):
return
self.Debug(f"Sma custom time frame: {self._fastSmaCustomTimeFrame}")
# Python implementation of SimpleMovingAverage.
# Represents the traditional simple moving average indicator (SMA).
class SimpleMovingAverage(PythonIndicator):
def __init__(self, name, period):
self.Name = name
self.Value = 0
self.queue = deque(maxlen=period)
# Update method is mandatory
def Update(self, input):
self.queue.appendleft(input.Value)
count = len(self.queue)
self.Value = sum(self.queue) / count
return count == self.queue.maxlen