CTP 查询黄金etf持仓量查询遇到的问题

期货CTP编程,获取持仓有误(现金酬谢)
c++做了一层封装,c#编译生成DLL(CTP.dll),然后在C#开发环境调用这个DLL
实时获取行情没有问题
查询账户资金没有问题
就是查询账户持仓有问题
执行函数ReqQryInvestorPositionDetail(请求查询投资者持仓明细)
显示如下:
closeAmount&8.
OpenPrice&1.002E-73
SettlementPrice&9.
上述字段是double类型,显示东西看不来,openPrice是开仓价,这个数是重要参数,读不准就影响下一步编程,其他字段double类型都没错
这怎么回事
上期所提供的dll已经是最新版本
当现金酬谢
顶贴者有分
我就是来顶个贴的
该回复于 11:01:37被管理员删除
新手帮不上忙,定个帖。
不妨贴出你的代码看看。&大概有多少误差?
回复竟然被删除了.....根据这贴的信息量,恐怕很难有人回答的出来啊
/s/1hqm9v1q
源代码在这个网盘,期货账户和密码未设置,图片为运行后得到的查询返回值
closeAmount&和&SettlementPrice&都是极大数、OpenPrice&是极小数,明显不对
估计都不是&double&类型,一般交易所提供的都是长整型数
double的精度也就14~15位,
如果不满足,肯定得改方案
把c&API&贴出来看看
///&&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&HedgeF
///&&summary&
///&&/summary&
EnumDirectionType&D
///&&summary&
///&开仓日期
///&&/summary&
[MarshalAs(UnmanagedType::ByValTStr,&SizeConst&=&9)]
String^&OpenD
///&&summary&
///&成交编号
///&&/summary&
[MarshalAs(UnmanagedType::ByValTStr,&SizeConst&=&21)]
String^&TradeID;
///&&summary&
///&&/summary&
///&&summary&
///&开仓价
///&&/summary&
///&&summary&
///&交易日
///&&/summary&
[MarshalAs(UnmanagedType::ByValTStr,&SizeConst&=&9)]
String^&TradingD
///&&summary&
///&结算编号
///&&/summary&
int&SettlementID;
///&&summary&
///&成交类型
///&&/summary&
EnumTradeTypeType&TradeT
///&&summary&
///&组合合约代码
///&&/summary&
[MarshalAs(UnmanagedType::ByValTStr,&SizeConst&=&31)]
String^&CombInstrumentID;
///&&summary&
///&交易所代码
///&&/summary&
[MarshalAs(UnmanagedType::ByValTStr,&SizeConst&=&9)]
String^&ExchangeID;
///&&summary&
///&逐日盯市平仓盈亏
///&&/summary&
double&CloseProfitByD
///&&summary&
///&逐笔对冲平仓盈亏
///&&/summary&
double&CloseProfitByT
///&&summary&
///&逐日盯市持仓盈亏
///&&/summary&
double&PositionProfitByD
///&&summary&
///&逐笔对冲持仓盈亏
///&&/summary&
double&PositionProfitByT
///&&summary&
///&投资者保证金
///&&/summary&
///&&summary&
///&交易所保证金
///&&/summary&
double&ExchM
///&&summary&
///&保证金率
///&&/summary&
double&MarginRateByM
///&&summary&
///&保证金率(按手数)
///&&/summary&
double&MarginRateByV
///&&summary&
///&昨结算价
///&&/summary&
double&LastSettlementP
///&&summary&
///&结算价
///&&/summary&
int&SettlementP
///&&summary&
///&平仓量
///&&/summary&
int&CloseV
///&&summary&
///&平仓金额
///&&/summary&
int&CloseA
把openPrice改成&int类型,还是不对
整型数有&32位和64位的区别,还有大端序和小端序的区别
long也不对。
期货价格有带小数的,如铁,胶板
看过几个版本的ctp,该字段都是double
自己顶,就没有懂的人吗
是C++到C#之间的转换有问题,还是C++那层收到的数据有问题呢?你可以先确定一下。
ramontop1&,你好,刚刚看到你的回帖,就在刚才,问题已经解决了,正如你所说,是是C++到C#之间的转换有问题
一是查询函数用ReqQryInvestorPosition(查询投资者持仓),而不是ReqQryInvestorPositionDetail(查询投资者持仓明细)
二是c++下的结构体CThostFtdcInvestorPositionField转换到c#下的结构体ThostFtdcInvestorPositionField有问题,以至
c#下的结构体ThostFtdcInvestorPositionField描述:
positionDate(持仓日期)实际是开仓价
prePreMargin(上次占用的保证金)实际是开仓手数
C#的ThostFtdcInvestorPositionDetailField定义你要根据最新的ctp的struct来自己写,尽量不要直接拿网上的。[StructLayout(LayoutKind::Sequential)]内存是顺序排列,不要调整struct成员的顺序。还有建议用C++&cli。
作了修改,现在能得到持仓合约名称、持仓方向、持仓手数、就是开仓价格还有问题,比如甲醇1601合约,我开仓价1793,结果opencost显示17930(整十倍),其他类同,这个问题出在哪?还是就是这样的?
关于投资者持仓结构体CThostFtdcInvestorPositionField,c++中声明:
struct&CThostFtdcInvestorPositionField
TThostFtdcPosiDirectionType &&&&&&&&&&&&PosiD///持仓多空方向
TThostFtdcPosiDirectionType字段是char型(1个字节)(typedef&char&TThostFtdcPosiDirectionT)
对应的C#声明
来自网上的原文,原来出问题时候的声明&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&我的修改
EnumPosiDirectionType&&PosiD&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Byte&PosiD
于是所有返回值都正确了,除了开仓价opencost
关于EnumPosiDirectionType,原文如下:
public&enum&struct&EnumPosiDirectionType
Net&=&(Byte)'1',Long&=&(Byte)'2',Short&=&(Byte)'3'
是枚举,为何跟了struct??
罗里吧嗦说了这么多,不知道意思说明白了没有,问:我这样的修改对吗,另外如何得到完全正确的开仓价opencost
public&enum&struct&EnumPosiDirectionType
Net&=&(Byte)'1',Long&=&(Byte)'2',Short&=&(Byte)'3'
是C++&cli的enum的定义方式,你一搜就清楚了。
你直接用byte类型替换也可以,只是写C#的时候用到这个成员变量的时候就没有代码提示了,不够友好。
关于opencost,还是先确定C++那层收到的是什么值,然后再说其他的。
C++&cli在vs里就是clr,项目要设置好才能编译。
我作了如下修改:
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
对了补充一句:
开仓价实际以这样的方式得到
openAmount(开仓金额)*0.1(0.1是保证金率)
因为上述修改后,各数据各就各位了。
即使是一小步也想与你分享帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
主题数:7556&分页:...状态主题发帖时间|&作者评分Like回复最新回复|&作者[..]|&198|&|&6|&|&4|&|&4|&|&5|&|&2|&|&1|&|&0|&|&2|&|&5|&[]|&37|&[]|&10|&[]|&35|&[..]|&183|&[]|&25|&|&1|&|&7|&[]|&21|&[]|&25|&[..]|&93|&|&6|&|&228|&|&1|&|&7|&|&2|&|&1|&|&2|&|&4|&|&8|&|&0|&主题数:7556&分页:...
抽奖到手软!将狂欢进行到底!您现在的位置:>>
>>正文内容
[讨论]CTP返回持仓数据错误? [金字塔]
咨询内容:
10:31:15.146&&& 【后台】IF02 TSellShort 已成功触发下单操作 价格: 数量:2 类型:0 账户:*********158 品种:IF02 10:31:15.146&&& 【后台】指定了委托账户或者组: *********158 10:31:15.146&&& 【后台】CTP组 *********158 下单类型 0 - 0 10:31:15.146&&& 【后台】CTP组 *********158 下单类型 0 - 0 10:31:15.156&&& 【后台】CTP组 *********158 下单类型 0 - 0 10:31:15.156&&& 【后台】CTP组 *********158 下单类型 1 - 1 10:31:15.156&&& 【后台】指定账户 *********158 下单 10:31:15.156&&& 【后台】实际账户 *********158 持仓 2 10:31:15.156&&& 【后台】下单已发送 10:31:15.156&&& 【后台】CTP组 *********158 下单类型 0 - 0 10:31:15.156&&& 【后台】IF02 TSellShort 已成功触发下单操作 价格: 数量:1 类型:0 账户:*********106 品种:IF02 10:31:15.156&&& 【后台】指定了委托账户或者组: *********106 10:31:15.156&&& 【后台】CTP组 *********106 下单类型 0 - 0 10:31:15.156&&& 【后台】CTP组 *********106 下单类型 0 - 0 10:31:15.156&&& 【后台】CTP组 *********106 下单类型 0 - 0 10:31:15.156&&& 【后台】CTP组 *********106 下单类型 0 - 0 10:31:15.156&&& 【后台】CTP组 *********106 下单类型 1 - 1 10:31:15.156&&& 【后台】指定账户 *********106 下单 10:31:15.156&&& 【后台】实际账户 *********106 持仓 1 10:31:15.156&&& 【后台】下单已发送 10:31:15.166&&& 【图表】IF02 运行完毕 10:31:15.166&&& 【图表】IF02 运行完毕 10:31:15.166&&& 【图表】IF02 运行完毕 10:31:15.166&&& 【图表】IF02 运行完毕 10:31:15.166&&& 【下单】IF02 价 量2 买卖0 类型0 开平2 账户*********158 Formula 1 10:31:15.166&&& 【下单】IF02 价 量1 买卖0 类型0 开平2 账户*********106 Formula 1 10:31:15.206&&& 【后台】IF02 运行结束 10:31:15.226&&& 【回报】*********158 : IF1202 - 综合交易平台:平仓量超过持仓量 10:31:15.226&&& 【回报】*********106 : IF1202 - 已报单 1 价格:2532.2 平 买 10:31:15.376&&& 【回报】*********106 : IF1202 - 已成交 1 价格:2532.2 平 买
本来两个帐户是同步的
结果158的帐户一单没平掉~持仓出现错误
查了orderlog发现是这个问题~
似乎CTP返回的持仓数据都有问题啊...
这是个小概率~
但是总之是发生了...
出资人找我麻烦...
我只有找金字塔麻烦了...
金字塔客服:
建议升级到2.81版看看。
此外,在多帐户同时交易时候,是会有个别帐户出现成交回报不准而导致的持仓计算问题的。
所以建议尽可能的少用多帐户交易,或者控制多帐户同时并发下单的数量
[此贴子已经被作者于 12:57:58编辑过]
用户回复:
此外,自动交易的同时,人工的监控是非常有必要的,强烈不建议所谓无人值守的印钞机行为
网友回复:
以下是引用王锋在 13:01:04的发言:
此外,自动交易的同时,人工的监控是非常有必要的,强烈不建议所谓无人值守的印钞机行为
BUG无所不在~
其实也不一定100%是金字塔软件的原因~
我能理解金字塔软件~大家好歹也算都是编程人员~
但是出资人可不会这么通情达理的理解我~
所以我一直建议金字塔修改一下多帐户操作时的界面方便监控~
我这个建议喊了一年了~...别逼我挖坟把老帖子全顶上去...
/bbs/dispbbs.asp?BoardID=2&ID=9277&skin=0
[建议]能否弄个多帐户持仓一览表?
Post By: 10:01:49 [只看该作者]
/bbs/dispbbs.asp?BoardID=2&ID=6928&replyID=&skin=1
[求助]实盘图表多帐户操作又出现了问题
Post By: 13:16:06 [只看该作者]
/bbs/dispbbs.asp?BoardID=2&ID=5721&replyID=&skin=1
[求助]实盘多帐户操作出现问题~建议多账户操作的界面改动
Post By: 13:02:09 [只看该作者]
网友回复:
多帐户持仓2.8版已经增加了
其他的问题,2.81版已经修正了由于无效报单而导致的平仓单被占用而导致交易系统查询持仓显示的问题
【字体: 】【】【】
没有相关内容
本月热门排行
会员登录/注册帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:5&分页:泥塑发信人: dawn123456 (泥塑), 信区: ProgramTrading
标&&题: CTP 接口查询持仓问题?
发信站: 水木社区 (Mon Oct 21 21:37:11 2013), 站内 && 看CTP的接口,在查询参数中并没有指定持仓多空方向,这样如何查询一个合约的多仓和空仓啊。附上返回的结构类型说明:
///投资者持仓
struct CThostFtdcInvestorPositionField
{ &&&& ///合约代码 &&&& TThostFtdcInstrumentIDType&&&&InstrumentID; &&&& ///经纪公司代码 &&&& TThostFtdcBrokerIDType&&&&BrokerID; &&&& ///投资者代码 &&&& TThostFtdcInvestorIDType&&&&InvestorID; &&&& ///持仓多空方向 &&&& TThostFtdcPosiDirectionType&&&&PosiD &&&& ///投机套保标志 &&&& TThostFtdcHedgeFlagType&&&&HedgeF &&&& ///持仓日期 &&&& TThostFtdcPositionDateType&&&&PositionD &&&& ///上日持仓 &&&& TThostFtdcVolumeType&&&&YdP &&&& ///今日持仓 &&&& TThostFtdcVolumeType&&&&P &&&& ///多头冻结 &&&& TThostFtdcVolumeType&&&&LongF &&&& ///空头冻结 &&&& TThostFtdcVolumeType&&&&ShortF &&&& ///开仓冻结金额 &&&& TThostFtdcMoneyType&&&&LongFrozenA &&&& ///开仓冻结金额 &&&& TThostFtdcMoneyType&&&&ShortFrozenA &&&& ///开仓量 &&&& TThostFtdcVolumeType&&&&OpenV &&&& ///平仓量 &&&& TThostFtdcVolumeType&&&&CloseV &&&& ///开仓金额 &&&& TThostFtdcMoneyType&&&&OpenA &&&& ///平仓金额 &&&& TThostFtdcMoneyType&&&&CloseA &&&& ///持仓成本 &&&& TThostFtdcMoneyType&&&&PositionC &&&& ///上次占用的保证金 &&&& TThostFtdcMoneyType&&&&PreM &&&& ///占用的保证金 &&&& TThostFtdcMoneyType&&&&UseM &&&& ///冻结的保证金 &&&& TThostFtdcMoneyType&&&&FrozenM &&&& ///冻结的资金 &&&& TThostFtdcMoneyType&&&&FrozenC &&&& ///冻结的手续费 &&&& TThostFtdcMoneyType&&&&FrozenC &&&& ///资金差额 &&&& TThostFtdcMoneyType&&&&CashIn; &&&& ///手续费 &&&& TThostFtdcMoneyType&&&&C &&&& ///平仓盈亏 &&&& TThostFtdcMoneyType&&&&CloseP &&&& ///持仓盈亏 &&&& TThostFtdcMoneyType&&&&PositionP &&&& ///上次结算价 &&&& TThostFtdcPriceType&&&&PreSettlementP &&&& ///本次结算价 &&&& TThostFtdcPriceType&&&&SettlementP &&&& ///交易日 &&&& TThostFtdcDateType&&&&TradingD &&&& ///结算编号 &&&& TThostFtdcSettlementIDType&&&&SettlementID; &&&& ///开仓成本 &&&& TThostFtdcMoneyType&&&&OpenC &&&& ///交易所保证金 &&&& TThostFtdcMoneyType&&&&ExchangeM &&&& ///组合成交形成的持仓 &&&& TThostFtdcVolumeType&&&&CombP &&&& ///组合多头冻结 &&&& TThostFtdcVolumeType&&&&CombLongF &&&& ///组合空头冻结 &&&& TThostFtdcVolumeType&&&&CombShortF &&&& ///逐日盯市平仓盈亏 &&&& TThostFtdcMoneyType&&&&CloseProfitByD &&&& ///逐笔对冲平仓盈亏 &&&& TThostFtdcMoneyType&&&&CloseProfitByT &&&& ///今日持仓 &&&& TThostFtdcVolumeType&&&&TodayP &&&& ///保证金率 &&&& TThostFtdcRatioType&&&&MarginRateByM &&&& ///保证金率(按手数) &&&& TThostFtdcRatioType&&&&MarginRateByV
}; && 那么在一次查询中,比如IF1401这个合约,我既有空仓,又有多仓,要怎么查询才能获取,求帮助
-- && ※ 来源:·水木社区 ·[FROM: 111.196.196.*]
方寸纵横发信人: enceladus (我爱小母牛), 信区: ProgramTrading
标&&题: Re: CTP 接口查询持仓问题?
发信站: 水木社区 (Tue Oct 22 09:03:02 2013), 站内 &&&&&&没仔细看文档. &&我记得持仓查询有概要/detail模式. &&detail模式下可以查到每个单独持仓的内容, 比如开仓时间,价位,数量等等 &&概要模式下应该是空头总数和多头总数, 我猜的 &&所以返回的应当是一个持仓列表(数组). 这个也是猜得. && && 【 在 dawn123456 的大作中提到: 】
: 看CTP的接口,在查询参数中并没有指定持仓多空方向,这样如何查询一个合约的多仓和空仓啊。附上返回的结构类型说明:
: ///投资者持仓
: struct CThostFtdcInvestorPositionField
: ...................
&& -- && #-*- 靠天吃饭 -*-
#机械运动中 &&&& ※ 来源:·水木社区 ·[FROM: 221.12.37.*]
泥塑发信人: dawn123456 (泥塑), 信区: ProgramTrading
标&&题: Re: CTP 接口查询持仓问题?
发信站: 水木社区 (Tue Oct 22 20:59:04 2013), 站内 && 我看了看持仓明细,也没有多仓和和空仓。如果是列表,那返回方法的参数是个指针。求开发过的人指导一下,谢谢
///请求查询投资者持仓响应 &&&& virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {}; &&&& ///请求查询投资者持仓明细响应
virtual void OnRspQryInvestorPositionDetail(CThostFtdcInvestorPositionDetailField *pInvestorPositionDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
-- && ※ 来源:·水木社区 ·[FROM: 114.250.102.*]
方寸纵横发信人: enceladus (我爱小母牛), 信区: ProgramTrading
标&&题: Re: CTP 接口查询持仓问题?
发信站: 水木社区 (Tue Oct 22 23:20:38 2013), 站内 &&&&&&查了下文档. &&1. 不论是概要还是明细, 查询时都没有指定多空的字段. &&2. 每个查询都有可能回调多个OnRspQry....., 通过bIsLast来判断返回的数据是不是最后一条 &&3. 每次回调都给出一个持仓记录 &&&&所以对于某合约多个持仓记录的情况,只能在OnRspQry...里面自己保存并且计数. 然后通过bIsLast来判断记录是否已经接收完毕. &&&&这个接口看起来有点琐碎.但是感觉上能保持数据块大小一致. && 【 在 dawn123456 的大作中提到: 】
: 我看了看持仓明细,也没有多仓和和空仓。如果是列表,那返回方法的参数是个指针。求开发过的人指导一下,谢谢
: ///请求查询投资者持仓响应
:&&&& virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
: ...................
&& -- && #-*- 靠天吃饭 -*-
#机械运动中 &&&& ※ 来源:·水木社区 ·[FROM: 115.215.237.*]
天天被洗发信人: tsypy (天天被洗), 信区: ProgramTrading
标&&题: Re: CTP 接口查询持仓问题?
发信站: 水木社区 (Wed Oct 23 09:19:59 2013), 站内 && 自己保存到本地,然后需要的时候去遍历查询。没有新的成交的情况下,本地已有的不需要变。
-- && ※ 来源:·水木社区 ·[FROM: 123.122.1.*]
文章数:5&分页:
抽奖到手软!将狂欢进行到底!→ 追单失败,显示CTP:平仓量超过持仓量
&&共有<b style="color:#ff人关注过本帖主题:追单失败,显示CTP:平仓量超过持仓量
金字塔―专业程序化交易量化投资平台产品部
-----------------------------------------------------------
欢迎您参加我公司的技术培训,具体培训需求请发邮件到
您的宝贵建议或者投诉,请发往邮箱:
金字塔―专业程序化交易量化投资平台产品部
-----------------------------------------------------------
欢迎您参加我公司的技术培训,具体培训需求请发邮件到
您的宝贵建议或者投诉,请发往邮箱:
金字塔―专业程序化交易量化投资平台产品部
-----------------------------------------------------------
欢迎您参加我公司的技术培训,具体培训需求请发邮件到
您的宝贵建议或者投诉,请发往邮箱:

我要回帖

更多关于 ctp 查询合约 的文章

 

随机推荐