自己写了一个用于追单的类,比较原始,可能存在一些错误,请大家参考,如果有任何问题欢迎交流
class TqTrader:
def __init__(self, *args, **kwargs):
self.tqapi:TqApi = kwargs.pop("tqapi", None)
assert self.tqapi is not None, "tqapi is required"
self.symbol:str = kwargs.pop("symbol", "")
assert self.symbol != "", "symbol is required"
self.freq:int = kwargs.pop("freq", 60)
self.position:Position = self.tqapi.get_position(self.symbol)
self.ticks:pd.DataFrame = self.tqapi.get_tick_serial(self.symbol, 1)
def _decide_price(self, tick:Tick, amount:float, offset:str, premium:float=1):
"""下单价格,这里设计了比挂单价+一点溢价的方式"""
price = {
"OPEN": tick.ask_price1 + premium if amount > 0 else tick.bid_price1 - premium,
"CLOSE": tick.bid_price1 - premium if amount > 0 else tick.ask_price1 + premium
}
return price[offset]
def _decide_close_action(self, amount:float):
"""判断平仓的动作,上海交易所存在平今仓,这里采取了先平昨后平今的动作
可以根据需要修改逻辑
"""
offset:str = "CLOSETODAY"
his_long_closeable = amount > 0 and self.position.pos_long_his > 0
his_short_closeable = amount < 0 and self.position.pos_short_his > 0
if his_long_closeable or his_short_closeable:
offset = "CLOSE"
return offset
def _decide_direction(self, offset:str, amount:float):
"""判断恰当的交易方向,有时候在平仓时容易写错方向"""
if offset == "OPEN":
return "BUY" if amount > 0 else "SELL"
return "SELL" if amount > 0 else "BUY"
def trade(self, offset:str, amount, order_type="FAK", retry=0):
"""执行单次交易"""
tick:Tick = self.ticks.iloc[-1]
args = {
"symbol": self.symbol,
"direction": self._decide_direction(offset, amount),
"volume": abs(amount),
"advanced": order_type
}
traded, count = 0, 0
order = None
while traded < abs(amount):
args["limit_price"] = self._decide_price(tick, amount, offset)
args["offset"] = offset
if offset == "CLOSE":
args["offset"] = self._decide_close_action(amount)
if (not order) or (not order.status == "ALIVE"):
order:Order = self.tqapi.insert_order(**args)
self.tqapi.wait_update()
traded += order.volume_orign - order.volume_left
args["volume"] = order.volume_left
count += 1
if retry > 0 and count > retry:
print("超过重试次数")
break
return traded
def buy(self, symbol, amount, retry=0):
"""开仓"""
return self.trade(symbol, "OPEN", amount, retry)
def sell(self, symbol, amount, retry=0):
"""平仓"""
return self.trade(symbol, "CLOSE", amount, retry)
def execute(self, signal, retry=0):
"""执行交易信号"""
symbol = self.symbol
if signal < 0 and self.position.pos >= 0:
while self.position.pos > 0:
self.sell(symbol, self.position.pos, retry=retry)
self.buy(symbol, -1, retry=retry)
elif signal > 0 and self.position.pos <= 0:
while self.position.pos < 0:
self.sell(symbol, self.position.pos, retry=retry)
self.buy(symbol, 1)
elif signal == 0:
while self.position.pos != 0:
self.sell(symbol, self.position.pos, retry=retry)
else:
print(f"当前持仓:({self.position.pos}), 忽略信号:({signal})")
tqsdkdzqh 已回答的问题 2023年9月21日