微信公众号AlgoPlus 您的认可是我们最大的动力! 欢迎关注、点赞、转发、收藏! 将AlgoPlus设为星标,及时获取最新研究成果!
1、Simnow是上海期货交易所旗下技术公司维护的一套模拟交易系统,只需注册账号即可免费使用:http://www.simnow.com.cn/ 2、在常用下载页面下载客户端,方便实时查看模拟交易情况:http://www.simnow.com.cn/static/softwareDownload.action
3、记录个人主页中的InvestrorID,以及产品与服务页面中的服务器地址。配置账户参数时需要使用这些信息。
另外,如果偶遇simnow官网无法登录的情况,在AlgoPlus公众号回复simnow,可获取服务器相关参数。
好交易不求甚解安装法:
pip install命令安装: pip install AlgoPlus easy_install命令安装: easy_install AlgoPlusWindows系统编译安装
1、安装Visual Studio 2019
微软官网地址:https://visualstudio.microsoft.com/zh-hans/downloads/
6.65GB!如果对VS没有其他需求,建议选择在线安装。 2、下载AlgoPlus
码云(推荐):https://gitee.com/AlgoPlus/AlgoPlus
GitHub(慢):https://github.com/CTPPlus/AlgoPlus
3、在Windows系统安装
① 解压AlgoPlus
② 双击运行\AlgoPlus\tools\ctp\install_ctp.bat
如果你看到了:
Traceback (most recent call last): File "setup.py", line 7, in <module> from Cython.Build import cythonize, build_ext ModuleNotFoundError: No module named 'Cython' Traceback (most recent call last): File "setup.py", line 7, in <module> from Cython.Build import cythonize, build_ext ModuleNotFoundError: No module named 'Cython'我好像也发现了什么。好吧,请执行以下代码安装Cython后,再次运行安装脚本:
conda install Cython当你看到以下内容时:
Processing dependencies for AlgoPlus==1.5 Finished processing dependencies for AlgoPlus==1.5 请按任意键继续. . .恭喜你!你已成为AlgoPlus的一员了!让我们一起将交易进行到底!
如果幸运女神再次眷顾了你,给了我们再次深入交流的机会,那还等什么,房间都开好了(http://www.ctp.plus)。
我推荐使用PyCharm。
官网地址 https://www.jetbrains.com/pycharm/download/#section=windows
Community版与Professional版有什么区别呢?能省不少钱呐。
安装
根据提示完成安装,遇到Installation Options时,勾选以下选项:
为AlgoPlus项目配置解释器
1、找到解压后的AlgoPlus文件夹,鼠标右键单击根目录空白处;
2、单击菜单中【Open Folder as Project】选项;
3、在新窗口单击File菜单中的【Settings…】选项;
4、找到【Project: AlgoPlus】下的【Project Interpreter】,选择python解释器环境;
5、单击【Apply】。
print hello world!
作为“程序员”,不把hello world打印出来怎么能彰显bigger呢。瞧,代码我都准备好了,就是这么贴心!
1、在AlgoPlus项目中打开\exemplification\1环境配置与安装\hello world.py;
2、鼠标右键单击文件内任意位置;
3、单击新菜单中的【Run ‘hello world’】。
存放目录:
\AlgoPlus\exemplification\6报单(买卖开平)及回报\account_info.py源代码:
# -*- coding: utf-8 -*- BASE_LOCATION = "." # 根目录地址 MD_LOCATION = BASE_LOCATION + "\\MarketData" # 行情数据地址 TD_LOCATION = BASE_LOCATION + "\\TradingData" # 交易数据地址 SD_LOCATION = BASE_LOCATION + "\\StrategyData" # 策略数据地址 class FutureAccountInfo: def __init__(self, broker_id, server_dict, reserve_server_dict, investor_id, password, app_id, auth_code, instrument_id_list, md_page_dir=MD_LOCATION, td_page_dir=TD_LOCATION): self.broker_id = broker_id # 期货公司BrokerID self.server_dict = server_dict # 服务器地址。TDServer为交易服务器,MDServer为行情服务器。服务器地址格式为"ip:port" self.reserve_server_dict = reserve_server_dict # 备用服务器地址 self.investor_id = investor_id # 账户 self.password = password # 密码 self.app_id = app_id # 认证使用AppID self.auth_code = auth_code # 认证使用授权码 self.instrument_id_list = instrument_id_list # 订阅合约列表[] self.md_page_dir = md_page_dir # MdApi流文件存储地址,默认MD_LOCATION self.td_page_dir = td_page_dir # TraderApi流文件存储地址,默认TD_LOCATION my_future_account_info_dict = { # 交易时间测试 'SimNow': FutureAccountInfo( broker_id='9999' # 期货公司BrokerID # TDServer为交易服务器,MDServer为行情服务器。服务器地址格式为"ip:port" , server_dict={'TDServer': "180.168.146.187:10100", 'MDServer': '180.168.146.187:10110'} # 备用服务器地址 , reserve_server_dict={'电信1': {'TDServer': "180.168.146.187:10100", 'MDServer': '180.168.146.187:10110'}, '电信2': {'TDServer': "180.168.146.187:10101", 'MDServer': '180.168.146.187:10111'}, '其他1': {'TDServer': "180.168.146.187:10130", 'MDServer': '180.168.146.187:10131'}, # 7*24 '其他2': {'TDServer': "218.202.237.33:10102", 'MDServer': '218.202.237.33:10112'}, # 移动 } , investor_id='' # 账户 , password='' # 密码 , app_id='simnow_client_test' # 认证使用AppID , auth_code='0000000000000000' # 认证使用授权码 # 订阅合约列表 , instrument_id_list=[b'rb2001', b'ni2001', b'ag1912', b'j2001', b'TA001'] ), }说明:
1、FutureAccountInfo类定义了期货账户的所有属性;
2、my_future_account_info_dict是所有账户类的字典。使用时根据键值获取对应账户类属性。
3、MdApi实例会生成DialogRsp.con、QueryRsp.con、TradingDay.con三个流文件,存储在MD_LOCATION目录中,默认是当前目录下的MarketData文件夹。TraderApi实例会生成DialogRsp.con、Private.con、Public.con、QueryRsp.con、TradingDay.con五个流文件,存储在TD_LOCATION目录中,默认是当前目录下的TradingData文件夹。
4、实盘账户参数可从期货公司获取。
5、关于看穿式监管认证,我们会未来给大家讲解。
6、范例配置的是Simnow模拟账户。在补充账户investor_id、密码password和服务器地址server_dict(交易时间选择电信1/电信2/其他2,非交易时间选择其他1。7*24服务器在注册3个交易日后才能使用。)之后,就可以进行下一步了。
7、账户参数还可以被存储为其他形式。如果大家感兴趣,我们未来会写一个用json文件保存账户参数的例子。
存放目录:
\AlgoPlus\exemplification\6报单(买卖开平)及回报\trader_engine.py源代码:
# -*- coding: utf-8 -*- from AlgoPlus.CTP.TraderApi import TraderApi from AlgoPlus.CTP.ApiStruct import * import time class TraderEngine(TraderApi): def __init__(self, td_server, broker_id, investor_id, password, app_id, auth_code, md_queue=None , page_dir='', private_resume_type=2, public_resume_type=2): self.order_ref = 0 self.Join() # 报单 def insert_order(self, exchange_ID, instrument_id, order_price, order_vol, order_ref, direction, offset_flag): pBuyOpen = InputOrderField( BrokerID=self.broker_id, InvestorID=self.investor_id, ExchangeID=exchange_ID, InstrumentID=instrument_id, UserID=self.investor_id, OrderPriceType="2", Direction=direction, CombOffsetFlag=offset_flag, CombHedgeFlag="1", LimitPrice=order_price, VolumeTotalOriginal=order_vol, TimeCondition="3", VolumeCondition="1", MinVolume=1, ContingentCondition="1", StopPrice=0, ForceCloseReason="0", IsAutoSuspend=0, OrderRef=str(order_ref), ) l_retVal = self.ReqOrderInsert(pBuyOpen) # 买开仓 def buy_open(self, exchange_ID, instrument_id, order_price, order_vol, order_ref): self.insert_order(exchange_ID, instrument_id, order_price, order_vol, order_ref, '0', '0') # 卖开仓 def sell_open(self, exchange_ID, instrument_id, order_price, order_vol, order_ref): self.insert_order(exchange_ID, instrument_id, order_price, order_vol, order_ref, '1', '0') # 买平仓 def buy_close(self, exchange_ID, instrument_id, order_price, order_vol, order_ref): if exchange_ID == "SHFE" or exchange_ID == "INE": self.insert_order(exchange_ID, instrument_id, order_price, order_vol, order_ref, '0', '3') else: self.insert_order(exchange_ID, instrument_id, order_price, order_vol, order_ref, '0', '1') # 卖平仓 def sell_close(self, exchange_ID, instrument_id, order_price, order_vol, order_ref): if exchange_ID == "SHFE" or exchange_ID == "INE": self.insert_order(exchange_ID, instrument_id, order_price, order_vol, order_ref, '1', '3') else: self.insert_order(exchange_ID, instrument_id, order_price, order_vol, order_ref, '1', '1') def Join(self): while True: if self.status == 0: # ############################################################################# # # 涨停买开仓 self.order_ref += 1 self.buy_open(test_exchange_id, test_instrument_id, test_raise_limited, test_vol, self.order_ref) self._write_log(f"=>发出涨停买开仓请求!10秒后后进行卖平仓测试。") time.sleep(10) # 跌停卖平仓 self.order_ref += 1 self.sell_close(test_exchange_id, test_instrument_id, test_fall_limited, test_vol, self.order_ref) self._write_log(f"=>发出跌停卖平仓请求!10秒后进行卖开仓测试。") time.sleep(10) # ############################################################################# # # 跌停卖开仓 self.order_ref += 1 self.sell_open(test_exchange_id, test_instrument_id, test_fall_limited, test_vol, self.order_ref) self._write_log(f"=>发出跌停卖平仓请求!10秒后进行买平仓测试。") time.sleep(10) # 涨停买平仓 self.order_ref += 1 self.buy_close(test_exchange_id, test_instrument_id, test_raise_limited, test_vol, self.order_ref) self._write_log(f"=>发出涨停买平仓请求!") time.sleep(10) # ############################################################################# # print("老爷,这里的测试工作AlgoPlus已经按照您的吩咐全部完成!") print("老爷,这里的测试工作AlgoPlus已经按照您的吩咐全部完成!") break time.sleep(1) # ############################################################################# # # 请在这里填写需要测试的合约数据 # 警告:该例子只支持上期所品种平今仓测试 test_exchange_id = 'SHFE' # 交易所 test_instrument_id = 'rb2001' # 合约代码 test_raise_limited = 3708 # 涨停板 test_fall_limited = 3159 # 跌停板 test_vol = 1 # 报单手数 if __name__ == "__main__": import sys sys.path.append("..") from account_info import my_future_account_info_dict future_account = my_future_account_info_dict['SimNow24'] ctp_trader = TraderEngine(future_account.server_dict['TDServer'] , future_account.broker_id , future_account.investor_id , future_account.password , future_account.app_id , future_account.auth_code , None , future_account.td_page_dir)说明:
1、先配置102-106行测试合约的参数。
2、测试交易的逻辑是:确认结算单完成后,先以涨停板买开仓,3秒后以跌停板卖平仓,再3秒后以跌停板卖开仓,再3秒后以涨停板买平仓。最后等待3秒退出程序。