为什么会出现此错误? (QuantConnect算法)

时间:2018-07-16 17:20:27

标签: python trading algorithmic-trading

我刚开始使用QuantConnect,但我对Python的理解相当好,所以我想。这是我的代码的重要部分:

def Initialize(self):
    # Set the cash we'd like to use for our backtest
    # This is ignored in live trading 
    self.SetCash(5000)

    # Start and end dates for the backtest.
    # These are ignored in live trading.
    self.SetStartDate(2015,1,1)
    self.SetEndDate(2018,1,1)

    # Set Brokerage model to load OANDA fee structure.
    self.SetBrokerageModel(BrokerageName.OandaBrokerage)

    # Add assets you'd like to see
    # self.eurusd = self.AddForex("EURUSD", Resolution.Minute).Symbol
    self.usdjpy = self.AddForex("USDJPY", Resolution.Minute).Symbol
    # self.eurjpy = self.AddForex("EURJPY", Resolution.Minute).Symbol



def OnData(self, slice):

    rsi = self.RSI("USDJPY", 14, MovingAverageType.Simple)

    if rsi > 72:
        self.SetHoldings("USDJPY", 1)

    if rsi < 28:
        self.SetHoldings("USDJPY", 1)

这是我得到的错误:

Runtime Error: TypeError : Cannot get managed object
  at OnData in main.py:line 36
 TypeError : Cannot get managed object

Stacktrace:

    System.Exception: TypeError : Cannot get managed object
     at OnData in main.py:line 73
     ---> Python.Runtime.PythonException: TypeError : Cannot get managed object
     at Python.Runtime.PyObject.Invoke (Python.Runtime.PyTuple args, 
     Python.Runtime.PyDict kw) [0x00033] in <0f995c28c5b446ad8835419f76b319a3>:0 
     at Python.Runtime.PyObject.InvokeMethod (System.String name, 
     Python.Runtime.PyTuple args, Python.Runtime.PyDict kw) [0x00007] in 
     <0f995c28c5b446ad8835419f76b319a3>:0 
      at Python.Runtime.PyObject.TryInvokeMember 
       (System.Dynamic.InvokeMemberBinder binder, System.Object[] args, 
      System.Object& result) [0x0003e] in <0f995c28c5b446ad8835419f76b319a3>:0 
      at (wrapper dynamic-method) 
 System.Object.CallSite.Target(System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object,QuantConnect.Data.Slice)

我尝试编辑创建变量“ rsi”的方式,但似乎无济于事。有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:2)

与其他属性一样,您需要使用self将此实例变量设置为实例。

self.rsi = self.RSI(...)

...

if self.rsi > 72:

或者,只需将定义移至OnData方法中即可。

答案 1 :(得分:1)

在QuantConnect / Lean中,我们有指标的快捷方法,它们属于QCAlgorithm类(使用 self ),并且名称均为大写。这些辅助方法将创建指标对象的新实例,并将其连接到数据合并器,以便引擎自动更新指标。

由于这些方法创建了一个新实例,因此我们只应调用一次(通常在 Initialize 中)并将其分配给要在整个算法中访问的类变量。

还请注意,指标不是数值,因此我们需要在 Current.Value 属性中获取其值:

def Initialize(self):
    self.SetCash(5000)
    self.SetStartDate(2015,1,1)
    self.SetEndDate(2018,1,1)
    self.SetBrokerageModel(BrokerageName.OandaBrokerage)

    self.usdjpy = self.AddForex("USDJPY", Resolution.Minute).Symbol
    self.rsi = self.RSI("USDJPY", 14, MovingAverageType.Simple)


def OnData(self, slice):
    if self.rsi.Current.Value > 72:
        self.SetHoldings("USDJPY", 1)

    if self.rsi.Current.Value < 28:
        self.SetHoldings("USDJPY", 1)