LocalCTP
是一个部署于本地的仿CTP项目。本项目不联网,完全开源,接口完全同CTP,实现了大部分CTP柜台的功能。
如果有意见或建议,请联系作者秋水Aura(QQ 1005018695)。独自制作不易,欢迎打赏投食。
三人行,必有我师焉。欢迎加入QQ群 736174420 一起交流讨论 LocalCTP
。
- 支持全市场的期货/套利组合合约/期权的交易
- 本地部署, 稳定运行, 策略安全得到彻底保障
- 支持
windows
/linux
等多个平台,MAC
也即将支持 - 支持FAK/FOK订单, 支持条件单.
- 成交撮合逻辑同SimNow,通过是否满足行情中的对手价来判断是否成交。
- 可以通过特定API接口来获取外部传入的行情快照,以更新账户的订单和资金等数据
- 可以投喂给它实时行情以实现 实时仿真交易
- 也可以投喂给它历史行情以实现 回测
用LocalCTP它的dll(或so)文件(交易的dll库文件,即 thosttraderapi_se.dll或so
),来替换你使用的CTP的同名的库文件。
请做好原始文件的备份。
使用项目中已经生成好的dll或so,以替换CTP的同名的 交易库文件dll或so。
默认windows版dll(thosttraderapi_se.dll
)是:
- 64位, 使用VS2019和CTP v6.5.1版本头文件编译生成
- (更多版本正在赶来,敬请期待……)
默认linux版so(thosttraderapi_se.so
,前面可能带有lib前缀,不影响使用)是:
- 64位, 使用CTP v6.5.1版本头文件编译生成,在CentOS7.8 和 Ubuntu18.04上测试通过。
- (更多版本正在赶来,敬请期待……)
根据LocalCTP库的代码来编译生成dll或so库并拿来使用,可以自由选择CTP(头文件)的版本和平台位数(32/64)。这种方法适合于有一定动手能力的玩家。
本API默认都是由6.5.1版本头文件编译生成,如需替换为别的API版本,需修改包含目录并重新编译,具体步骤:
Windows:
(生成目录: bin/win/
)
请把 ./LocalCTP/ctp_file/current
设置为你要使用的CTP的版本的头文件文件夹的副本(VS不支持快捷方式作为包含目录)。
Linux:
(生成目录: bin/linux/
通过makefile
文件来make生成)
请把 current
设置为你要使用的CTP的版本的头文件文件夹的副本或软链接。
示例(设为指向 6.3.19 版本的软链接):
cd ./LocalCTP/ctp_file/
ln -snf ./6.3.19 ./current
注:修改 current
指向的版本后,需要重新编译生成dll或so文件。请做好备份。
切换版本后,可能需要将一些API中的新增的接口的虚函数进行实现,或者移除派生类中此前的继承的(已不存在的)虚函数,同时,可能部分函数或字段名称有改动,请根据实际情况来调整。
咱们通过CTP的API去下单,是报单到了CTP服务器,比如SimNow的仿真CTP服务器,或者期货公司的实盘CTP服务器。 而LocalCTP呢,它并不联网,下单时,并不会把你的单子通过网络发出去,它是在API内部,进行撮合和判断成交和更新账户持仓等,然后将成交回报等通过SPI发给用户。
LocalCTP包含交易API,而不包含行情API。 用户可以通过CTP的行情API从实盘获取行情快照来传入LocalCTP中。(友情提示:行情API实盘登录时并不会校验用户名和密码,实盘行情地址可咨询期货公司,也可以加入QQ群获取地址。)
CreateFtdcTraderApi
GetApiVersion
Release
Init
Join
GetTradingDay
RegisterFront
RegisterFensUserInfo
-> 接收行情快照RegisterSpi
ReqAuthenticate
ReqUserLogin
ReqUserLogout
ReqSettlementInfoConfirm
ReqOrderInsert
ReqOrderAction
ReqQryInstrument
ReqQryDepthMarketData
ReqQryInvestor
ReqQryOrder
ReqQryTrade
ReqQryTradingAccount
ReqQryInvestorPosition
ReqQryInvestorPositionDetail
ReqQrySettlementInfo
ReqQrySettlementInfoConfirm
ReqQryClassifiedInstrument
ReqQryExchange
ReqQryProduct
ReqQryMaxOrderVolume
ReqQryInstrumentMarginRate
ReqQryInstrumentCommissionRate
Init
: 内部并不会连接网络,会从当前目录(或环境变量中的目录)的instrument.csv
中读取合约信息。格式参见附带的同名文件。Join
: 会直接返回。GetTradingDay
: 会尽可能正确地返回交易日,无需登录。能处理夜盘(包括周五夜盘)的情况,但无法识别判断长假假期。RegisterFront
: 会直接返回,并不会连接到参数中的地址也不会校验地址合法性。RegisterFensUserInfo
: 【重要】被修改为接收行情快照的接口。内部会将参数转化为CThostFtdcDepthMarketDataField*
类型并处理以更新行情数据,请在外部收到行情快照时调用此接口,使用方法可参考DEMO。ReqAuthenticate/ReqUserLogin/ReqUserLogout
: 都不会校验参数,即都会直接认证/登录/登出成功。ReqOrderInsert
: 支持条件单(支持四种价格条件TThostFtdcContingentConditionType,即用最新价LastPrice和条件价StopPrice的四种比较类型)ReqQryInstrumentMarginRate/ReqQryInstrumentCommissionRate
: 会返回所有符合条件的合约的保证金率或手续费率数据,而不像CTP中只能按合约查询并只返回一条ReqOrderAction
: 支持两种撤单方式:OrderRef + FrontID + SessionID( 还需填IntrumentID )
OrderSysID + ExchangeID
账户初始数据: 所有账户的初始资金都是2000万,初始持仓为空。
所有合约的保证金率全部为10%,手续费全部为1元每手。
持仓和资金,会根据订单、成交和行情数据等来动态更新。
目前版本中,账户数据都不会保存到本地,即退出程序后,账户数据会重置。
下个版本中,账户数据会持久化保存到数据库中,敬请期待哦。