期货CTP编程,获取持仓有误(现金酬谢)

wcm7474 2015-11-20 10:36:22
c++做了一层封装,c#编译生成DLL(CTP.dll),然后在C#开发环境调用这个DLL
实时获取行情没有问题
查询账户资金没有问题
就是查询账户持仓有问题
执行函数ReqQryInvestorPositionDetail(请求查询投资者持仓明细)
显示如下:
closeAmount 8.4434170772819677E+153
OpenPrice 1.571105350640002E-73
SettlementPrice 9.6678561549155779E+266
上述字段是double类型,显示东西看不来,openPrice是开仓价,这个数是重要参数,读不准就影响下一步编程,其他字段double类型都没错
这怎么回事
上期所提供的dll已经是最新版本
当现金酬谢
顶贴者有分
...全文
939 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
谭文宏 2019-05-23
  • 打赏
  • 举报
回复
那是double最大值,是无效数据,过滤即可。
喝水不喝茶 2015-11-26
  • 打赏
  • 举报
回复
定个帖
wcm7474 2015-11-25
  • 打赏
  • 举报
回复
作了修改,现在能得到持仓合约名称、持仓方向、持仓手数、就是开仓价格还有问题,比如甲醇1601合约,我开仓价1793,结果opencost显示17930(整十倍),其他类同,这个问题出在哪?还是就是这样的? 关于投资者持仓结构体CThostFtdcInvestorPositionField,c++中声明: struct CThostFtdcInvestorPositionField { ...... TThostFtdcPosiDirectionType PosiDirection;///持仓多空方向 ...... } TThostFtdcPosiDirectionType字段是char型(1个字节)(typedef char TThostFtdcPosiDirectionType;) 对应的C#声明 来自网上的原文,原来出问题时候的声明 我的修改 EnumPosiDirectionType PosiDirection; Byte PosiDirection; 于是所有返回值都正确了,除了开仓价opencost 关于EnumPosiDirectionType,原文如下: public enum struct EnumPosiDirectionType { Net = (Byte)'1',Long = (Byte)'2',Short = (Byte)'3' }; 是枚举,为何跟了struct?? 罗里吧嗦说了这么多,不知道意思说明白了没有,问:我这样的修改对吗,另外如何得到完全正确的开仓价opencost
wcm7474 2015-11-25
  • 打赏
  • 举报
回复
对了补充一句: 开仓价实际以这样的方式得到 openAmount(开仓金额)*0.1(0.1是保证金率) 因为上述修改后,各数据各就各位了。
wcm7474 2015-11-25
  • 打赏
  • 举报
回复
我作了如下修改: public enum struct EnumPosiDirectionType:char { Net = (Byte)'1',Long = (Byte)'2',Short = (Byte)'3' }; 现在一切数据都正常了,除了开价价整十倍,估计就是这个样的 在此之前,我尝试public enum struct EnumPosiDirectionType:byte 就是不对 亏ramontop1提醒这是c++cli代码 c++cli不支持byte,支持一个字节的类型是char,也难怪,脱胎于c++嘛 感谢所有回帖的朋友,特别是ramontop1
ramontop1 2015-11-25
  • 打赏
  • 举报
回复
C++ cli在vs里就是clr,项目要设置好才能编译。
ramontop1 2015-11-25
  • 打赏
  • 举报
回复
public enum struct EnumPosiDirectionType { Net = (Byte)'1',Long = (Byte)'2',Short = (Byte)'3' }; 是C++ cli的enum的定义方式,你一搜就清楚了。 你直接用byte类型替换也可以,只是写C#的时候用到这个成员变量的时候就没有代码提示了,不够友好。 关于opencost,还是先确定C++那层收到的是什么值,然后再说其他的。
ramontop1 2015-11-23
  • 打赏
  • 举报
回复
C#的ThostFtdcInvestorPositionDetailField定义你要根据最新的ctp的struct来自己写,尽量不要直接拿网上的。[StructLayout(LayoutKind::Sequential)]内存是顺序排列,不要调整struct成员的顺序。还有建议用C++ cli。
wcm7474 2015-11-23
  • 打赏
  • 举报
回复
一是查询函数用ReqQryInvestorPosition(查询投资者持仓),而不是ReqQryInvestorPositionDetail(查询投资者持仓明细) 二是c++下的结构体CThostFtdcInvestorPositionField转换到c#下的结构体ThostFtdcInvestorPositionField有问题,以至 c#下的结构体ThostFtdcInvestorPositionField描述: positionDate(持仓日期)实际是开仓价 prePreMargin(上次占用的保证金)实际是开仓手数
wcm7474 2015-11-23
  • 打赏
  • 举报
回复
ramontop1 ,你好,刚刚看到你的回帖,就在刚才,问题已经解决了,正如你所说,是是C++到C#之间的转换有问题
ramontop1 2015-11-23
  • 打赏
  • 举报
回复
是C++到C#之间的转换有问题,还是C++那层收到的数据有问题呢?你可以先确定一下。
wcm7474 2015-11-22
  • 打赏
  • 举报
回复
自己顶,就没有懂的人吗
拜一刀 2015-11-20
  • 打赏
  • 举报
回复
回复竟然被删除了.....根据这贴的信息量,恐怕很难有人回答的出来啊
为轮子而生 2015-11-20
  • 打赏
  • 举报
回复
不妨贴出你的代码看看。 大概有多少误差?
本拉灯 2015-11-20
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
新手帮不上忙,定个帖。
Poopaye 2015-11-20
  • 打赏
  • 举报
回复
我就是来顶个贴的
wcm7474 2015-11-20
  • 打赏
  • 举报
回复
long也不对。 期货价格有带小数的,如铁,胶板 看过几个版本的ctp,该字段都是double
xuzuning 2015-11-20
  • 打赏
  • 举报
回复
整型数有 32位和64位的区别,还有大端序和小端序的区别
wcm7474 2015-11-20
  • 打赏
  • 举报
回复
/// <summary> /// 投资者持仓明细 /// </summary> [StructLayout(LayoutKind::Sequential)] public ref struct ThostFtdcInvestorPositionDetailField { /// <summary> /// 合约代码 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 31)] String^ InstrumentID; /// <summary> /// 经纪公司代码 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 11)] String^ BrokerID; /// <summary> /// 投资者代码 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 13)] String^ InvestorID; /// <summary> /// 投机套保标志 /// </summary> EnumHedgeFlagType HedgeFlag; /// <summary> /// 买卖 /// </summary> EnumDirectionType Direction; /// <summary> /// 开仓日期 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 9)] String^ OpenDate; /// <summary> /// 成交编号 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 21)] String^ TradeID; /// <summary> /// 数量 /// </summary> int Volume; /// <summary> /// 开仓价 /// </summary> int OpenPrice; /// <summary> /// 交易日 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 9)] String^ TradingDay; /// <summary> /// 结算编号 /// </summary> int SettlementID; /// <summary> /// 成交类型 /// </summary> EnumTradeTypeType TradeType; /// <summary> /// 组合合约代码 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 31)] String^ CombInstrumentID; /// <summary> /// 交易所代码 /// </summary> [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 9)] String^ ExchangeID; /// <summary> /// 逐日盯市平仓盈亏 /// </summary> double CloseProfitByDate; /// <summary> /// 逐笔对冲平仓盈亏 /// </summary> double CloseProfitByTrade; /// <summary> /// 逐日盯市持仓盈亏 /// </summary> double PositionProfitByDate; /// <summary> /// 逐笔对冲持仓盈亏 /// </summary> double PositionProfitByTrade; /// <summary> /// 投资者保证金 /// </summary> double Margin; /// <summary> /// 交易所保证金 /// </summary> double ExchMargin; /// <summary> /// 保证金率 /// </summary> double MarginRateByMoney; /// <summary> /// 保证金率(按手数) /// </summary> double MarginRateByVolume; /// <summary> /// 昨结算价 /// </summary> double LastSettlementPrice; /// <summary> /// 结算价 /// </summary> int SettlementPrice; /// <summary> /// 平仓量 /// </summary> int CloseVolume; /// <summary> /// 平仓金额 /// </summary> int CloseAmount; }; 把openPrice改成 int类型,还是不对
加载更多回复(3)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