用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++找到的, 能夠下個這樣的軟件查找相就的控件,這個有時間 再說下這個軟件的用法。