CTP大坑小坑曝光
记录某些CTP开发过程中遇到的坑(持续更新)
- tick数据中成交量这个数据是当日累加,隔日清零,所以使用tick数据合成bar的时候,成交量需要专门处理。期货的tick数据有ActionDay和TradingDay两个字段,用以区分是否为同一个交易日,但是不同交易所定义方式不同,各位同学要自己注意一下。
//大商所的ActionDay 提前一天,郑商所的TradingDay晚了一天,上期所的正常
//大商所和上期所 只要TradingDay(结算日)相同就是同一日bar的数据
//郑商所TradingDay相同 可能属于不同日的bar TradingDay不同 也有可能属于同一日的bar
if (tick.TradingDay == lastTick.TradingDay)
{
//同日tick
//Logger.Error("{0},{1},{2}", tick.InstrumentId, tick.Volume, lastTick.Volume);
long diffVolume = tick.Volume - lastTick.Volume;
//diffVolume<0 说明是郑商所夜盘的第一个tick
if (diffVolume >= 0)
{
tick.Volume = diffVolume;
}
}
else
{
//不同日tick
//Logger.Debug("tick.volume刷新:当前tick->" + tick.ToString() + " 前一个tick->" + lastTick.ToString() + " 发生时间:" + DateTime.Now);
if(ExchangeID == ExchangeType.CZCE.ToString() & tick.Date.Date != lastTick.Date.Date)
{
//说明是郑商所日盘的第一个tick
//有夜盘的品种直接相减 无夜盘的为真实成交量
if (FunDate.ToDateTime(lastTick.UpdateTime, "HH:mm:ss").Hour>=21)
{
tick.Volume = tick.Volume - lastTick.Volume;
}
}
}
- 平仓操作时,上期所(SHFE) 以及 上期能源(INE)有平今和平昨的区分,当账户只有今仓,但是发出平昨的单子,会报错。