四种Position类
除了文章《1》中提到的 SignalPositionModel 和 ApiPositionManager 两个用来存放持仓信息的类意外,在这两个类中也发现了另外两个与position相关的类:
- ctpbee.constant.PositionData, SinglePositionModel.to_position() 返回
- ctpbee.center.PositionModel, ApiPositionManager.get_position() 返回
# level_position.py
from ctpbee.center import PositionModel
from ctpbee.constant import PositionData, Direction
class SinglePositionModel:
def to_position(self) -> PositionData:
"""返回持仓"""
try:
return PositionData(
symnol=self.local_symbol.split(".")[0]
exchange=self.exchange,
volume=self.volume,
price=self.price
)
except Exception:
raise ValueError
class ApiPositionManager:
def get_position_by_ld(self, symbol, direction) - > SinglePositionModel
return self.get(local_symbol + "." + direction.value, None)
def get_position(self, local_symbol) -> PositionModel or None:
long = self.get_position_by_ld(local_symbol, direction=Direction.LONG)
short = self.get_position_by_ld(local_symbol, direction=Direction.SHort)
if long is None and short is None:
return None
else:
retrun PositionModel(long, short)
constant.BaseData 和 constant.PositionData(BaseData)
constant.py中定义了多个基础的交易中使用的数据结构类:
- constant.BaseData
- constant.PositionData(BaseData)
- constant.Direction(Enum)
- constant.Exchange(Enum)
…
BaseData是基础类,子类初始化时,会初始化相应的属性。
PositionData类有以下几个属性(实例化时不需全部赋值):
- local_position_id
- symbol
- local_symbol
- local_position_id
- excahnge
- direction
- volume
- frozen
- price
- pnl
- yd_volume
# constant.py
"""
Basic data structure used for general trading function in VN Trader.
"""
from dataclasses import dataclass, asdict
from enum import Enum
class Direction(Enum):
LONG = "多"
SHORT = "空"
NET = "净"
class Exchange(Enum):
"""
Exchange.
"""
# Chinese
CFFEX = "CFFEX"
SHFE = "SHFE"
CZCE = "CZCE"
DCE = "DCE"
INE = "INE"
SSE = "SSE"
SZSE = "SZSE"
SGE = "SGE"
class BaseData:
def __init__(self, **mapping):
for key, value in mapping.items():
setattr(self, key, value)
if hasattr(self, "__post_init__"):
self.__post_init__()
...
class PositionData(BaseData):
local_position_id: str = ''
symbol: str
exchange: Exchange
direction: Direction
volume: float = 0
frozen: float = 0
price: float = 0
pnl: float = 0
yd_volume: float = 0
def __post_init__(self):
self.local_symbol = f"{self.symbol}.{self.exchange.value}"
self.local_position_id = f"{self.local_symbol}.{self.direction}"
symbol local_symbol 和 local_position_id
可见PositionData 有LongShort之分。
symbol:
Ticker
local_symbol:
{self.symbol}.{self.exchange.value}
Ticker.交易所
local_position_id:
{self.local_symbol}.{self.direction}
Ticker.交易所.Long(/Short)
center.PositionModel / ctpbee核心数据访问模块
center.PositionModel 是 longshort合并的持仓信息
# center.py
"""
ctpbee里面的核心数据访问模块
此模块描述了ctpbee里面默认的数据访问中心,同时它也可以被回测模块所调用
"""
class PositionModel(dict):
"""
单个合约的标准持仓对象
"""
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
# 有这些key
v_ext = ['exchange', 'symbol', 'local_symbol']
# 不添加这些key
u_ext = ['direction', 'local_position_id']
def __init__(self, long, short):
dict.__init(self)
self._update_attr(long, 'long')
self._update_attr(short, 'short')
def _update_attr(self, attr, direction):
if direction == 'long':
for i, v in attr._to_dict().items():
if i in self.v_ext:
setattr(self, i, v)
elif i in self.u_ext:
continue
else:
setattr(self, 'long_' + i, v)
elif direction = 'short':
for i, v in attr._to_dict().items():
if i in self.v_ext:
setattr(self, i, v)
elif i in self.u_ext:
continue
else:
setattr(self, 'short_' + i, v)