实盘交易

若策略经过了模拟交易业绩可靠,用户期望可以进行实盘交易,可以同样在notebook环境下进行实盘交易。实盘交易收到证监会严格监管,客户进行实盘交易需要注意如下事项:

  1. 客户需要找证券或者期货公司协助完成开户,并获得CTP程序化交易资格。
  2. 客户必须采用本地Docker部署才可以进行实盘交易,合作方服务器不支持实盘交易。
  3. 客户需要在宽易平台网站获得授权码。
  4. 为了安全起见,客户需要保留手动平仓的app或PC工具以防万一。
  5. 程序虽然支持跨天,但为了安全起见,建议客户每天重启程序。
  6. 本平台实盘交易套件对交易结果免责。

实盘和模拟可以完全共用策略代码。

下面来介绍宽易平台实盘交易的流程。

实盘交易启动流程

还是拿一个最简单策略作为范例

from qereal import *
from qedata import *

#编写实盘交易策略
class mystrat(qeStratBase):
# 策略名mystrat, 带上qeStratBase

    def __init__(self):
        self.holding_flag = False    # 是否有仓位的标识
        self.instid =['AG2206.SFE'] 
        self.datamode = 'minute'
        self.freq = 1


    def onBar(self,context):
        try:
            print(context.bartime, get_bar(context, 1, 5))
            if not self.holding_flag: #如果现在账户中没有仓位,就买入
                make_order(context, instid=context.instid[0], direction=1, price=10000, \
                           volume=1,ordertype='market',action='open')  
                self.holding_flag = True #现在账户下有仓位
            else: #如果现在账户中有仓位,就卖出
                make_order(context, instid=context.instid[0],direction=-1, price=10000, volume=1, \
                           ordertype='market',action='close',closetype='closetoday')
                self.holding_flag = False #现在账户下仓位被清完
        except Exception as e:
            print('handleData error', e.__traceback__.tb_lineno, e)

    def crossDay(self, context):
        cancel_order(context,0)

下面开始进行实盘交易测试

#实盘交易获取用户名
user =  %pwd
user = getuserid(user)

#最后调用执行startRealProcess函数
user_setting = {'investorid': 'username', 'password': '123456', 'broker': 'simnow'}
runStrat(user,'real', mystrat(), real_account=user_setting)

目前支持的“broker”如下

  • 'simnow' 使用simnow仿真ctp测试环境
  • 'simnow_724'使用simnow 7*24小时仿真环境
  • 'cjqh' 使用长江期货实盘环境

在策略Ready的情况下,需要两步:

  1. 需要使用魔法指令%pwd结合getuserid函数来获取合法用户名
  2. 设置 user_setting, 这里参数全部是CTP参数,请联系期货公司确认。
  3. 然后调用统一策略运行函数 runStrat

注:若尚未认证可能无法使用qedata/qereal功能,需要先通过qedata对宽易平台授权码认证,详见 获得授权码

runStrat的详细说明参加实盘接口详细说明

策略运行结果:

策略启动后,会自动生成一个监控网页供客户监控和查询策略运行情况。在网页地址中我们也可以直观的查看用户名,运行模式,investorid和无风险利率。

将该网页地址复制到浏览器地址栏,就可以进入实时监控界面。

注:若中途停止了实盘交易,需要选择Notebook环境菜单“服务”-“重启“, 然后点击 Restart以后才可以再次运行。

实盘交易的实时监控

Notebook中的程序运行过程中可能会出现连接超时或者页面被关闭但交易仍然在后台继续运行的情况.为了可以在无法操作交易界面情况下继续监控交易的运行情况并进行控制,我们需要一个网页版本的监控界面.在实盘交易开始后, 复制交易函数提示的网页链接在浏览器打开,就可以进入实时监控页面.

实时监控页面主要分为三部分:

1.基本信息与总控按钮(蓝色框,查看总资金仓位运行状态和统计信息, 控制进程停止) 2.列表(绿色框,查看成交,委托,持仓,权益和日志详情信息) 3.行情图(红色框,查看行情图和开平仓点)

基本信息与总控

主监控页面,可以进行以下功能: 1.查看当前账户名称,账户总资产价值,策略运行模式(模拟或实盘),进程运行状态 (所有数据动态更新)和回报率,夏普比例等统计信息。(统计信息只有当此账户运行超过2天时才会显示)2.对进程暂停运行操作。 使用部分界面如下

可用操作

点击上图红框中的蓝色按钮,我们可以终止进程。

