5.67K 浏览
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. 同一个合约的任何周期K线和quote的最新价是一样的
2. 对同一个合约同时运行两个策略,可能出现:第一个策略发送撤单指令后,同时(此时委托单信息还未改变)另一个策略也发出撤单指令,此时就会出现”撤单错误“,是正确现象
3. 请问” 似乎导致在两个tick之间没法完成,会出一些问题“ 是出现什么问题

0

@ringo
1、用print(position),未发现有任何不一样的地方。
2、你的意思是两个不同周期k线的iloc[-1].close,是一样的最新值,是跟quote或者tick的最新值一样的么?
另外在TQSDK中用backtest,最后print(orders),也是空的,很是奇怪。
我感觉似乎当在天勤软件回测时,采取max速度,用tick策略如果耗时比较长的话,似乎导致在两个tick之间没法完成,会出一些问题。
另外还有个新问题,当在天勤软件中同时执行两个策略(同一个合约),在发生调仓(TargetPosTask)会出现撤单错误,这个是有问题么,是否可以修复?

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都应该一样为最新值