微信公众号AlgoPlus
您的认可是我们最大的动力!
欢迎关注、点赞、转发、收藏!
将AlgoPlus设为星标,及时获取最新研究成果!
注册Simnow模拟账号
1、Simnow是上海期货交易所旗下技术公司维护的一套模拟交易系统,只需注册账号即可免费使用:http://www.simnow.com.cn/
2、在常用下载页面下载客户端,方便实时查看模拟交易情况:http://www.simnow.com.cn/static/softwareDownload.action
3、记录个人主页中的InvestrorID,以及产品与服务页面中的服务器地址。配置账户参数时需要使用这些信息。
另外,如果偶遇simnow官网无法登录的情况,在AlgoPlus公众号回复simnow,可获取服务器相关参数。
安装AlgoPlus
好交易不求甚解安装法:
- pip install命令安装:
pip install AlgoPlus
- easy_install命令安装:
easy_install AlgoPlus
Windows系统编译安装
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秒退出程序。