Hi,

I am trying to create a simple strategy for Futures Nasdaq:

Calculate return of the instrument from 9:30 to 15:30. If the return is positive, open a long position for last 30 min of the session. If it is negative, then open a short position for the last 30 min of the session. 

Unfortunately, the strategy does not open any positions. Could you please help me with this ?

 

  1. from AlgorithmImports import *
  2. from datetime import datetime
  3. import numpy as np
  4. from datetime import timedelta
  5. class MomentumAlgorithm(QCAlgorithm):
  6. def Initialize(self):
  7. self.SetStartDate(2023, 1, 1)
  8. self.SetCash(100000)
  9. self.opening_price = None
  10. self.position_value = 0
  11. self.open_position = False
  12. self.closing_price = None
  13. self.pnl = []
  14. self.accuracy = []
  15. self.cumulative_profit = 0.0
  16. self.initial_capital = 100000
  17. self.er = self.AddFuture(Futures.Indices.NASDAQ100EMini)
  18. self.contract = None
  19. self.Schedule.On(self.DateRules.EveryDay(self.er.Symbol), self.TimeRules.At(9, 30), self.OnMarketOpen)
  20. self.Schedule.On(self.DateRules.EveryDay(self.er.Symbol), self.TimeRules.At(15, 30), self.OnTradeBar)
  21. self.Schedule.On(self.DateRules.EveryDay(self.er.Symbol), self.TimeRules.At(16, 0), self.OnEndOfDay)
  22. def OnData(self, data):
  23. for chain in data.FutureChains.Values:
  24. for contract in chain.Contracts.Values:
  25. self.contract = contract
  26. break
  27. break
  28. def OnMarketOpen(self):
  29. if self.contract is None or self.contract.Symbol not in self.CurrentSlice.Bars:
  30. return
  31. bar = self.CurrentSlice.Bars[self.contract.Symbol]
  32. self.opening_price = bar.Open
  33. def OnTradeBar(self):
  34. if self.contract is None or self.contract.Symbol not in self.CurrentSlice.Bars or self.opening_price is None:
  35. return
  36. bar = self.CurrentSlice.Bars[self.contract.Symbol]
  37. return_value = bar.Close - self.opening_price
  38. # opening long/short at 15:30
  39. if return_value > 0:
  40. self.position_value = bar.Close
  41. self.open_position = "long"
  42. self.SetHoldings(self.contract.Symbol, 1)
  43. elif return_value < 0:
  44. self.position_value = bar.Open
  45. self.open_position = "short"
  46. self.SetHoldings(self.contract.Symbol, -1)
  47. def OnEndOfDay(self):
  48. if self.contract is None:
  49. return
  50. if self.contract.Symbol not in self.CurrentSlice.Bars or not self.open_position:
  51. return
  52. bar = self.CurrentSlice.Bars[self.contract.Symbol]
  53. return_value = bar.Close - bar.Open
  54. # check for end of session at 16:00
  55. if self.open_position == "long":
  56. self.closing_price = bar.Open
  57. elif self.open_position == "short":
  58. self.closing_price = bar.Close
  59. if self.closing_price:
  60. self.Liquidate(self.contract.Symbol)
+ Expand

Author

Sebastian Wozniczka

July 2023