问题描述
新手学习,请教各位老师,deal_callback - 账号成交状态变化主推函数,股票交易时如何获取买、卖方向:是“m_nDirection: EEntrustBS,买卖方向”,48 代表买,49 代表卖?还是这个“m_nOffsetFlag: EOffset_Flag_Type,开平,股票的买卖”,48 代表买,49 代表卖?
解决方案
你好!这是一个非常经典且容易混淆的问题。在 QMT 平台中进行股票交易时,获取买卖方向应该使用 m_nOffsetFlag 字段。
详细解答:
在 QMT 的底层设计中,为了兼容期货和股票,字段的定义带有明显的期货特征(即区分“多空方向”和“开平仓”)。
对于股票交易而言:
-
m_nOffsetFlag(开平标志):代表了股票的实际买卖操作。48代表 买入(对应期货的开仓Open)49代表 卖出(对应期货的平仓Close)
-
m_nDirection(买卖/多空方向):在股票普通买卖中,这个字段永远是48(代表做多)。因为 A 股普通交易只能做多,不能做空(融券除外),所以系统默认股票的方向都是“多头”。
官方文档印证:
根据 QMT API 文档附录说明:
m_nDirection: EEntrustBS 类型,操作,多空,期货多空,股票买卖永远是 48,其他的 dir 同理。
m_nOffsetFlag: EOffset_Flag_Type 类型,操作,期货开平,股票买卖其实就是开平。
代码示例:
在你的策略中,可以这样编写 deal_callback 来判断股票的买卖方向:
def deal_callback(ContextInfo, dealInfo):
# 获取股票代码
stock_code = dealInfo.m_strInstrumentID
# 获取成交数量
volume = dealInfo.m_nVolume
# 获取成交价格
price = dealInfo.m_dPrice
# 判断买卖方向
if dealInfo.m_nOffsetFlag == 48:
direction_str = "买入"
elif dealInfo.m_nOffsetFlag == 49:
direction_str = "卖出"
else:
direction_str = "其他操作"
print(f"收到成交回报:{direction_str} {stock_code},成交量:{volume},成交价:{price}")
总结:做股票策略时,请认准 m_nOffsetFlag,48 是买,49 是卖!