HftStraBaseCtx 虚拟操作接口层
HftStraBaseCtx::stra_enter_long_v
:虚拟开多仓
- 功能:用于进入一个虚拟的多头交易(买入操作)。
- 流程:
- 检查是否存在交易对象
_trader
,以及自定义的本地IDcustomLocalID
是否有效(必须非零)。 - 检查交易模式是否支持虚拟订单(
isVirtOrder()
)。 - 提取股票/合约的标准代码(
stdCode
)并转换为真实代码(realCode
)。 - 查找相关合约信息(
ct
),若有ruletag
,则进行处理,确保获取正确的合约信息。 - 通过锁定对应的虚拟订单锁
virt_order_locks[realCode]
,确保数据的一致性和防止并发冲突。 - 填充订单信息并存入数据库。
- 检查价格、数量和风控限制,若检查不通过,则返回错误信息。
- 调用
_trader->buy_v
实际执行开仓操作。 - 错误处理:若出现错误,会撤销订单并更新订单状态为“撤单”。
- 检查是否存在交易对象
HftStraBaseCtx::stra_exit_long_v
:虚拟平多仓
- 功能:用于退出虚拟多头仓位(卖出操作,用于平掉已持有的多头仓位)。
- 流程:
- 检查是否存在交易对象
_trader
,以及customLocalID
是否有效。 - 确保当前交易模式支持虚拟订单。
- 提取和转换标准代码为真实代码,并获取合约信息。
- 锁定虚拟订单的锁,防止并发冲突。
- 填充订单信息并存入数据库。
- 查询当前虚拟仓位(
v_pos_value
),确保平仓的数量不超过现有的仓位。 - 锁定仓位,更新数据库,执行
_trader->sell_v
卖出操作。 - 错误处理:若操作失败或仓位不足,则还原仓位并更新订单状态为撤单。
- 检查是否存在交易对象
HftStraBaseCtx::stra_enter_short_v
and HftStraBaseCtx::stra_exit_short_v
HftStraBaseCtx::Error_handle错误处理
在每个交易函数中,错误处理机制都涉及:
- 价格检查:确保订单价格合法。
- 数量检查:确保订单数量符合要求。
- 风控检查:确保订单符合相关的风控要求(如流动性、限单等)。
- 仓位检查:对于平仓操作,必须确认仓位足够。如果仓位不足,会返回错误并且不进行交易。
TraderAdapter 虚拟下单接口层
Trader::buy_v
:面向虚拟仓位的买入
- 参数解释
stdCode
:商品代码(期货合约代码),是买入操作的标的。price
:买入价格,用户希望以此价格买入商品。qty
:买入数量,用户希望购买的数量。flag
:订单标志(可能用于区分不同的订单类型,如市价单、限价单等)。errMsg
:返回的错误信息,如果买入操作出错,错误信息会通过此参数返回。customLocalID
:用户提供的自定义本地ID,用于标识订单,可以关联其他系统或信息。contextName
:上下文名称,用于区分不同的交易会话或策略。cInfo
:指向一个WTSContractInfo
类型的指针,表示合约信息。needCancelOrder
:是否需要取消当前已有的挂单。如果为true
,在执行买入操作之前,会检查并尝试取消已有的挂单。
- 获取合约信息和会话信息
- 获取当前的仓位和交易状态
- 从
_positions
获取当前品种(stdCode
)的仓位信息(pItem
)。 - 从
_stat_map
获取当前品种的交易状态信息(statInfo
),如果该信息不存在,则创建并添加新的交易状态信息。 statItem
是statInfo
中包含的交易统计信息,后续会根据它来判断是否满足某些交易规则。
4. 获取交易策略规则
-
从策略管理器(
_policy_mgr
)获取与当前商品相关的交易规则(ruleGP
)。这些规则决定了如何进行买入操作(比如是否执行开仓、平仓、锁仓等操作)。const ActionRuleGroup& ruleGP = _policy_mgr->getActionRules(commInfo->getFullPid());
-
遍历交易规则并执行相应操作
-
锁仓操作 (AT_LockOrder)
- 锁仓数量的计算:首先,
lockQty
被设为当前的总仓位(total_pos(true)
和total_pos(false)
二者中的较大值),用于表示当前的锁仓量。
- 锁仓数量的计算:首先,
-
开仓操作 (AT_Open)
-
为当前订单生成一个
localid
。这是一个唯一的标识符,用来标识一个特定的交易操作。每当一个订单(如开仓、平仓、锁仓等)被触发时,系统会生成一个新的localid
-
执行开多仓操作:使用
openLong
函数尝试开多仓。如果返回的ret_localid
不为UINT_MAX
(表示成功),则将剩余数量left
设置为 0,表示操作完成。 -
失败处理:如果订单创建失败,撤销本地ID并输出相关日志。
-
-
平今仓操作 (AT_CloseToday)
平今仓是指在同一个交易日内平掉已经开立的空仓。通常用于短期交易或当天的风险控制。
-
计算最大可平仓数量:
maxQty
是当前可平仓的数量,这里使用avail_new_pos(false)
来获取今天可平仓的数量。最大可平仓数量是剩余数量和可平仓数量中的较小值。 -
平仓操作:调用
closeShort
函数执行平今仓操作。成功后,减少剩余数量left
。 -
失败处理:如果平仓失败,撤销本地ID,并记录错误日志。
-
-
平昨仓操作 (AT_CloseYestoday)
平昨仓是指平掉昨天的仓位,通常是在隔夜持仓的情况下进行。
-
计算最大可平仓数量:
maxQty
是可以平掉的昨天仓位数量,使用avail_pre_pos(false)
来获取可平仓的数量。 -
平仓操作:调用
closeShort
执行平昨仓操作。如果成功,减少剩余数量left
。 -
失败处理:如果操作失败,撤销本地ID。
-
-
普通平仓操作 (AT_Close)
普通平仓操作是最常见的平仓方式,它会根据当前的持仓状况来平掉多余的仓位。
-
计算可平仓数量:
maxQty
为剩余可平仓的数量,取avail_pos(false)
和剩余买入数量left
的较小值。 -
执行平仓操作:使用
closeShort
执行平仓操作。如果成功,更新剩余数量。 -
失败处理:如果平仓失败,撤销本地ID。
-
-
错误处理和日志记录
-
addLocalIDToVirtOrder(contextName, customLocalID, localid);
- 将本地ID(
localid
)与虚拟订单关联起来。具体来说,它会将订单的localid
和用户提供的customLocalID
关联,并且可能与某个contextName
(上下文名称)一起进行管理。这意味着localid
和customLocalID
之间的映射关系被记录下来,从而可以在后续的操作中查找和追踪相应的订单。
- 将本地ID(
-