提问:以下43行的order具有vt_orderid的属性吗?
1 @dataclass
2 class OrderData(BaseData):
3 """
4 Order data contains information for tracking lastest status
5 of a specific order.
6 """
7
8 symbol: str
9 exchange: Exchange
10 orderid: str
11
12 type: OrderType = OrderType.LIMIT
13 direction: Direction = None
14 offset: Offset = Offset.NONE
15 price: float = 0
16 volume: float = 0
17 traded: float = 0
18 status: Status = Status.SUBMITTING
19 datetime: datetime = None
20 reference: str = ""
21
22 def post_init(self) -> None:
23 """"""
24 self.vt_symbol: str = f"{self.symbol}.{self.exchange.value}"
25 self.vt_orderid: str = f"{self.gateway_name}.{self.orderid}"
26
27 def is_active(self) -> bool:
28 """
29 Check if the order is active.
30 """
31 return self.status in ACTIVE_STATUSES
32
33 def create_cancel_request(self) -> "CancelRequest":
34 """
35 Create cancel request object from order.
36 """
37 req: CancelRequest = CancelRequest(
38 orderid=self.orderid, symbol=self.symbol, exchange=self.exchange
39 )
40 return req
41
42
43 order: OrderData = OrderData(
44 symbol=self.symbol,
45 exchange=self.exchange,
46 orderid=str(self.limit_order_count),
47 direction=stop_order.direction,
48 offset=stop_order.offset,
49 price=stop_order.price,
50 volume=stop_order.volume,
51 traded=stop_order.volume,
52 status=Status.ALLTRADED,
53 gateway_name=self.gateway_name,
54 datetime=self.datetime
55 )

回答一:
是的,43行的order对象具有vt_orderid的属性。

在OrderData类的定义中,虽然vt_orderid没有直接作为一个字段在类的构造函数中声明(也就是说,它不是类的直接属性),但在post_init方法中,它作为一个属性被动态地设置了。

当你实例化OrderData时,会调用类的init方法(虽然在@dataclass装饰的类中init方法通常是自动生成的),然后紧接着会调用post_init方法(如果存在的话)。在post_init方法中,vt_orderid被设置为一个由gateway_name和orderid拼接而成的字符串。

所以,尽管vt_orderid没有在类的构造函数中直接声明,但在OrderData的实例被创建后,它确实具有vt_orderid这个属性,并且可以通过order.vt_orderid来访问。

在给出的代码段中,你实例化了一个OrderData对象(从第43行开始),因此这个对象会有vt_orderid这个属性,其值会在post_init方法中被计算并设置。不过,请注意,你的代码中缺少了gateway_name作为OrderData的一个字段或参数,因为post_init方法引用了它,但在类的定义中没有看到它。如果gateway_name是在BacktestingEngine类中的一个属性,那么在实例化OrderData时,你需要确保self.gateway_name是可用的。

回答二:
在给定的代码中,OrderData 类包含了一个 vt_orderid 的属性,这是在类的 post_init 方法中初始化的:

python

22 def post_init(self) -> None:
23 """
24 Initilize some default attributes.
25 """
26 self.vt_symbol: str = f"{self.symbol}.{self.exchange.value}"
27 self.vt_orderid: str = f"{self.gateway_name}.{self.orderid}"

这意味着所有 OrderData 的实例在初始化后都会具有 vt_orderid 属性。因此,给定代码中第 43 行创建的 order 对象也将具有 vt_orderid 属性。