Overall Statistics |
Total Trades 8 Average Win 463.65% Average Loss -17.83% Compounding Annual Return 693.936% Drawdown 80.200% Expectancy 4.400 Net Profit 112.698% Sharpe Ratio 8.448 Probabilistic Sharpe Ratio 63.725% Loss Rate 80% Win Rate 20% Profit-Loss Ratio 26.00 Alpha 18.583 Beta -3.138 Annual Standard Deviation 2.168 Annual Variance 4.699 Information Ratio 8.348 Tracking Error 2.183 Treynor Ratio -5.835 Total Fees $29.60 Estimated Strategy Capacity $37000000.00 Lowest Capacity Asset GC VQ3M41P8XYFX |
class DeterminedYellowGreenMonkey(QCAlgorithm): def Initialize(self): self.SetStartDate(2013, 12, 20) # Set Start Date self.SetEndDate(2014,5,1) self.SetCash(10000) # Set Strategy Cash self.notprinted=True #1. Request Gold futures and save the gold security self.gold = self.AddFuture(Futures.Metals.Gold, Resolution.Minute) #2. Set our expiry filter to return all contracts expiring within 90 days self.gold.SetFilter(7,90) #3. Widen the free portfolio percentage to 30% to avoid margin calls for futures self.Settings.FreePortfolioValuePercentage=0.3 # Limit trading to $7k def OnMarginCallWarning(self): self.Error("This is a margin call warning. The assets will e liquidated to cover losses.") def OnData(self, slice): # Loop over each available futures chain from slice.FutureChains data for chain in slice.FutureChains: #1. Filter to choose popular contracts (at least 1000 OpenInterest) self.popularContracts = [contract for contract in chain.Value if contract.OpenInterest > 1000] #2. if the length of contracts in this chain is zero, continue to next chain if len(self.popularContracts) == 0: continue #3. Sort our contracts by open interest in descending order and save to sortedByOIContracts sortedByOIContracts = sorted (self.popularContracts, key=lambda k : k.OpenInterest, reverse=True) #4. Save the contract with the highest open interest to self.liquidContract self.liquidContract = self.popularContracts[0] if not self.Portfolio.Invested: #1. Save the notional value of the futures contract to self.notionalValue self.notionalValue = self.liquidContract.AskPrice * self.gold.SymbolProperties.ContractMultiplier #2. Save the contract security object to the variable future future = self.Securities[self.liquidContract.Symbol] initialMargin = self.Securities[self.liquidContract.Symbol].BuyingPowerModel.InitialOvernightMarginRequirement self.Debug("{} NEW CONTRACT Symbol:{} Expiry:{} LastPrice:{:.2f} OpenInterest:{:.0f} Multiplier:{:.0f} MarginReq:${:,.0f} RemMargin:${:,.0f}" .format(self.Time, self.liquidContract.Symbol, self.liquidContract.Expiry, self.liquidContract.LastPrice, self.liquidContract.OpenInterest, self.gold.SymbolProperties.ContractMultiplier, future.BuyingPowerModel.InitialOvernightMarginRequirement,self.Portfolio.MarginRemaining )) #3. Calculate the number of contracts we can afford based on the margin requirement # Divide the margin remaining by the initial margin and save to self.contractsToBuy self.contractsToBuy= self.Portfolio.MarginRemaining // initialMargin #4. Make a market order for the number of contracts we calculated self.MarketOrder(future, self.contractsToBuy) self.Debug ("{} InitialMargin:{} Contracts:{} RemMargin:{}".format(self.Time, str(initialMargin), str(self.contractsToBuy), self.Portfolio.MarginRemaining)) # You can olaso use the SetHoldings function to automatically calculate your position size #self.SetHoldings(self.liquidContract.Symbol, 1)