示例程序:
from tqsdk import TqApi, TargetPosTask
SYMBOL = “DCE.jd2005” # 合约代码
NDAY = 5 # 天数
K1 = 0.2 # 上轨K值
K2 = 0.2 # 下轨K值
api = TqApi()
print(“策略开始运行”)
quote = api.get_quote(SYMBOL)
klines = api.get_kline_serial(SYMBOL, 24 * 60 * 60) # 86400使用日线
target_pos = TargetPosTask(api, SYMBOL)
def dual_thrust(quote, klines):
current_open = klines.iloc[-1][“open”]
HH = max(klines.high.iloc[-NDAY – 1:-1]) # N日最高价的最高价
HC = max(klines.close.iloc[-NDAY – 1:-1]) # N日收盘价的最高价
LC = min(klines.close.iloc[-NDAY – 1:-1]) # N日收盘价的最低价
LL = min(klines.low.iloc[-NDAY – 1:-1]) # N日最低价的最低价
range = max(HH – LC, HC – LL)
buy_line = current_open + range * K1 # 上轨
sell_line = current_open – range * K2 # 下轨
print(“当前开盘价: %f, 上轨: %f, 下轨: %f” % (current_open, buy_line, sell_line))
return buy_line, sell_line
buy_line, sell_line = dual_thrust(quote, klines) # 获取上下轨
我不知道为何需要DataFrame类型的上下轨,也不知道如何转换,
不过,你可以尝试使用tafunc.hhv,tafunc.llv,tafunc.max等内置序列函数,例如:
from tqsdk import TqApi from tqsdk.tafunc import hhv,llv,max SYMBOL = "SHFE.rb2010" # 合约代码 NDAY = 5 # 天数 K1 = 0.2 # 上轨K值 K2 = 0.2 # 下轨K值 api = TqApi() print("策略开始运行") quote = api.get_quote(SYMBOL) klines = api.get_kline_serial(SYMBOL, 24 * 60 * 60) # 86400使用日线 current_open = klines.open HH = hhv(klines.high,NDAY) # N日最高价的最高价 HC = hhv(klines.close,NDAY) # N日收盘价的最高价 LC = llv(klines.close,NDAY) # N日收盘价的最低价 LL = llv(klines.low,NDAY) # N日最低价的最低价 range = max(HH-LC, HC-LL).shift(1) buy_line = current_open + range * K1 # 上轨 sell_line = current_open - range * K2 # 下轨 print(buy_line, sell_line) print(buy_line.iloc[-1],sell_line.iloc[-1]) while True: api.wait_update()
原来是取昨天上下轨,那么上面的写法正好符合你的要求。
print(buy_line.iloc[-2],sell_line.iloc[-2]) #昨天上下轨
第二种写法,简单修改如下:
current_open = klines.iloc[-2][“open”]
HH = max(klines.high.iloc[-NDAY – 2:-2]) # N日最高价的最高价
HC = max(klines.close.iloc[-NDAY – 2:-2]) # N日收盘价的最高价
LC = min(klines.close.iloc[-NDAY – 2:-2]) # N日收盘价的最低价
LL = min(klines.low.iloc[-NDAY – 2:-2]) # N日最低价的最低价
需要DataFrame类型的上下轨, 是为了获取 昨天的上下轨。