: | : | :期货程序化 | :期货程序化研究 | :期货量化学习 | :期货量化 |
返回列表 发帖

[模板与范例参考] Dual Thrust(期货)Python策略源码模板【东方财富Python量化】

[模板与范例参考] Dual Thrust(期货)Python策略源码模板【东方财富Python量化】

说明:计算前N天的最高价 - 收盘价 和 收盘价 - 最低价。 然后 取这个2N个价差的最大值,乘以K,然后把结果称为触发值。以生成进场点。
  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import
  3. from gm.api import *


  4. """
  5. Dual Thrust是一个趋势跟踪系统
  6. 计算前N天的最高价-收盘价和收盘价-最低价。然后取这2N个价差的最大值,乘以k值。把结果称为触发值。
  7. 在今天的开盘,记录开盘价,然后在价格超过上轨(开盘+触发值)时马上买入,或者价格低于下轨(开盘-触发值)时马上卖空。
  8. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有空单,则平空开多。
  9. 同理,如果在价格低于(开盘-触发值)时手上有多单,则平多开空。
  10. 选用了SHFE的rb2010 在2020-02-07 15:00:00 到 2020-04-15 15:00:00' 进行回测。
  11. 注意:
  12. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
  13. 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交
  14. """


  15. # 策略中必须有init方法
  16. def init(context):
  17.     # 设置要进行回测的合约(可以在掘金终端的仿真交易中查询标的代码)
  18.     context.symbol = 'SHFE.rb2010'  # 订阅&交易标的, 此处订阅的是上期所的螺纹钢 2010

  19.     # 设置参数
  20.     context.N = 5
  21.     context.k1 = 0.2
  22.     context.k2 = 0.2

  23.     # 获取当前时间
  24.     time = context.now.strftime('%H:%M:%S')

  25.     # 如果策略执行时间点是交易时间段,则直接执行algo定义buy_line和sell_line,以防直接进入on_bar()导致context.buy_line和context.sell_line未定义
  26.     if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00':
  27.         algo(context)

  28.     # 如果是交易时间段,等到开盘时间确保进入algo()
  29.     schedule(schedule_func=algo, date_rule='1d', time_rule='09:00:00')
  30.     schedule(schedule_func=algo, date_rule='1d', time_rule='21:00:00')
  31.     # 只需要最新价,所以只需要订阅一个, 如果用tick,次数太多,用一分钟线代替
  32.     subscribe(symbols=context.symbol, frequency='60s', count=1)


  33. def algo(context):
  34.     # 取历史数据
  35.     data = history_n(symbol=context.symbol, frequency='1d', end_time=context.now,
  36.                      fields='symbol,open,high,low,close', count=context.N + 1, df=True)
  37.     # 取开盘价
  38.     # 回测模式下,开盘价可以直接用history_n取到
  39.     if context.mode == 2:
  40.         # 获取当天的开盘价
  41.         current_open = data.open.loc[0]
  42.         # 去掉当天的实时数据
  43.         data.drop(context.N, inplace=True)

  44.     # 如果是实时模式,开盘价需要用current取到
  45.     else:
  46.         # 获取当天的开盘价
  47.         current_open = current(context.symbol)[0]['open']

  48.     # 计算Dual Thrust 的上下轨
  49.     HH = data['high'].max()
  50.     HC = data['close'].max()
  51.     LC = data['close'].min()
  52.     LL = data['low'].min()
  53.     range = max(HH - LC, HC - LL)
  54.     context.buy_line = current_open + range * context.k1  # 上轨
  55.     context.sell_line = current_open - range * context.k2  # 下轨


  56. def on_bar(context, bars):
  57.     # 取出订阅的这一分钟的bar
  58.     bar = bars[0]

  59.     # 取出买卖线
  60.     buy_line = context.buy_line
  61.     sell_line = context.sell_line

  62.     # 获取现有持仓
  63.     position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  64.     position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)

  65.     # 交易逻辑部分
  66.     # 如果超过range的上界
  67.     if bar.close > buy_line:
  68.         if position_long:  # 已经持有多仓,直接返回
  69.             return

  70.         elif position_short:  # 已经持有空仓,平仓再做多。
  71.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  72.                          order_type=OrderType_Market, position_effect=PositionEffect_Close)
  73.             print('市价单平空仓', context.symbol)
  74.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  75.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)
  76.             print('市价单开多仓', context.symbol)

  77.         else:  # 没有持仓时,市价开多。
  78.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  79.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)
  80.             print('市价单开多仓', context.symbol)

  81.     # 如果低于range的下界
  82.     elif bar.close < sell_line:
  83.         if position_long:  # 已经持有多仓, 平多再开空。
  84.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  85.                          order_type=OrderType_Market, position_effect=PositionEffect_Close)
  86.             print('市价单平多仓', context.symbol)
  87.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  88.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)
  89.             print('市价单开空仓', context.symbol)

  90.         elif position_short:  # 已经持有空仓,直接返回。
  91.             return

  92.         else:  # 没有持仓,直接开空
  93.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  94.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)
  95.             print('市价单开空仓', context.symbol)


  96. if __name__ == '__main__':
  97.     '''
  98.         strategy_id策略ID,由系统生成
  99.         filename文件名,请与本文件名保持一致
  100.         mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  101.         token绑定计算机的ID,可在系统设置-密钥管理中生成
  102.         backtest_start_time回测开始时间
  103.         backtest_end_time回测结束时间
  104.         backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  105.         backtest_initial_cash回测初始资金
  106.         backtest_commission_ratio回测佣金比例
  107.         backtest_slippage_ratio回测滑点比例
  108.     '''
  109.     run(strategy_id='strategy_id',
  110.         filename='main.py',
  111.         mode=MODE_BACKTEST,
  112.         token='{{token}}',
  113.         backtest_start_time='2020-02-07 15:00:00',
  114.         backtest_end_time='2020-04-15 15:00:00',
  115.         backtest_initial_cash=30000,
  116.         backtest_commission_ratio=0.0001,
  117.         backtest_slippage_ratio=0.0001)
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表