from tqsdk import TqApi, TqSim, TargetPosTask, tafunc
api = TqApi()
# 周期参数
lenth1, lenth2 = 21, 55
# 获得 rb2005 10秒K线的引用
klines = api.get_kline_serial("SHFE.rb2005", 60, max(lenth1,lenth2)+2)
quote = api.get_quote("SHFE.rb2005")
position =api.get_position("SHFE.rb2005")
gainPrice, lossPrice = 0, 0
account = api.get_account()
while True:
#判断开仓条件
while True:
api.wait_update()
if api.is_changing(klines):
## A线 = (C - LLV(L, 21)) / (HHV(H, 21) - LLV(L, 21))
## B线 = (HHV(H, 55) - C) / (HHV(H, 55) - LLV(L, 55)) + 0.1
A = (klines.close - tafunc.llv(klines.low, lenth1))/(tafunc.hhv(klines.high, lenth1) - tafunc.llv(klines.low, lenth1))
B = (tafunc.hhv(klines.high, lenth2) - klines.close)/(tafunc.hhv(klines.high, lenth2) - tafunc.llv(klines.low, lenth2))+0.1
#print("A=", list(A.iloc[-3:-1]))
#print("B=", list(B.iloc[-3:-1]))
if A.iloc[-3] <= B.iloc[-3] and A.iloc[-2] > B.iloc[-2]:
print("最新价=", klines.close.iloc[-1])
order = api.insert_order(symbol="SHFE.rb2005", direction="BUY", offset="OPEN", volume=1, limit_price=quote.ask_price1)
break
elif A.iloc[-3] >= B.iloc[-3] and A.iloc[-2] < B.iloc[-2]:
print("最新价=", klines.close.iloc[-1])
order = api.insert_order(symbol="SHFE.rb2005", direction="SELL", offset="OPEN", volume=1, limit_price=quote.bid_price1)
break
# 判断平仓条件
while True:
api.wait_update()
if order.status == "FINISHED":
if position.pos > 0:
margin_rate = position.margin_long / position.open_cost_long
gainPrice = position.open_price_long * (1 + margin_rate * 0.2)
lossPrice = position.open_price_long * (1 - margin_rate * 0.05)
if klines.high.iloc[-1] >= gainPrice or klines.low.iloc[-1] <= lossPrice:
if position.pos_long_his > 0:
api.insert_order(symbol="SHFE.rb2005", direction="SELL", offset="CLOSE", volume=1,
limit_price=quote.bid_price1)
else:
api.insert_order(symbol="SHFE.rb2005", direction="SELL", offset="CLOSETODAY", volume=1,
limit_price=quote.bid_price1)
break
else:
margin_rate = position.margin_short / position.open_cost_short
gainPrice = position.open_price_short * (1 - margin_rate * 0.2)
lossPrice = position.open_price_short * (1 + margin_rate * 0.05)
if klines.low.iloc[-1] <= gainPrice or klines.high.iloc[-1] >= lossPrice:
if position.pos_short_his > 0:
api.insert_order(symbol="SHFE.rb2005", direction="BUY", offset="CLOSE", volume=1,
limit_price=quote.ask_price1)
else:
api.insert_order(symbol="SHFE.rb2005", direction="BUY", offset="CLOSETODAY", volume=1,
limit_price=quote.ask_price1)
break
print("当前权益=", account["balance"])
我是新手,所以编辑了段代码练手
用回测调整了一下,不知道是否符合你的要求
ZS C 发表新评论 2019年12月31日
谢谢了,这几天测试了一下,但是还有点小问题想问一下。按这个策略运行的话只要是A线大于B线或者是小于B线在中途平仓后会马上开仓。在TB里是只有AB线交叉时才开仓,开仓平仓后只有等下一次交叉才会开仓。在天勤也可以这样吗?
这个策略应该是收定后才开仓,所以实际是AB交叉后下一根K线出来时立刻开仓,同时平仓后马上开仓的原因是刚好达到交叉的条件了吧
谢谢,我也是新手,刚接触天勤所以随便找个代码练习的