| Overall Statistics |
|
Total Trades 1 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 0 Tracking Error 0 Treynor Ratio 0 Total Fees $479.15 |
from math import floor
class BasicTemplateFuturesAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 10, 20)
self.SetCash(1000000)
self.lumber = self.AddFuture(Futures.Forestry.RandomLengthLumber)
self.lumber.SetFilter(0, 90)
def OnData(self, slice):
for chain in slice.FutureChains:
contracts = [c for c in chain.Value]
contracts = sorted(chain.Value, key=lambda k : k.OpenInterest, reverse=True)
if len(contracts) == 0:
return
contract = contracts[0]
if not self.Portfolio.Invested:
#1. Save the notional value of the futures contract to self.notionalValue
notionalValue = contract.AskPrice * self.lumber.SymbolProperties.ContractMultiplier
self.Log(f"Ask Price: {contract.AskPrice}; Contract multiplier: {self.lumber.SymbolProperties.ContractMultiplier}; Notional Value: {notionalValue}")
#self.Plot("Notional Value", "Value", notionalValue)
#2. Save the contract security object to the variable future
future = self.Securities[contract.Symbol]
#3. Calculate the number of contracts we can afford based on the margin required
# Divide the margin remaining by the initial margin and save to self.contractsToBuy
self.contractsToBuy = floor( self.Portfolio.MarginRemaining / future.BuyingPowerModel.InitialOvernightMarginRequirement )
#4. Make a market order for the number of contracts we calculated for that symbol
self.MarketOrder(contract.Symbol, self.contractsToBuy)