: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

[模板与范例参考] 海龟交易法(期货)Python策略源码模板【东方财富Python量化】

[模板与范例参考] 海龟交易法(期货)Python策略源码模板【东方财富Python量化】

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. import numpy as np
  4. import pandas as pd
  5. from gm.api import *


  6. '''
  7. 以短期为例:20日线
  8. 第一步:获取历史数据,计算唐奇安通道和ATR
  9. 第二步:当突破唐奇安通道时,开仓。
  10. 第三步:计算加仓和止损信号。
  11. '''


  12. def init(context):
  13.     # 设置计算唐奇安通道的参数
  14.     context.n = 20
  15.     # 设置合约标的
  16.     context.symbol = 'DCE.i2012'
  17.     # 设置交易最大资金比率
  18.     context.ratio = 0.8
  19.     # 订阅数据
  20.     subscribe(symbols=context.symbol, frequency='60s', count=2)
  21.     # 获取当前时间
  22.     time = context.now.strftime('%H:%M:%S')
  23.     # 如果策略执行时间点是交易时间段,则直接执行algo定义atr等参数,以防直接进入on_bar()导致atr等未定义
  24.     if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00':
  25.         algo(context)
  26.     # 如果是交易时间段,等到开盘时间确保进入algo()
  27.     schedule(schedule_func=algo, date_rule='1d', time_rule='09:00:00')
  28.     schedule(schedule_func=algo, date_rule='1d', time_rule='21:00:00')


  29. def algo(context):
  30.     # 计算通道的数据:当日最低、最高、上一交易日收盘
  31.     # 注:由于talib库计算ATR的结果与公式求得的结果不符,所以这里利用公式计算ATR
  32.     # 如果是回测模式,当天的数据直接用history取到
  33.     if context.mode == 2:
  34.         data = history_n(symbol=context.symbol, frequency='1d', count=context.n+1, end_time=context.now, fields='close,high,low,bob', df=True) # 计算ATR
  35.         tr_list = []
  36.         for i in range(0, len(data)-1):
  37.             tr = max((data['high'].iloc[i] - data['low'].iloc[i]), data['close'].shift(-1).iloc[i] - data['high'].iloc[i],
  38.                      data['close'].shift(-1).iloc[i] - data['low'].iloc[i])
  39.             tr_list.append(tr)
  40.         context.atr = int(np.floor(np.mean(tr_list)))
  41.         context.atr_half = int(np.floor(0.5 * context.atr))
  42.         # 计算唐奇安通道
  43.         context.don_open = np.max(data['high'].values[-context.n:])
  44.         context.don_close = np.min(data['low'].values[-context.n:])

  45.     # 如果是实时模式,当天的数据需要用current取到
  46.     if context.mode == 1:
  47.         data = history_n(symbol=context.symbol, frequency='1d', count=context.n, end_time=context.now, fields='close,high,low',
  48.                          df=True)  # 计算ATR
  49.         current_data = current(symbols=context.symbol)   # 最新一个交易日的最高、最低
  50.         tr_list = []
  51.         for i in range(1, len(data)):
  52.             tr = max((data['high'].iloc[i] - data['low'].iloc[i]),
  53.                      data['close'].shift(-1).iloc[i] - data['high'].iloc[i],
  54.                      data['close'].shift(-1).iloc[i] - data['low'].iloc[i])
  55.             tr_list.append(tr)
  56.         # 把最新一期tr加入列表中
  57.         tr_new = max((current_data[0]['high'] - current_data[0]['low']),
  58.                      data['close'].iloc[-1] - current_data[0]['high'],
  59.                      data['close'].iloc[-1] - current_data[0]['low'])
  60.         tr_list.append(tr_new)
  61.         context.atr = int(np.floor(np.mean(tr_list)))
  62.         context.atr_half = int(np.floor(0.5 * context.atr))
  63.         # 计算唐奇安通道
  64.         context.don_open = np.max(data['high'].values[-context.n:])
  65.         context.don_close = np.min(data['low'].values[-context.n:])

  66.     # 计算加仓点和止损点
  67.     context.long_add_point = context.don_open + context.atr_half
  68.     context.long_stop_loss = context.don_open - context.atr_half
  69.     context.short_add_point = context.don_close - context.atr_half
  70.     context.short_stop_loss = context.don_close + context.atr_half


  71. def on_bar(context, bars):
  72.     # 提取数据
  73.     symbol = bars[0]['symbol']
  74.     recent_data = context.data(symbol=context.symbol, frequency='60s', count=2, fields='close,high,low')
  75.     close = recent_data['close'].values[-1]

  76.     # 账户仓位情况
  77.     position_long = context.account().position(symbol=symbol, side=PositionSide_Long)
  78.     position_short = context.account().position(symbol=symbol, side=PositionSide_Short)

  79.     # 当无持仓时
  80.     if not position_long and not position_short:
  81.         # 如果向上突破唐奇安通道,则开多
  82.         if close > context.don_open:
  83.             order_volume(symbol=symbol, side=OrderSide_Buy, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open)
  84.             print('开多仓atr')
  85.         # 如果向下突破唐奇安通道,则开空
  86.         if close < context.don_close:
  87.             order_volume(symbol=symbol, side=OrderSide_Sell, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open)
  88.             print('开空仓atr')

  89.     # 有持仓时
  90.     # 持多仓,继续突破(加仓)
  91.     if position_long:
  92.         # 当突破1/2atr时加仓
  93.         if close > context.long_add_point:
  94.             order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Open)
  95.             print('继续加仓0.5atr')
  96.             context.long_add_point += context.atr_half
  97.             context.long_stop_loss += context.atr_half
  98.         # 持多仓,止损位计算
  99.         if close < context.long_stop_loss:
  100.             volume_hold = position_long['volume']
  101.             if volume_hold >= context.atr_half:
  102.                 order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  103.             else:
  104.                 order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Sell, order_type=OrderType_Market,position_effect=PositionEffect_Close)
  105.             print('平多仓0.5atr')
  106.             context.long_add_point -= context.atr_half
  107.             context.long_stop_loss -= context.atr_half

  108.     # 持空仓,继续突破(加仓)
  109.     if position_short:
  110.         # 当跌破加仓点时加仓
  111.         if close < context.short_add_point:
  112.             order_volume(symbol = symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open)
  113.             print('继续加仓0.5atr')
  114.             context.short_add_point -= context.atr_half
  115.             context.short_stop_loss -= context.atr_half
  116.         # 持多仓,止损位计算
  117.         if close > context.short_stop_loss:
  118.             volume_hold = position_short['volume']
  119.             if volume_hold >= context.atr_half:
  120.                 order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Close)
  121.             else:
  122.                 order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Close)
  123.             print('平空仓0.5atr')
  124.             context.short_add_point += context.atr_half
  125.             context.short_stop_loss += context.atr_half


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

返回列表