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日