630 views
0

#  -*- coding: utf-8 -*-
__author__ = 'chengzhi'
 from datetime import date
from tqsdk import TqApi, TqBacktest, TargetPosTask
from tqsdk.tafunc import time_to_str
'''
如果当前价格大于5分钟K线的MA15则开多仓
如果小于则平仓
回测从 2018-05-01 到 2018-10-01
'''
# 在创建 api 实例时传入 TqBacktest 就会进入回测模式
api = TqApi(backtest=TqBacktest(start_dt=date(2020, 1, 13), end_dt=date(2020, 1, 13)))
# 获得 m1901 5分钟K线的引用
klines = api.get_kline_serial("SHFE.cu2003", 5 * 60, data_length=15)
# 创建 m1901 的目标持仓 task,该 task 负责调整 m1901 的仓位到指定的目标仓位
target_pos = TargetPosTask(api, "SHFE.cu2003")
 while True:
    api.wait_update()
    if api.is_changing(klines):
        ma = sum(klines.close.iloc[-15:]) / 15
        print("最新价", klines.close.iloc[-1],"time",time_to_str(klines.iloc[-1].datetime), "MA", ma)
        if klines.close.iloc[-1] > ma:
            print("最新价",klines.close.iloc[-1],"大于MA:",ma," 目标多头5手")
            # 设置目标持仓为多头5手
            target_pos.set_target_volume(5)
        elif klines.close.iloc[-1] < ma:
            print("最新价小于MA: 目标空仓")
            # 设置目标持仓为空仓
            target_pos.set_target_volume(0)

如果按照规则描述:

K线序列 (例如上面例子中的ka1, ka2) 总是按周期推进. 每根K线在创建时和结束时各更新一次:

这样的话,回测demo在每根K线上如果满足条件的话,就要执行2次开仓,显然不符合策略逻辑

请问如何更改为 上一根K线完结,以上根K线收盘价和均线值,作为条件。如条件满足,在当根K线开盘时候开仓?

Answered question
0

demo中只有一根K线。

K线每一次更新就触发一次is_changing(),相当于模拟行情在更新,”每根K线在创建时和结束时各更新一次”是两次更新,这个不会导致同时在一次更新中执行2次开仓

Answered question