| 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 Probabilistic 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 -1.031 Tracking Error 0.675 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from System import *
from QuantConnect import *
from QuantConnect.Data.Consolidators import *
from QuantConnect.Data.Market import *
from QuantConnect.Orders import OrderStatus
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Indicators import *
import numpy as np
from datetime import timedelta, datetime
class MultipleSymbolMultipleIndicatorDatapoint(QCAlgorithm):
def Initialize(self):
self.SetBrokerageModel(BrokerageName.FTX, AccountType.Cash)
self.DefaultOrderProperties = FTXOrderProperties()
self.DefaultOrderProperties.PostOnly = True
self.Data = {} # The dictionary to use
self.VolumeLong = {}
self.VolumeShort = {}
self.LastTransactionPrice = {}
self.CurrentPrice = {}
self.HoldingsInvested = {}
self.MinuteMACD = {}
self.HourMACD = {}
self.DailyMACD = {}
self.EntryPrice = {}
self.Channel = {}
self.ChannelQuick = {}
self.ChannelLong = {}
self.ChannelShort = {}
self.InitialHoldings = {}
self.sellAmount = {}
self.bull = {}
self.ExitPrice = {}
self.Sales = {}
self.DailyAverage = {}
self.SMALong = {}
self.ExitTrigger = {}
self.EquitySymbols = ["SOLUSD", "MATICUSD", "FTMUSD"] # As many as you like. This can also work with a QC Universe
# Date bookends
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2022, 1, 4)
self.SetCash(10000)
self.buffer = 0 #Buffer - adjust to allow extra money for purchases.
# initialize our equity data
for symbol in self.EquitySymbols:
equity = self.AddCrypto(symbol, Resolution.Minute)
self.buffer += 1.05
#Averaging indicators
self.VolumeShort[symbol] = self.SMA(equity.Symbol, 20, Resolution.Hour, Field.Volume)
self.VolumeLong[symbol] = self.SMA(equity.Symbol, 100, Resolution.Hour, Field.Volume)
self.DailyAverage[symbol] = self.SMA(equity.Symbol, 1, Resolution.Daily)
self.SMALong[symbol] = self.SMA(equity.Symbol, 200, Resolution.Daily)
self.ExitTrigger[symbol] = self.EMA(equity.Symbol, 100, Resolution.Daily)
#MACD indicators
self.MinuteMACD[symbol] = self.MACD(equity.Symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Minute)
self.HourMACD[symbol] = self.MACD(equity.Symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Hour)
self.DailyMACD[symbol] = self.MACD(equity.Symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily)
#DCH indicators
self.Channel[symbol] = self.DCH(equity.Symbol,2,10,Resolution.Daily)
self.ChannelQuick[symbol] = self.DCH(equity.Symbol,30,20,Resolution.Hour)
self.ChannelLong[symbol] = self.DCH(equity.Symbol,200,200,Resolution.Daily)
self.ChannelShort[symbol] = self.DCH(equity.Symbol,100,100,Resolution.Daily)
#Price and Settings
self.LastTransactionPrice[symbol] = round(self.Securities[symbol].Price * 1.00, 2)
self.EntryPrice[symbol] = round(self.Securities[symbol].Price * 1.00, 2)
self.ExitPrice[symbol] = round(self.Securities[symbol].Price * 1.00, 2)
self.bull[symbol] = 0
self.Sales[symbol] = 0
asset = symbol.replace("USD","")
holdings = self.Portfolio.CashBook[asset].Amount
self.InitialHoldings[symbol] = holdings
self.Day = 0
self.SetWarmup(200, Resolution.Daily) # this number should be 1 less than the indicator that we are waiting for to avoid premature trades.
def OnData(self,data):
usdTotal = self.Portfolio.CashBook["USD"].Amount
tolerance = 0.00015;
# loop through each symbol in our structure
for symbol in self.EquitySymbols:
if not self.SMALong[symbol].IsReady:
return
if 1 == 1:
self.CurrentPrice[symbol] = round(self.Securities[symbol].Price * 1.00, 2)
asset = symbol.replace("USD","")
holdings = self.Portfolio.CashBook[asset].Amount
if self.Time.hour % 2 == 0 and self.Time.minute == 11:
if holdings > 0 and not self.Transactions.GetOpenOrders():
self.bull[symbol] = 1
if self.Time.hour % 1 == 0 and self.Time.minute == 0:
self.Debug(str(symbol) + str(" minute/hour MACD: ") + str(self.MinuteMACD[symbol]) + str("/") + str(self.HourMACD[symbol]))
if not self.Portfolio[symbol].Invested:
self.Debug(str(symbol) + str(" Donchian 30-hour high/2-day/price: ") + str(self.ChannelQuick[symbol].UpperBand) + str(
"/") + str(self.Channel[symbol].UpperBand) + str("/") + str(self.CurrentPrice[symbol]))
elif self.Portfolio[symbol].Invested:
self.Debug(str(symbol) + str(" Donchian 10-day low/price: ") + str(self.Channel[symbol].LowerBand) + str("/") + str(self.CurrentPrice[symbol]))
self.Debug(str(symbol) + str(" current/average volume: ") + str(self.VolumeShort[symbol]) + str("/") + str(self.VolumeLong[symbol]))
self.Debug(str(symbol) + str(" bull: ") + str(self.bull[symbol]))
for cash in self.Portfolio.CashBook.Values:
self.Debug(f"Holding {cash.Amount} of {cash.Symbol} (${cash.ValueInAccountCurrency} USD value)")
def OnEndOfDay(self, symbol):
for symbol in self.EquitySymbols:
#Log the end of day prices:
self.Plot(symbol, "Price", str(self.DailyAverage[symbol]))