行情图部分

这里主要用于监控各策略下各合约开平仓情况,以及价格走势图,实时刷新。该图只显示当前交易日信息,并在每日的20点切换交易日,即在每日的20点以后显示的是下一交易日的实时开平仓监控图。

tick级开平仓图

可用操作
  1. 不同策略和不同合约之间的切换

    我们可以通过左上角红框中的下拉框,选择想要查看的策略与合约,在选择合约后,将自动切换成相应合约的开平仓图。

  2. 查看特定时刻的成交信息

    如果我们想查看特定时刻的交易信息,我们可以把鼠标放在特定时刻的交易点上,此时我们可以看到上图红框中的此刻的具体交易信息,比如具体的时间和行情价格等。

  3. 使用游标查看特定时间段的开平仓信息

    如果我们想查看特定时间段内的开平仓信息,我们可以左右滑动上图红框中的两个游标,选择我们想要查看的时间段。在选择完成后只会显示相应时间段的开平仓图。

bar图开平仓图

可用操作

与tick级开平仓图相同。

列表部分

列表页面可以进行以下功能: 该功能主要用于实时监控策略运行时委托/持仓/成交/账户/日志统计情况,该表格只显示当前交易日信息,并在每日的20点切换交易日,即在每日的20点以后显示的是新交易日的实时委托成交表. 委托和成交数据倒序排列,最顶部是最新的数据。在日志表中,可以通过日志表查看系统日志或者客户在策略代码中使用logger产生的日志.日志倒序排列.

成交表

在成交表中我们可以查询所有成交单的具体信息,包含合约名,订单号,时间等。

成交,委托,持仓,权益和日志五张表,可以通过红框内的tab切换,实时刷新。

委托表

在委托表中我们可以查询所有委托单的具体信息,包含合约名,订单号,平仓类型,价格等。

常见错误编号:

▼ 常见错误说明
编号 说明
-1 网络连接失败
-2 未处理请求超标,流控失败
-3 每秒请求超标,流控失败
1~144 CTP回报错误,详见本章附表“CTP常见错误表”

持仓表

在持仓表中我们可以查询当前虚拟账户的持仓信息,包含成本仓位,多头持仓,多头昨仓等。

权益表

在权益表中我们可以查询当前虚拟账户的账户信息,包含资金,当日手续费,保证金等。

日志

在日志表中,可以通过日志表查看系统日志或者客户在策略代码中使用logger产生的日志。日志倒序排列。

页面切换

在成交表,委托表和日志表中,可能会有大量记录,此时表格会对数据自动分页,每页保留100条记录。通过下图红框中的按钮选择想要查看的页数。

用户自定义日志

用户在策略中如果也期望使用日志功能, 把一些关键数据及时打印出来并且可以通过网页监控的话,可以使用如下方法:

代码示例:

vol=100
logger.info(f'The last value of "vol" is {vol}')

说明:

  1. logger已经在qereal中定义可以直接引用。
  2. logger平台支持error, warning, info三种level, 若为info将只记录在网页监控日志里。如果为error, warning在Notebook里面和网页监控里面都会输出。
  3. 参数必须是一个字符串,不可以像print一样多个字符串或变量。
  4. logger日志显示在网页监控日志中, 并输出时间,文件名和所在行数,以便于debug。
  5. logger日志可以保留五天,五天后循环删除。

实盘接口详细说明

获取合法用户名

getuserid(user)

参数:user, str类型。 用魔法函数 %pwd 获取的用户路径

返回值:str类型。 系统合法用户名

示例

user = %pwd
user = getuserid(user)
print(user)

返回值

'scott'

统一策略运行函数

runStrat(user, runmode, strat,  simu_token=None, mode_724=False, csv_orders=False, simu_simnow724_account=None,\          real_account=None, printlog=True, rfrate=0.02, test_dynamic_instid=True,                               test_startdate=None,test_enddate=None,  test_initcap=10000000,test_showchart=False)

详细使用说明如下

