TqSdk

TqSdk 是本人觉得非常好用一套免费自动化交易软件,基于python3,对于有编程经验的人来说上手非常简单。它区别于其它很多自动化交易软件的最好的地方在于,可以用完全同步的方式去开发代码,非常便于调试和梳理逻辑。

对于熟悉Linux的小伙伴来说,TqSdk也非常的节省资源,我有一台上海的阿里云单核512Mb(自己创建了一个2G的虚拟内存),一个月20多元钱,也完全够用。

对自动化交易期权有需求的小伙伴可能不是很适合,因为需要开通专业版,专业版的话收费对于普通用户来说成本相对比较高,建议换其它免费的。

因为我本人用的TqSdk比较多,对将要使用TqSdk用户的小伙伴几点好的建议:

1、不建议使用TqSdk异步的形式去开发代码,因为出问题很难去排查逻辑,即使你去咨询别人的话,别人也很难搞懂你的逻辑。强烈建议使用同步的形式,所有的业务逻辑都写在api.wait_update()之后同步执行。

2、TargetPosTask不建议使用,建议使用最原始的api.insert_order形式。TargetPosTask如果你不看源码,深刻了解里面的运行机制,如果产生了和预期不一致的问题,很难去处理。

3、建议正式自动化交易,买服务器的时候,买阿里云的上海机房,因为TqSdk的行情服务是天勤统一处理的,行情服务器也是部署在阿里云的上海机房,这样我们做自动化交易的时候,能更快的收到行情。

本人用TqSdk封装了一套支持Http请求的开源期货交易软件,easyfut(github地址:https://github.com/hanwanhe/easyfut-python),感兴趣的大家看下,里面不涉及任何的异步代码,逻辑简单,仅供参考,本人不对该软件的正确性做任何担保。

easyfut仅供参考,因使用easyfut实盘造成的任何问题,本人不承担任何责任。

easyfut基本实现原理参考如下:

import time from multiprocessing import Process,Manager,Queue from tqsdk import TqApi, TqAuth, TqKq, TqSim, TqAccount import tornado.ioloop import tornado.web import json import math #TqSdk账号,需要改成自己的 TQ_USER = 'xxx' #TqSdk密码,需要改成自己的 TQ_PASSWD = 'xxx' #下市价单 def my_market_order(api, quote, direction, offset, volume): limit_price = None if('SHFE' in quote['instrument_id']): if(direction == "SELL"): limit_price = quote['lower_limit'] if(direction == "BUY"): limit_price = quote['upper_limit'] if(offset == 'CLOSE' and 'SHFE' in quote['instrument_id']): offset = 'CLOSETODAY' order = api.insert_order(symbol=quote['instrument_id'], direction=direction, offset=offset, volume=volume, limit_price=limit_price) while order.status != "FINISHED": api.wait_update() return order.trade_price #处理账户信息请求 class AccountHandler(tornado.web.RequestHandler): def initialize(self, share_dict, order_queue): #获取引用 self.share_dict = share_dict self.order_queue = order_queue def get(self): self.finish(self.share_dict['account']) #处理委托单信息请求 class OrderHandler(tornado.web.RequestHandler): def initialize(self, share_dict, order_queue): #获取引用 self.share_dict = share_dict self.order_queue = order_queue #下单,这里写死了内容,只是演示实现原理 def post(self): #要下单的信息写入消息队列 self.order_queue.put({'quote':"SHFE.rb2309"}) self.finish('suc') #获取全部委托单信息 def get(self): self.finish(self.share_dict['orders']) #抽取变量中的kv def extract_kv(tqsdk_variable): kv = {} it = iter(tqsdk_variable) while True: try: k = next(it) if ( isinstance(tqsdk_variable[k], str) or isinstance(tqsdk_variable[k], float) or isinstance(tqsdk_variable[k], int) or isinstance(tqsdk_variable[k], list) or isinstance(tqsdk_variable[k], bool) or isinstance(tqsdk_variable[k], objs.TradingTime) ): if(isinstance(tqsdk_variable[k], float)): if(math.isnan(tqsdk_variable[k]) == True): kv[k] = 0.0 else: kv[k] = round(tqsdk_variable[k]*100)/100 else: kv[k] = tqsdk_variable[k] except StopIteration: break return kv #Tqsdk子进程 class Tqsdk(Process): def __init__(self, share_dict, order_queue): Process.__init__(self) #获取引用 self.share_dict = share_dict self.order_queue = order_queue #初始化共享变量 share_dict['account'] = {} share_dict['orders'] = {} def run(self): #连接tqsdk api = TqApi(TqKq(), auth=TqAuth(TQ_USER, TQ_PASSWD)) #获取账号引用 account = api.get_account() #获取委托引用 orders = api.get_order() #账户信息同步到共享变量 self.share_dict['account'] = extract_kv(account) #委托单信息同步到共享变量 my_orderes = {} for order_id in orders: my_orderes[order_id] = extract_kv(orders[order_id]) self.share_dict['orders'] = my_orderes while True: #等待数据更新 api.wait_update(int(time.time())+3) #判断消息队列中是否有下单请求,有的话,直接下单 if(self.order_queue.empty() == False): #获取队列信息 order = self.order_queue.get() #下单,这里直接写死了开仓等信息,只是演示实现原理 my_market_order(api, api.get_quote(order['quote']), "BUY", "OPEN", 1) #委托单信息同步到共享变量 my_orderes = {} for order_id in orders: my_orderes[order_id] = extract_kv(orders[order_id]) #账户信息同步到共享变量 self.share_dict['orders'] = my_orderes self.share_dict['account'] = extract_kv(account) #webserver子进程 class Webserver(Process): def __init__(self, share_dict, order_queue): Process.__init__(self) #获取引用 self.share_dict = share_dict self.order_queue = order_queue def run(self): #创建app app = tornado.web.Application([ (r"/account", AccountHandler, {'share_dict':self.share_dict, 'order_queue' : self.order_queue}), (r"/order", OrderHandler, {'share_dict':self.share_dict, 'order_queue' : self.order_queue}), ]) #监听8888端口 app.listen(8888) #服务启动 tornado.ioloop.IOLoop.current().start() if __name__=="__main__": #多进程全局共享变量 manager = Manager() share_dict = manager.dict() #多进程消息队列 order_queue = Queue() #启动webserver子进程 p_webserver=Webserver(share_dict, order_queue) p_webserver.start() #启动Tqsdk子进程 p_tqsdk=Tqsdk(share_dict, order_queue) p_tqsdk.start() #父进程等待子进程完成 p_webserver.join() p_tqsdk.join()

本站合作开户:A类大型期货公司,客户经理直开,加1分,有交返。联系微信: ITF-0T ,备注:开户。 支持企业开户,企业开户限时奖励中...


Nickname
Email
Website
0/500
0 comments