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

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

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

说明:R-Breaker是一种短线日内交易策略,根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为:突破买入价、观察卖出价、反转卖出价、反转买入、观察买入价、突破卖出价。以此来形成当前交易日盘中交易的触发条件。
  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import
  3. import pandas as pd
  4. from gm.api import *
  5. from datetime import datetime, timedelta

  6. """
  7. R-Breaker是一种短线日内交易策略
  8. 根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为:
  9. 突破买入价、观察卖出价、反转卖出价、反转买入、观察买入价、突破卖出价。以此来形成当前交易
  10. 日盘中交易的触发条件。
  11. 追踪盘中价格走势,实时判断触发条件。具体条件如下:
  12. 突破
  13. 在空仓条件下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多。
  14. 在空仓条件下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。
  15. 反转
  16. 持多单,当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位反手做空。
  17. 持空单,当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位反手做多。
  18. 设定止损条件。当亏损达到设定值后,平仓。
  19. 注意:
  20. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
  21. 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交。
  22. 3:本策略使用在15点收盘时全平的方式来处理不持有隔夜单的情况,实际使用中15点是无法平仓的。
  23. """

  24. def init(context):
  25.     # 设置交易品种
  26.     context.symbol = 'SHFE.ag'

  27.     # 设置止损点数
  28.     context.stopLossPrice = 50

  29.     # 获取前一交易日的主力合约
  30.     startDate = get_previous_trading_date(exchange='SHFE', date=context.now.date())
  31.     continuous_contract = get_continuous_contracts(context.symbol, startDate, startDate)
  32.     context.mainContract = continuous_contract[0]['symbol']

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

  35.     # 如果当前时间是非交易时间段,则直接执行algo,以防直接进入on_bar()导致context.bBreak等未定义
  36.     if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00':
  37.         algo(context)

  38.     # 如果是交易时间段,等到开盘时间确保进入algo()
  39.     schedule(schedule_func=algo, date_rule='1d', time_rule='09:00:00')
  40.     schedule(schedule_func=algo, date_rule='1d', time_rule='21:00:00')

  41.     # 订阅行情
  42.     subscribe(continuous_contract[0]['symbol'], frequency='60s', count=1)


  43. def algo(context):
  44.     # 检查主力和约,发生变化则更换订阅
  45.     # 由于主力合约在盘后才公布,为了防止未来函数,选择上一交易日的主力合约。
  46.     startDate = get_previous_trading_date(exchange='SHFE', date=context.now.date())
  47.     contractInfo = get_continuous_contracts(context.symbol, startDate, startDate)

  48.     if context.mainContract != contractInfo[0]['symbol']:
  49.         context.mainContract = contractInfo[0]['symbol']
  50.         subscribe(context.mainContract, frequency='60s', count=1, unsubscribe_previous=True)

  51.     # 获取历史数据
  52.     data = history_n(symbol=context.mainContract, frequency='1d',
  53.                      end_time=context.now, fields='high,low,open,symbol,close', count=2, df=True)

  54.     high = data['high'].iloc[0]  # 前一日的最高价
  55.     low = data['low'].iloc[0]  # 前一日的最低价
  56.     close = data['close'].iloc[0]  # 前一日的收盘价
  57.     pivot = (high + low + close) / 3  # 枢轴点

  58.     context.bBreak = high + 2 * (pivot - low)  # 突破买入价
  59.     context.sSetup = pivot + (high - low)  # 观察卖出价
  60.     context.sEnter = 2 * pivot - low  # 反转卖出价
  61.     context.bEnter = 2 * pivot - high  # 反转买入价
  62.     context.bSetup = pivot - (high - low)  # 观察买入价
  63.     context.sBreak = low - 2 * (high - pivot)  # 突破卖出价
  64.     context.data = data


  65. def on_bar(context, bars):
  66.     # 获取止损价
  67.     STOP_LOSS_PRICE = context.stopLossPrice
  68.     # 设置参数
  69.     bBreak = context.bBreak
  70.     sSetup = context.sSetup
  71.     sEnter = context.sEnter
  72.     bEnter = context.bEnter
  73.     bSetup = context.bSetup
  74.     sBreak = context.sBreak
  75.     data = context.data

  76.     # 获取现有持仓
  77.     position_long = context.account().position(symbol=context.mainContract, side=PositionSide_Long)
  78.     position_short = context.account().position(symbol=context.mainContract, side=PositionSide_Short)

  79.     # 突破策略:
  80.     if not position_long and not position_short:  # 空仓条件下
  81.         if bars[0].close > bBreak:
  82.             # 在空仓的情况下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多
  83.             order_volume(symbol=context.mainContract, volume=10, side=OrderSide_Buy,
  84.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做多
  85.             print("空仓,盘中价格超过突破买入价: 开仓做多")
  86.             context.open_position_price = bars[0].close

  87.         elif bars[0].close < sBreak:
  88.             # 在空仓的情况下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空
  89.             order_volume(symbol=context.mainContract, volume=10, side=OrderSide_Sell,
  90.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做空
  91.             print("空仓,盘中价格跌破突破卖出价: 开仓做空")

  92.             context.open_position_price = bars[0].close

  93.     # 设置止损条件
  94.     else:  # 有持仓时
  95.         # 开仓价与当前行情价之差大于止损点则止损
  96.         if (position_long and context.open_position_price - bars[0].close >= STOP_LOSS_PRICE) or \
  97.                 (position_short and bars[0].close - context.open_position_price >= STOP_LOSS_PRICE):
  98.             print('达到止损点,全部平仓')
  99.             order_close_all()  # 平仓

  100.         # 反转策略:
  101.         if position_long:  # 多仓条件下
  102.             if data.high.iloc[1] > sSetup and bars[0].close < sEnter:
  103.                 # 多头持仓,当日内最高价超过观察卖出价后,
  104.                 # 盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,
  105.                 # 采取反转策略,即在该点位反手做空
  106.                 order_close_all()  # 平仓
  107.                 order_volume(symbol=context.mainContract, volume=10, side=OrderSide_Sell,
  108.                              order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做空
  109.                 print("多头持仓,当日内最高价超过观察卖出价后跌破反转卖出价: 反手做空")
  110.                 context.open_position_price = bars[0].close

  111.         elif position_short:  # 空头持仓
  112.             if data.low.iloc[1] < bSetup and bars[0].close > bEnter:
  113.                 # 空头持仓,当日内最低价低于观察买入价后,
  114.                 # 盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,
  115.                 # 采取反转策略,即在该点位反手做多
  116.                 order_close_all()  # 平仓
  117.                 order_volume(symbol=context.mainContract, volume=10, side=OrderSide_Buy,
  118.                              order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做多
  119.                 print("空头持仓,当日最低价低于观察买入价后超过反转买入价: 反手做多")
  120.                 context.open_position_price = bars[0].close

  121.     if context.now.hour == 14 and context.now.minute == 59:
  122.         order_close_all()
  123.         print('全部平仓')
  124.         context.count = 0


  125. if __name__ == '__main__':
  126.     '''
  127.         strategy_id策略ID,由系统生成
  128.         filename文件名,请与本文件名保持一致
  129.         mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  130.         token绑定计算机的ID,可在系统设置-密钥管理中生成
  131.         backtest_start_time回测开始时间
  132.         backtest_end_time回测结束时间
  133.         backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  134.         backtest_initial_cash回测初始资金
  135.         backtest_commission_ratio回测佣金比例
  136.         backtest_slippage_ratio回测滑点比例
  137.     '''
  138.     run(strategy_id='strategy_id',
  139.         filename='main.py',
  140.         mode=MODE_BACKTEST,
  141.         token='{{token}}',
  142.         backtest_start_time='2019-10-1 15:00:00',
  143.         backtest_end_time='2020-04-16 15:00:00',
  144.         backtest_initial_cash=1000000,
  145.         backtest_commission_ratio=0.0001,
  146.         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

返回列表