函数说明 参数表
参数 类型 回测 模拟 实盘 说明 备注
user str 系统登录用户名,可以通过getuserid函数获取.
runmode str 'test'回测,'simu'模拟,'real'实盘,一个参数切换运行模式.
strat qeStratBase / list qeStratBase派生策略或派生策略的列表,回测只支持单策略,输入列表仅第一项有效,模拟/实盘支持多策略并发
simu_token str 模拟用令牌token。使用createSimuAccount创建的模拟账户时生成。
mode_724 bool 是否使用SIMNOW 7x24小时模拟测试服务.默认False不使用,不使用时非市场开盘时间不可以运行模拟或实盘交易。若为True使用,但需要客户给出SIMNOW账户信息。
csv_orders bool 是否使用csv下单工具.默认False不使用,True为使用,不可用于回测,详见 辅助工具相关说明。
simu_simnow724_account dict 模拟用SIMNOW7*24小时账户信息,当模拟测试时 mode_724为True时,系统将检查该项账户配置,比如{'investorid':'133231','password':’888888'}
real_account dict 实盘交易使用的账户信息。若mode_724为True,该实盘账户应设置为SIMNOW7*24小时账户。详见实盘交易
printlog bool 是否打印开平仓信息和warning信息。默认为True
rfrate float 无风险利率,用于计算sharp比率等,默认2%
test_dynamic_instid bool 是否使用动态合约回测模式,默认为True
test_startdate str 回测数据开始时间,比如'2021-01-01'.test_date不为None,此参数无效
test_enddate str 回测数据结束时间,比如'2021-01-01'.test_date不为None,此参数无效
test_initcap float 回测用初始资金,默认为10000000
test_showchart bool 回测执行结果是否输出三张分析图,默认关闭
real_skip_settle_check bool 是否skip实盘确认昨日结算单过程,默认为False.若用户自行打开设置为True,宽易不对任何结算单相关问题负责。

返回值
若为模拟/实盘模式,无返回值。若为回测模式,运行结束后返回Dict类型的回测报告。有‘Report’,'Orders','Trades','Cancels'四个Key

注意事项

  • 实盘交易在启动后收到首个行情后会自动查询订单,成交,持仓和权益信息,数据更新会有几秒的滞后。

  • usersetting请联系经纪期货公司确认参数, 必须是合法的ctp配置

ctp常见错误编号表

实盘回报错误编号可以查询该表格:

<error id="INVALID_DATA_SYNC_STATUS" value="1" prompt="CTP:不在已同步状态"/>
<error id="INCONSISTENT_INFORMATION" value="2" prompt="CTP:会话信息不一致"/>
<error id="INVALID_LOGIN" value="3" prompt="CTP:不合法的登录"/>
<error id="USER_NOT_ACTIVE" value="4" prompt="CTP:用户不活跃"/>
<error id="DUPLICATE_LOGIN" value="5" prompt="CTP:重复的登录"/>
<error id="NOT_LOGIN_YET" value="6" prompt="CTP:还没有登录"/>
<error id="NOT_INITED" value="7" prompt="CTP:还没有初始化"/>
<error id="FRONT_NOT_ACTIVE" value="8" prompt="CTP:前置不活跃"/>
<error id="NO_PRIVILEGE" value="9" prompt="CTP:无此权限"/>
<error id="CHANGE_OTHER_PASSWORD" value="10" prompt="CTP:修改别人的口令"/>
<error id="USER_NOT_FOUND" value="11" prompt="CTP:找不到该用户"/>
<error id="BROKER_NOT_FOUND" value="12" prompt="CTP:找不到该经纪公司"/>
<error id="INVESTOR_NOT_FOUND" value="13" prompt="CTP:找不到投资者"/>
<error id="OLD_PASSWORD_MISMATCH" value="14" prompt="CTP:原口令不匹配"/>
<error id="BAD_FIELD" value="15" prompt="CTP:报单字段有误"/>
<error id="INSTRUMENT_NOT_FOUND" value="16" prompt="CTP:找不到合约"/>
<error id="INSTRUMENT_NOT_TRADING" value="17" prompt="CTP:合约不能交易"/>
<error id="NOT_EXCHANGE_PARTICIPANT" value="18" prompt="CTP:经纪公司不是交易所的会员"/>
<error id="INVESTOR_NOT_ACTIVE" value="19" prompt="CTP:投资者不活跃"/>
<error id="NOT_EXCHANGE_CLIENT" value="20" prompt="CTP:投资者未在交易所开户"/>
<error id="NO_VALID_TRADER_AVAILABLE" value="21" prompt="CTP:该交易席位未连接到交易所"/>
<error id="DUPLICATE_ORDER_REF" value="22" prompt="CTP:报单错误:不允许重复报单"/>
<error id="BAD_ORDER_ACTION_FIELD" value="23" prompt="CTP:错误的报单操作字段"/>
<error id="DUPLICATE_ORDER_ACTION_REF" value="24" prompt="CTP:撤单已报送,不允许重复撤单"/>
<error id="ORDER_NOT_FOUND" value="25" prompt="CTP:撤单找不到相应报单"/>
<error id="INSUITABLE_ORDER_STATUS" value="26" prompt="CTP:报单已全成交或已撤销,不能再撤"/>
<error id="UNSUPPORTED_FUNCTION" value="27" prompt="CTP:不支持的功能"/>
<error id="NO_TRADING_RIGHT" value="28" prompt="CTP:没有报单交易权限"/>
<error id="CLOSE_ONLY" value="29" prompt="CTP:只能平仓"/>
<error id="OVER_CLOSE_POSITION" value="30" prompt="CTP:平仓量超过持仓量"/>
<error id="INSUFFICIENT_MONEY" value="31" prompt="CTP:资金不足"/>
<error id="DUPLICATE_PK" value="32" prompt="CTP:主键重复"/>
<error id="CANNOT_FIND_PK" value="33" prompt="CTP:找不到主键"/>
<error id="CAN_NOT_INACTIVE_BROKER" value="34" prompt="CTP:设置经纪公司不活跃状态失败"/>
<error id="BROKER_SYNCHRONIZING" value="35" prompt="CTP:经纪公司正在同步"/>
<error id="BROKER_SYNCHRONIZED" value="36" prompt="CTP:经纪公司已同步"/>
<error id="SHORT_SELL" value="37" prompt="CTP:现货交易不能卖空"/>
<error id="INVALID_SETTLEMENT_REF" value="38" prompt="CTP:不合法的结算引用"/>
<error id="CFFEX_NETWORK_ERROR" value="39" prompt="CTP:交易所网络连接失败"/>
<error id="CFFEX_OVER_REQUEST" value="40" prompt="CTP:交易所未处理请求超过许可数"/>
<error id="CFFEX_OVER_REQUEST_PER_SECOND" value="41" prompt="CTP:交易所每秒发送请求数超过许可数"/>
<error id="SETTLEMENT_INFO_NOT_CONFIRMED" value="42" prompt="CTP:结算结果未确认"/>
<error id="DEPOSIT_NOT_FOUND" value="43" prompt="CTP:没有对应的入金记录"/>
<error id="EXCHANG_TRADING" value="44" prompt="CTP:交易所已经进入连续交易状态"/>
<error id="PARKEDORDER_NOT_FOUND" value="45" prompt="CTP:找不到预埋(撤单)单"/>
<error id="PARKEDORDER_HASSENDED" value="46" prompt="CTP:预埋(撤单)单已经发送"/>
<error id="PARKEDORDER_HASDELETE" value="47" prompt="CTP:预埋(撤单)单已经删除"/>
<error id="INVALID_INVESTORIDORPASSWORD" value="48" prompt="CTP:无效的投资者或者密码"/>
<error id="INVALID_LOGIN_IPADDRESS" value="49" prompt="CTP:不合法的登录IP地址"/>
<error id="OVER_CLOSETODAY_POSITION" value="50" prompt="CTP:平今仓位不足"/>
<error id="OVER_CLOSEYESTERDAY_POSITION" value="51" prompt="CTP:平昨仓位不足"/>
<error id="BROKER_NOT_ENOUGH_CONDORDER" value="52" prompt="CTP:经纪公司没有足够可用的条件单数量"/>
<error id="INVESTOR_NOT_ENOUGH_CONDORDER" value="53" prompt="CTP:投资者没有足够可用的条件单数量"/>
<error id="BROKER_NOT_SUPPORT_CONDORDER" value="54" prompt="CTP:经纪公司不支持条件单"/>
<error id="RESEND_ORDER_BROKERINVESTOR_NOTMATCH" value="55" prompt="CTP:重发未知单经纪公司/投资者不匹配"/>
<error id="SYC_OTP_FAILED" value="56" prompt="CTP:同步动态令牌失败"/>
<error id="OTP_MISMATCH" value="57" prompt="CTP:动态令牌校验错误"/>
<error id="OTPPARAM_NOT_FOUND" value="58" prompt="CTP:找不到动态令牌配置信息"/>
<error id="UNSUPPORTED_OTPTYPE" value="59" prompt="CTP:不支持的动态令牌类型"/>
<error id="SINGLEUSERSESSION_EXCEED_LIMIT" value="60" prompt="CTP:用户在线会话超出上限"/>
<error id="EXCHANGE_UNSUPPORTED_ARBITRAGE" value="61" prompt="CTP:该交易所不支持套利/做市商类型报单"/>
<error id="NO_CONDITIONAL_ORDER_RIGHT" value="62" prompt="CTP:没有条件单交易权限"/>
<error id="AUTH_FAILED" value="63" prompt="CTP:客户端认证失败"/>
<error id="NOT_AUTHENT" value="64" prompt="CTP:客户端未认证"/>
<error id="SWAPORDER_UNSUPPORTED" value="65" prompt="CTP:该合约不支持互换类型报单"/>
<error id="OPTIONS_ONLY_SUPPORT_SPEC" value="66" prompt="CTP:该期权合约只支持投机类型报单"/>
<error id="DUPLICATE_EXECORDER_REF" value="67" prompt="CTP:执行宣告错误,不允许重复执行"/>
<error id="RESEND_EXECORDER_BROKERINVESTOR_NOTMATCH" value="68" prompt="CTP:重发未知执行宣告经纪公司/投资者不匹配"/>
<error id="EXECORDER_NOTOPTIONS" value="69" prompt="CTP:只有期权合约可执行"/>
<error id="OPTIONS_NOT_SUPPORT_EXEC" value="70" prompt="CTP:该期权合约不支持执行"/>
<error id="BAD_EXECORDER_ACTION_FIELD" value="71" prompt="CTP:执行宣告字段有误"/>
<error id="DUPLICATE_EXECORDER_ACTION_REF" value="72" prompt="CTP:执行宣告撤单已报送,不允许重复撤单"/>
<error id="EXECORDER_NOT_FOUND" value="73" prompt="CTP:执行宣告撤单找不到相应执行宣告"/>
<error id="OVER_EXECUTE_POSITION" value="74" prompt="CTP:执行仓位不足"/>
<error id="LOGIN_FORBIDDEN" value="75" prompt="CTP:连续登录失败次数超限,登录被禁止"/>
<error id="INVALID_TRANSFER_AGENT" value="76" prompt="CTP:非法银期代理关系"/>
<error id="NO_FOUND_FUNCTION" value="77" prompt="CTP:无此功能"/>
<error id="SEND_EXCHANGEORDER_FAILED" value="78" prompt="CTP:发送报单失败"/>
<error id="SEND_EXCHANGEORDERACTION_FAILED" value="79" prompt="CTP:发送报单操作失败"/>
<error id="PRICETYPE_NOTSUPPORT_BYEXCHANGE" value="80" prompt="CTP:交易所不支持的价格类型"/>
<error id="BAD_EXECUTE_TYPE" value="81" prompt="CTP:错误的执行类型"/>
<error id="BAD_OPTION_INSTR" value="82" prompt="CTP:无效的组合合约"/>
<error id="INSTR_NOTSUPPORT_FORQUOTE" value="83" prompt="CTP:该合约不支持询价"/>
<error id="RESEND_QUOTE_BROKERINVESTOR_NOTMATCH" value="84" prompt="CTP:重发未知报价经纪公司/投资者不匹配"/>
<error id="INSTR_NOTSUPPORT_QUOTE" value="85" prompt="CTP:该合约不支持报价"/>
<error id="QUOTE_NOT_FOUND" value="86" prompt="CTP:报价撤单找不到相应报价"/>
<error id="OPTIONS_NOT_SUPPORT_ABANDON" value="87" prompt="CTP:该期权合约不支持放弃执行"/>
<error id="COMBOPTIONS_SUPPORT_IOC_ONLY" value="88" prompt="CTP:该组合期权合约只支持IOC"/>
<error id="OPEN_FILE_FAILED" value="89" prompt="CTP:打开文件失败"/>
<error id="NEED_RETRY" value="90" prompt="CTP:查询未就绪,请稍后重试"/>
<error id="EXCHANGE_RTNERROR" value="91" prompt="CTP:交易所返回的错误"/>
<error id="QUOTE_DERIVEDORDER_ACTIONERROR" value="92" prompt="CTP:报价衍生单要等待交易所返回才能撤单"/>
<error id="INSTRUMENTMAP_NOT_FOUND" value="93" prompt="CTP:找不到组合合约映射"/>
<error id="CANCELLATION_OF_OTC_DERIVED_ORDER_NOT_ALLOWED" value="94" prompt="CTP:不允许撤销OTC衍生报单"/>
Copyright © QUANTEASE Team all right reserved,powered by Gitbook该文件修订时间: 2023-06-27 16:51:00

results matching ""

    No results matching ""