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

[模板与范例参考] 菲阿里四价(期货)Python策略源码模板【东方财富Python量化】

[模板与范例参考] 菲阿里四价(期货)Python策略源码模板【东方财富Python量化】

说明:如果没有持仓,且现价大于昨天最高价做多,小于昨天最低价做空。
  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import
  3. from gm.api import *


  4. """
  5. 上轨=昨日最高点;
  6. 下轨=昨日最低点;
  7. 止损=今日开盘价;
  8. 如果没有持仓,且现价大于了昨天最高价做多,小于昨天最低价做空。
  9. 如果有多头持仓,当价格跌破了开盘价止损。
  10. 如果有空头持仓,当价格上涨超过开盘价止损。
  11. 选取 进行了回测。
  12. 注意:
  13. 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。
  14. 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交。
  15. """


  16. def init(context):
  17.     # 设置标的
  18.     context.symbol = 'SHFE.rb2010'
  19.     # 订阅一分钟线
  20.     subscribe(symbols = context.symbol,frequency = '60s',count = 1)
  21.     # 记录开仓次数,保证一天只开仓一次
  22.     context.count = 0
  23.     # 记录当前时间
  24.     time = context.now.strftime('%H:%M:%S')
  25.     # 如果当前时间点是交易时间段,则直接执行algo获取历史数据,以防直接进入on_bar()导致context.history_data未定义
  26.     if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00':
  27.         algo(context)

  28.     # 如果是非交易时间段,等到上午9点或晚上21点再执行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. def algo(context):
  32.     # 获取历史的n条信息
  33.     context.history_data = history_n(symbol=context.symbol, frequency='1d', end_time=context.now,
  34.                                      fields='symbol,open,high,low', count=2, df=True)

  35. def on_bar(context,bars):
  36.     # 取出订阅的一分钟bar
  37.     bar = bars[0]

  38.     # 提取数据
  39.     data = context.history_data

  40.     # 现有持仓情况
  41.     position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  42.     position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)

  43.     # 如果是回测模式
  44.     if context.mode == 2:
  45.         # 开盘价直接在data最后一个数据里取到,前一交易日的最高和最低价为history_data里面的倒数第二条中取到
  46.         open = data.loc[1, 'open']
  47.         high = data.loc[0, 'high']
  48.         low = data.loc[0, 'low']

  49.     # 如果是实时模式
  50.     else:
  51.         # 开盘价通过current取到
  52.         open = current(context.symbol)[0]['open']
  53.         # 实时模式不会返回当天的数据,所以history_data里面的最后一条数据是前一交易日的数据
  54.         high = data.loc[-1, 'high']
  55.         low = data.loc[-1, 'low']

  56.     # 交易逻辑部分
  57.     if position_long:  # 多头持仓小于开盘价止损。
  58.         if bar.close < open:
  59.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  60.                          order_type=OrderType_Market, position_effect=PositionEffect_Close)
  61.             print('以市价单平多仓')

  62.     elif position_short:# 空头持仓大于开盘价止损。
  63.         if bar.close > open:
  64.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  65.                          order_type=OrderType_Market, position_effect=PositionEffect_Close)
  66.             print('以市价单平空仓')

  67.     else:  # 没有持仓
  68.         if bar.close > high and not context.count:  # 当前的最新价大于了前一天的最高价
  69.             # 开多
  70.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,
  71.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)
  72.             print('以市价单开多仓')
  73.             context.count = 1
  74.         elif bar.close < low and not context.count:  # 当前最新价小于了前一天的最低价
  75.             # 开空
  76.             order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,
  77.                          order_type=OrderType_Market, position_effect=PositionEffect_Open)
  78.             print('以市价单开空仓')
  79.             context.count = 1

  80.     # 每天收盘前一分钟平仓
  81.     if context.now.hour == 14 and context.now.minute == 59:
  82.         order_close_all()
  83.         print('全部平仓')
  84.         context.count = 0
  85.             

  86. if __name__ == '__main__':
  87.     '''
  88.     strategy_id策略ID,由系统生成
  89.     filename文件名,请与本文件名保持一致
  90.     mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  91.     token绑定计算机的ID,可在系统设置-密钥管理中生成
  92.     backtest_start_time回测开始时间
  93.     backtest_end_time回测结束时间
  94.     backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  95.     backtest_initial_cash回测初始资金
  96.     backtest_commission_ratio回测佣金比例
  97.     backtest_slippage_ratio回测滑点比例
  98.     '''
  99.     run(strategy_id='strategy_id',
  100.         filename='main.py',
  101.         mode=MODE_BACKTEST,
  102.         token='{{token}}',
  103.         backtest_start_time='2020-01-01 15:00:00',
  104.         backtest_end_time='2020-09-01 16:00:00',
  105.         backtest_adjust=ADJUST_PREV,
  106.         backtest_initial_cash=100000,
  107.         backtest_commission_ratio=0.0001,
  108.         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

返回列表