简体   繁体   English

为什么我收到这个错误? (QuantConnect 算法)

[英]Why am I getting this error? (QuantConnect Algorithm)

I'm just getting started with QuantConnect, but I understand Python fairly well, or so I thought.我刚刚开始使用 QuantConnect,但我对 Python 相当了解,或者我是这么认为的。 This is the important part of my code:这是我的代码的重要部分:

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)

This is the error I'm getting:这是我得到的错误:

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)

I have tried to edit the way I create the variable 'rsi' but nothing seems to work.我试图编辑我创建变量 'rsi' 的方式,但似乎没有任何效果。 Can someone tell me what I'm doing wrong?有人能告诉我我做错了什么吗?

As you do with other attributes, you need to make this an instance variable by using self .与其他属性一样,您需要使用self将其设为实例变量。

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

... ...

if self.rsi > 72:

Alternatively, just move the definition into the OnData method.或者,只需将定义移动到 OnData 方法中。

In QuantConnect/Lean, we have shortcut methods for indicators, they belong to the QCAlgorithm class (use self ) and name are upper-cased.在 QuantConnect/Lean 中,我们有指标的快捷方法,它们属于 QCAlgorithm 类(使用self )并且名称是大写的。 These helper methods create a new instance of a indicator object and hook it up to a data consolidator so that the indicator is automatically updated by the engine.这些辅助方法创建指标对象的新实例并将其连接到数据整合器,以便引擎自动更新指标。

Since these methods create a new instance, we just should only to call it once (normally in Initialize ) and assign it to a class variable to be accessed throughout the algorithm.由于这些方法创建了一个新实例,我们只需调用它一次(通常在Initialize 中)并将其分配给一个类变量,以便在整个算法中访问。

Please also note that the indicators are not numerical values, so we need to get its value in the Current.Value property:另请注意,指标不是数值,因此我们需要在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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM