5.56K 浏览
0

SYMBOL = \”CZCE.TA909\”
KLINE_PERIOD_1 = 60
KLINE_PERIOD_2 = 5*60
data_length = 30
api = TqApi(TqSim())
quote = api.get_quote(SYMBOL)
orders = api.get_order()
ticks = api.get_tick_serial(SYMBOL, data_length=data_length)
position = api.get_position(SYMBOL)
account = api.get_account()
klines_1 = api.get_kline_serial(SYMBOL, duration_seconds=KLINE_PERIOD_1, data_length=data_length)#1分钟
klines_2 = api.get_kline_serial(SYMBOL, duration_seconds=KLINE_PERIOD_2, data_length=data_length)#5分钟
trade_signal = 0
while True:
api.wait_update()
if api.is_changing(account, [\”available\”,\”commission\”,\”position_profit\”,\”close_profit\”]):
print(\”account=\”.format(account))
if api.is_changing(position):
print(\”position=\”.format(position))
if api.is_changing(klines_1.iloc[-1], \”datetime\”):
print(\”klines_1.iloc[-1]=\”.format(klines_1.iloc[-1]))
if api.is_changing(ticks):
if position.volume_long == 0 and position.volume_short == 0:
print(\”开仓\”)
if klines_1.iloc[-1] > klines_2.iloc[-1] :
api.insert_order(symbol=SYMBOL, direction=\”BUY\”, offset=\”OPEN\”, volume=UNIT, limit_price=ticks.iloc[-1].bid_price1)
if klines_1.iloc[-1] < klines_2.iloc[-1] :
api.insert_order(symbol=SYMBOL, direction=\”SELL\”, offset=\”OPEN\”, volume=UNIT, limit_price=ticks.iloc[-1].ask_price1)
elif position.volume_long > 0:
print(\”平多仓\”)
api.insert_order(symbol=SYMBOL, direction=\”SELL\”, offset=\”CLOSE\”, volume=position.volume_long)
elif position.volume_short > 0:
print(\”平空仓\”)
api.insert_order(symbol=SYMBOL, direction=\”BUY\”, offset=\”CLOSE\”, volume=position.volume_short)
以上测试代码,发现几个问题:
1、每次循环,都发生position更新事件,事实上此时打印出来的position并未有任何变化;
2.使用天勤软件回测或复盘,在使用市价下单时,发生成交但是打印出来的position未有变化,其多空仓位仍为0,导致开单逻辑不断下单,有多时达还几百单
3.以上第2点,在复盘时使用正常1倍速还是max,都出现一样的问题
4.以上问题,使用TQSDK回测时,表现与天勤软件不大一样,有时发现一直在打印position,程序似乎没法走到下面的if api.is_changing(ticks)

0
  1. 关于1和2,get_position字段返回的值除了持仓量以外还有其他信息如多头盈亏,空头盈亏等,所以就算仓位无更新,使用api.is_changing(position):也会在有任何值更新时返回True,如果只判断多空头仓位,可以使用api.is_changing(position,[“volume_long”,”volume_short”]):
  2. 你在使用两个不同时间周期k线比较有问题if klines_1.iloc[-1] > klines_2.iloc[-1] :,这两个函数.iloce[-1],会返回最后一个K线的矩阵,因此如果你要使用的是最新价应该是klines_1.iloc[-1].close,但是不同周期的klines,它们的.iloce[-1].close都应该一样为最新值
您正在查看3个答案中的1个,单击此处查看所有答案。