用THSTrader 调试同花顺自动下单的过程 。 主要原理是利用python函数pywinauto 自动获取同花顺上相应控件的值,进行模拟自动化的操做,不得不说python函数库的强大,其它语言很是也能作到。可是复杂度远远高于python,这个也是python变的越来流行的缘由了。 因此如今数学专业抢码农的工做是挺好抢的。 利用esseract ocr进行券商验证码的识别,不过没有正式用起来,今天 没有碰到验证码出现的现象 。python
第一坑:git
查看持仓数据的时候 ,一直没能获得返回结果,发现原码是是有验证码,当前是没有验证码的, 因此把验证码的先去掉,可能之后高频交易会再出现,如今先无论他。 不过源码中应该也判断下。github
第二坑:app
查看持仓数据得不到结果,经查发现当前版本比原来的右键多了一人选面,复制功能已经排到第四了。原来是第三,因此在操做复制不到数据, 增长源码中向下移动的代码就能够了。函数
第三坑:测试
联调的时候,源代码时间间隔过短,会致使失败,能够相应的把时间加长。 默认0.2 我改成了1,字体
第四坑:3d
卖出股票的时候 ,最后有一个默认的弹出框,可是能够勾选再也不出现, 代码里没有作应的检测,每次都是找,找不到的时候会报错,因此须要把他调过来。或者把代码放在try 里,直接认为是成功的就能够了。调试
print(trader.sell(stock_no="162411", amount=100, price=0.51)) # 卖出股票
由于我持仓中没有这个股票 ,因此提示证券可用数量不足,卖个自已有持仓的。code
print(trader.sell(stock_no="601288", amount=100, price=4)) # 卖出股票
查看委托记录
我连着运行了两笔
目前最新版是v5.0
下载好之后,把安装的目录 添加到环境变量中。
d:\Program Files\Tesseract-OCR
按win+Pause=》高级系统设置-环境变量=在path加上tesseract 的安装路径
tesseract -v
在目录E:\opensource\THSTrader\THS 下默认有一个tmp.png的测试图像,咱们拿这个来测试
E:\opensource\THSTrader\THS>tesseract tmp.png output_1 -l eng Tesseract Open Source OCR Engine v5.0.0.20190623 with Leptonica Warning: Invalid resolution 0 dpi. Using 70 instead. Estimating resolution as 163
定位到目录 ,输入图像名称 和输出的文件名称之后,并指定是英文字体。
图片和运行结果以下:能够看到识别速度仍是很快的。
【语法】: tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile…]
imagename=》目标图片文件名,需加格式后缀;outputbase=》转换结果文件名;
lang是语言名称(在Tesseract-OCR中tessdata文件夹可看到以eng开头的语言文件eng.traineddata),如不标-l eng则默认为eng
print(trader.get_position())
若是运行之后,有下面的错误发生,去原代码中把验证码识别的先注释掉,这个可能 是由于没有高频调用 ,因此如今复制持仓数据的时候,是没有让输入验证码的。
看下面的注释代码:
在THStrader.py中的132行注册掉。 就能够了
注释完上面代码之后,发现仍是得不到数据,查看代码之后,再检查当前的同花顺界面,发现有区别
如今和复制功能 不是第四个,原来可能 是在第三个,由于原代码只有三个向下的移动。
因此咱们改下代码,增长一下向下移动就能够了。
再增长一个向下移动的平移
keyboard.SendKeys('{DOWN}') #表示键头向下移动一格 time.sleep(0.1)
如今咱们再来运行一下结果
成功运行结果以下图所求
至此查看持仓数据就成功了。
运行如下代码,发现卖出股票出错,好吧,咱们继续分析 。
print(trader.sell(stock_no="601288", amount=100, price=4)) # 卖出股票
查看源代码之后发现应该是某个控件的id错了。
查看源代码:
咱们只用下面代码就能够了。
def __trade(self, stock_no, price, amount): time.sleep(0.2) self.main_wnd.window(control_id=0x408, class_name="Edit").set_text(str(stock_no)) # 设置股票代码 self.main_wnd.window(control_id=0x409, class_name="Edit").set_text(str(price)) # 设置价格 self.main_wnd.window(control_id=0x40A, class_name="Edit").set_text(str(amount)) # 设置股数目 time.sleep(0.2) self.main_wnd.window(control_id=0x3EE, class_name="Button").click() # 点击卖出or买入 time.sleep(0.2) self.app.top_window().window(control_id=0x6, class_name='Button').click() # 肯定买入 self.app.top_window().set_focus() time.sleep(0.2)
再接下去还有七行代码,应该是一个弹出框,可是能够设置之后不出现。 个人设置完之后就不出现了。 不知道怎么调出来,这个不影响结果,能够屏蔽或者加到try代码块中。
到这里基本 上卖出设置就能够了。
可是又试的时候发现提示不能交易 了,可能券商在维护了,今天是周六
买入股票和卖出股票相似 ,不过就是入口F2变为F1就能够了。
另个就是源码中时间间隔过短,联调的时候 会失败,可能相应的把时间间隔改成1
分为查余额,查持仓,卖出持仓股票,买入持仓股票
购买股票里面的control_id 值是用spy++找到的, 能够下个这样的软件查找相就的控件,这个有时间 再说下这个软件的用法。