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
| from __future__ import print_function, absolute_import from gm.api import * """ Dual Thrust是一个趋势跟踪系统 计算前N天的最高价-收盘价和收盘价-最低价。然后取这2N个价差的最大值,乘以k值。把结果称为触发值。 在今天的开盘,记录开盘价,然后在价格超过上轨(开盘+触发值)时马上买入,或者价格低于下轨(开盘-触发值)时马上卖空。 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有空单,则平空开多。 同理,如果在价格低于(开盘-触发值)时手上有多单,则平多开空。 选用了SHFE的rb2010 在2020-02-07 15:00:00 到 2020-04-15 15:00:00' 进行回测。 注意: 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。 2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交 """
def init(context): context.symbol = 'SHFE.rb2010' context.N = 5 context.k1 = 0.2 context.k2 = 0.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') subscribe(symbols=context.symbol, frequency='60s', count = 1) def algo(context): data = history_n(symbol=context.symbol, frequency='1d', end_time=context.now, fields='symbol,open,high,low,close', count=context.N + 1, df=True) if context.mode == 2: current_open = data['open'].loc[context.N] data.drop(context.N, inplace = True) else: current_open = current(context.symbol)[0]['open'] HH = data['high'].max() HC = data['close'].max() LC = data['close'].min() LL = data['low'].min() range = max(HH - LC, HC - LL) context.buy_line = current_open + range * context.k1 context.sell_line = current_open - range * context.k2 def on_bar(context, bars): bar = bars[0] buy_line = context.buy_line sell_line = context.sell_line position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long) position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short) if bar.close > buy_line: if position_long: return elif position_short: order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Close) print('市价单平空仓', context.symbol) order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('市价单开多仓', context.symbol) else: order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('市价单开多仓', context.symbol) elif bar.close < sell_line: if position_long: order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close) print('市价单平多仓', context.symbol) order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('市价单开空仓', context.symbol) elif position_short: return else: order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('市价单开空仓', context.symbol) 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_id', backtest_start_time='2020-02-07 15:00:00', backtest_end_time='2020-04-15 15:00:00', backtest_initial_cash= 30000, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001)
|