PDF下载 下载

R-Breaker(期货)

阅读 544
  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
  6. """
  7. R-Breaker是一种短线日内交易策略
  8. 根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为:
  9. 突破买入价、观察卖出价、反转卖出价、反转买入、观察买入价、突破卖出价。以此来形成当前交易
  10. 日盘中交易的触发条件。
  11. 追踪盘中价格走势,实时判断触发条件。具体条件如下:
  12. 突破
  13. 在空仓条件下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多。
  14. 在空仓条件下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。
  15. 反转
  16. 持多单,当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位反手做空。
  17. 持空单,当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位反手做多。
  18. 设定止损条件。当亏损达到设定值后,平仓。
  19. 选用了SHFE的rb2010 在2019-10-1 15:00:00 到 2020-04-16 15:00:00 进行回测。
  20. 注意:
  21. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
  22. 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交。
  23. 3:本策略使用在15点收盘时全平的方式来处理不持有隔夜单的情况,实际使用中15点是无法平仓的。
  24. """
  25. # 策略中必须有init方法
  26. def init(context):
  27. # 设置交易品种
  28. context.symbol = 'SHFE.rb'
  29. # 设置止损点数
  30. context.stopLossPrice = 50
  31. # 获取当时的主力合约
  32. startDate = datetime.strptime(context.backtest_start_time, '%Y-%m-%d %H:%M:%S').date()
  33. continuous_contract = get_continuous_contracts(context.symbol, startDate, startDate)
  34. context.mainContract = continuous_contract[0]['symbol']
  35. # 订阅行情
  36. subscribe(continuous_contract[0]['symbol'], frequency='60s', count=1)
  37. schedule(schedule_func=algo, date_rule='1d', time_rule='8:50:00')
  38. def algo(context):
  39. # 检查主力和约,发生变化则更换订阅
  40. contractInfo = get_continuous_contracts(context.symbol, context.now.date(), context.now.date())
  41. if context.mainContract != contractInfo[0]['symbol']:
  42. context.mainContract = contractInfo[0]['symbol']
  43. subscribe(context.mainContract, frequency='60s', count=1, unsubscribe_previous=True)
  44. return # 这一根bar不判断。
  45. # 获取历史数据
  46. data = history_n(symbol=context.mainContract, frequency='1d',
  47. end_time=context.now, fields='high,low,open,symbol,close', count=2, df=True)
  48. high = data.high.iloc[0] # 前一日的最高价
  49. low = data.low.iloc[0] # 前一日的最低价
  50. close = data.close.iloc[0] # 前一日的收盘价
  51. pivot = (high + low + close) / 3 # 枢轴点
  52. context.bBreak = high + 2 * (pivot - low) # 突破买入价
  53. context.sSetup = pivot + (high - low) # 观察卖出价
  54. context.sEnter = 2 * pivot - low # 反转卖出价
  55. context.bEnter = 2 * pivot - high # 反转买入价
  56. context.bSetup = pivot - (high - low) # 观察买入价
  57. context.sBreak = low - 2 * (high - pivot) # 突破卖出价
  58. context.data = data
  59. def on_bar(context, bars):
  60. # 获取止损价
  61. STOP_LOSS_PRICE = context.stopLossPrice
  62. bBreak = context.bBreak
  63. sSetup = context.sSetup
  64. sEnter = context.sEnter
  65. bEnter = context.bEnter
  66. bSetup = context.bSetup
  67. sBreak = context.sBreak
  68. data = context.data
  69. # 获取现有持仓 返回的是一个list的各种合约的持仓对象 详见
  70. # https://www.myquant.cn/docs/python/python_object_trade#Position%20-%20%E6%8C%81%E4%BB%93%E5%AF%B9%E8%B1%A1
  71. position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  72. position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)
  73. # 突破:
  74. if not position_long and not position_short: # 空仓条件
  75. if bars[0].close > bBreak:
  76. # 在空仓的情况下,如果盘中价格超过突破买入价,
  77. # 则采取趋势策略,即在该点位开仓做多
  78. print(context.now)
  79. print("空仓,盘中价格超过突破买入价: 开仓做多")
  80. order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Buy,
  81. order_type=OrderType_Market, position_effect=PositionEffect_Open) # 做多
  82. context.open_position_price = bars[0].close
  83. elif bars[0].close < sBreak:
  84. # 在空仓的情况下,如果盘中价格跌破突破卖出价,
  85. # 则采取趋势策略,即在该点位开仓做空
  86. print(context.now)
  87. print("空仓,盘中价格跌破突破卖出价: 开仓做空")
  88. order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Sell,
  89. order_type=OrderType_Market, position_effect=PositionEffect_Open) # 做空
  90. context.open_position_price = bars[0].close
  91. #反转。
  92. else: # 有持仓。
  93. # 开仓价与当前行情价之差大于止损点则止损
  94. if (position_long and context.open_position_price - bars[0].close >= STOP_LOSS_PRICE) or \
  95. (position_short and bars[0].close - context.open_position_price >= STOP_LOSS_PRICE):
  96. print(context.now)
  97. print('止损')
  98. order_close_all() # 平仓
  99. # 反转:
  100. if position_long: # 多头持仓
  101. if data.high.iloc[1] > sSetup and bars[0].close < sEnter:
  102. # 多头持仓,当日内最高价超过观察卖出价后,
  103. # 盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,
  104. # 采取反转策略,即在该点位反手做空
  105. print(context.now)
  106. print("多头持仓,当日内最高价超过观察卖出价后跌破反转卖出价: 反手做空")
  107. order_close_all() # 平仓
  108. order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Sell,
  109. order_type=OrderType_Market, position_effect=PositionEffect_Open) # 做空
  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. print(context.now)
  117. print("空头持仓,当日最低价低于观察买入价后超过反转买入价: 反手做多")
  118. order_close_all() # 平仓
  119. order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Buy,
  120. order_type=OrderType_Market, position_effect=PositionEffect_Open) # 做多
  121. context.open_position_price = bars[0].close
  122. # 15点收盘全部平仓。
  123. if context.now.hour == 15:
  124. print(context.now)
  125. print('close all')
  126. order_close_all()
  127. if __name__ == '__main__':
  128. run(strategy_id='strategy_id',
  129. filename='main.py',
  130. mode=MODE_BACKTEST,
  131. token='token_id',
  132. backtest_start_time='2019-10-1 15:00:00',
  133. backtest_end_time='2020-04-16 15:00:00')

0 篇笔记