《AlgoPlus使用手册》之全天候模拟测试

微信公众号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秒退出程序。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AlgoPlus/article/details/102237296
今日推荐