ctpbee(2) center.PositionModel 和 constant.PositionData

四种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)
			


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值