1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
| from __future__ import print_function, absolute_import, unicode_literals import numpy as np import pandas as pd from gm.api import * ''' 以短期为例:20日线 第一步:获取历史数据,计算唐奇安通道和ATR 第二步:当突破唐奇安通道时,开仓。 第三步:计算加仓和止损信号。 ''' def init(context): context.n = 20 context.symbol = 'DCE.i2012' context.ratio = 0.8 subscribe(symbols=context.symbol, frequency='60s', count=2) time = context.now.strftime('%H:%M:%S') if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00': algo(context) schedule(schedule_func=algo, date_rule='1d', time_rule='09:00:00') schedule(schedule_func=algo, date_rule='1d', time_rule='21:00:00') def algo(context): if context.mode == 2: data = history_n(symbol=context.symbol, frequency='1d', count=context.n+1, end_time=context.now, fields='close,high,low,bob', df=True) tr_list = [] for i in range(0, len(data)-1): tr = max((data['high'].iloc[i] - data['low'].iloc[i]), data['close'].shift(-1).iloc[i] - data['high'].iloc[i], data['close'].shift(-1).iloc[i] - data['low'].iloc[i]) tr_list.append(tr) context.atr = int(np.floor(np.mean(tr_list))) context.atr_half = int(np.floor(0.5 * context.atr)) context.don_open = np.max(data['high'].values[-context.n:]) context.don_close = np.min(data['low'].values[-context.n:]) if context.mode == 1: data = history_n(symbol=context.symbol, frequency='1d', count=context.n, end_time=context.now, fields='close,high,low', df=True) current_data = current(symbols=context.symbol) tr_list = [] for i in range(1, len(data)): tr = max((data['high'].iloc[i] - data['low'].iloc[i]), data['close'].shift(-1).iloc[i] - data['high'].iloc[i], data['close'].shift(-1).iloc[i] - data['low'].iloc[i]) tr_list.append(tr) tr_new = max((current_data[0]['high'] - current_data[0]['low']), data['close'].iloc[-1] - current_data[0]['high'], data['close'].iloc[-1] - current_data[0]['low']) tr_list.append(tr_new) context.atr = int(np.floor(np.mean(tr_list))) context.atr_half = int(np.floor(0.5 * context.atr)) context.don_open = np.max(data['high'].values[-context.n:]) context.don_close = np.min(data['low'].values[-context.n:]) context.long_add_point = context.don_open + context.atr_half context.long_stop_loss = context.don_open - context.atr_half context.short_add_point = context.don_close - context.atr_half context.short_stop_loss = context.don_close + context.atr_half def on_bar(context, bars): symbol = bars[0]['symbol'] recent_data = context.data(symbol=context.symbol, frequency='60s', count=2, fields='close,high,low') close = recent_data['close'].values[-1] position_long = context.account().position(symbol=symbol, side=PositionSide_Long) position_short = context.account().position(symbol=symbol, side=PositionSide_Short) if not position_long and not position_short: if close > context.don_open: order_volume(symbol=symbol, side=OrderSide_Buy, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('开多仓atr') if close < context.don_close: order_volume(symbol=symbol, side=OrderSide_Sell, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('开空仓atr') if position_long: if close > context.long_add_point: order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Open) print('继续加仓0.5atr') context.long_add_point += context.atr_half context.long_stop_loss += context.atr_half if close < context.long_stop_loss: volume_hold = position_long['volume'] if volume_hold >= context.atr_half: order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close) else: order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Sell, order_type=OrderType_Market,position_effect=PositionEffect_Close) print('平多仓0.5atr') context.long_add_point -= context.atr_half context.long_stop_loss -= context.atr_half if position_short: if close < context.short_add_point: order_volume(symbol = symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('继续加仓0.5atr') context.short_add_point -= context.atr_half context.short_stop_loss -= context.atr_half if close > context.short_stop_loss: volume_hold = position_short['volume'] if volume_hold >= context.atr_half: order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Close) else: order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Close) print('平空仓0.5atr') context.short_add_point += context.atr_half context.short_stop_loss += context.atr_half if __name__ == '__main__': ''' strategy_id策略ID,由系统生成 filename文件名,请与本文件名保持一致 mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST token绑定计算机的ID,可在系统设置-密钥管理中生成 backtest_start_time回测开始时间 backtest_end_time回测结束时间 backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST backtest_initial_cash回测初始资金 backtest_commission_ratio回测佣金比例 backtest_slippage_ratio回测滑点比例 ''' run(strategy_id='strategy_id', filename='main.py', mode=MODE_BACKTEST, token='token', backtest_start_time='2020-02-15 09:15:00', backtest_end_time='2020-09-01 15:00:00', backtest_adjust=ADJUST_PREV, backtest_initial_cash=1000000, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001)
|