5,10,60日均线,,60日均线作为多空分界线
开多单条件:5大于10,且k线价格在60日均线上开多单;平多单条件:5小于10,且k线价格在60日均线下平多单
开空单条件:5小于10,且k线价格在60日均线下开空单;平空单条件:5大于10,且k线价格在60日均线上平空单
jzd1997 已回答的问题 2023年10月30日
开单加上60日线判断可以,平单加上60日条件可以造成单子始终没平掉。
下面是我写的策略,回测了一下,表现很一般
''' from tqsdk import TqApi, TqAuth, TargetPosTask,TqBacktest,TqSim,TqAccount from tqsdk.tafunc import ma from datetime import date import logging SHORT = 5 # 短周期 MIDDLE = 20 # 中周期 LONG = 60 # 中周期 ORDER_NUM = 1 # 手数 SYMBOL = "DCE.cs2403" # 合约代码 logging.basicConfig(filename='./logs/out_tripema.log', level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s') # 判断是多头还是空头市场 1:多头 -1:空头 0:震荡 def marketTrend(price,klines): ma60 = ma(klines["close"], LONG) if price > ma60.iloc[-1] : return 1 elif price <ma60.iloc[-1] : return -1 return 0 api = TqApi(TqSim(), backtest=TqBacktest(start_dt=date(2023, 9, 1), end_dt=date(2023, 10, 30)), auth=TqAuth("39627020", "1qazzaq1")) print("策略开始运行") data_length = 100 # k线数据长度 target_pos = TargetPosTask(api, SYMBOL) quote = api.get_quote(SYMBOL) while True: api.wait_update() if api.is_changing(quote, "last_price"): print(quote.datetime,quote.last_price) klines = api.get_kline_serial(SYMBOL, duration_seconds=60*60*24, data_length=data_length) short_avg = ma(klines["close"], SHORT) # 短周期 middle_avg = ma(klines["close"], MIDDLE) # 长周期 trend = marketTrend(quote.last_price,klines) # 均线下穿,做空 if short_avg.iloc[-2] > middle_avg.iloc[-2] and short_avg.iloc[-1] > middle_avg.iloc[-1]: print("均线下穿,平多") target_pos.set_target_volume(0) if trend==-1: print("空头市场,均线下穿,做空") target_pos.set_target_volume(-ORDER_NUM) # 均线上穿,做多 if short_avg.iloc[-2] < middle_avg.iloc[-2] and short_avg.iloc[-1] > middle_avg.iloc[-1]: print("均线上穿,平空") target_pos.set_target_volume(0) if trend==1: print("多头市场,均线上穿,做多") target_pos.set_target_volume(ORDER_NUM)
jzd1997 已回答的问题 2023年10月30日