# -*- coding: utf-8 -*- ''' 登錄 買入 賣出 撤單 ''' import pandas as pd import numpy as np import sys import datetime import time import scipy.io import os import uuid import signal import win32api import win32con import win32com,win32com.client import win32console import win32process import win32clipboard import win32gui import pywinauto # 需要pip安裝 pip install pywinauto import pywinauto.controls.hwndwrapper as hwndWrapper import pywinauto.findwindows as findwindows import pywinauto.controls.win32_controls as win32_controls def getclip(): win32clipboard.OpenClipboard() formats=[] lastformat=0 while 1: nextfomat=win32clipboard.EnumClipboardFormats(lastformat) if 0==nextfomat: break else: formats.append(nextfomat) lastformat=nextfomat if len(formats)==0: win32clipboard.CloseClipboard() return '' clipmemory=win32clipboard.GetClipboardData(13)#13是str # print('\nformat:{}\nclipboard:{}'.format(lastformat,clipmemory)) win32clipboard.CloseClipboard() return clipmemory class zyc_time: def __init__(self): pass def zyc_timeNow(self): t=time.localtime(time.time()) tS=time.strftime("%Y-%m-%d %H:%M:%S",t) return tS def zyc_print(self,strG): tS=self.zyc_timeNow() print(tS+' '+strG) def start(self): self.tt_start=time.time() def end(self): self.tt_end=time.time() self.tt=self.tt_end-self.tt_start self.zyc_print('耗時: '+str(round(self.tt,3))+' 秒') class ths_api(zyc_time): __is_run=0 def __init__(self): zyc_time.__init__(self) # 同花順客戶端登錄 def 同花順客戶端登錄(self,Name='網上股票交易系統5.0'): # 獲取主句柄 同花順模擬賬戶 42763175 密碼 789789 i=0;self.hand=0 self.hand = win32gui.FindWindowEx(0, self.hand, None,Name) while self.hand==0 and i<5: i=i+1 self.hand = win32gui.FindWindowEx(0, self.hand, None,Name) time.sleep(0.1) if self.hand==0: self.zyc_print('請登錄同花順股票統一客戶端') return else: pass self.zyc_print('獲取主句柄成功,self.hand='+str(self.hand)) # 獲取買入句柄 # 點擊F1 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F1) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F1) time.sleep(0.5) self.買入句柄={} i = 0; self.買入句柄['hand'] = 0 self.買入句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.買入句柄['hand'] = win32gui.GetDlgItem(self.買入句柄['hand'], 0xE901) while self.買入句柄['hand'] == 0 and i < 5: i = i + 1 self.買入句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.買入句柄['hand'] = win32gui.GetDlgItem(self.買入句柄['hand'], 0xE901) time.sleep(0.1) if self.買入句柄['hand'] == 0: self.zyc_print('請登錄同花順股票統一客戶端') return else: pass self.zyc_print('獲取買入句柄成功,買入句柄=' + str(self.買入句柄['hand'])) i = 0 self.買入句柄['hand_stock']=0 self.買入句柄['hand_price'] = 0 self.買入句柄['hand_num'] = 0 self.買入句柄['hand_buy'] = 0 while ( self.買入句柄['hand_stock']== 0 or self.買入句柄['hand_price'] ==0 or self.買入句柄['hand_num'] == 0 or self.買入句柄['hand_buy'] == 0 ) and i < 10: i = i + 1 self.買入句柄['hand_stock'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1032) self.買入句柄['hand_price'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1033) self.買入句柄['hand_num'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1034) self.買入句柄['hand_buy'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1006) time.sleep(0.1) if i>5: self.zyc_print('異常') # 點擊F6 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F6) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F6) time.sleep(0.5) i = 0 self.買入句柄['hand_F6'] = 0 while self.買入句柄['hand_F6'] == 0 and i < 5: self.買入句柄['hand_F6'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1047) time.sleep(0.5) # 點擊F7 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F7) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F7) time.sleep(0.5) i = 0 self.買入句柄['hand_F7'] = 0 while self.買入句柄['hand_F7'] == 0 and i < 5: self.買入句柄['hand_F7'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1047) time.sleep(0.5) # 點擊F8 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F8) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F8) time.sleep(0.5) i = 0 self.買入句柄['hand_F8'] = 0 while self.買入句柄['hand_F8'] == 0 and i < 5: self.買入句柄['hand_F8'] = win32gui.GetDlgItem(self.買入句柄['hand'], 1047) time.sleep(0.5) # 獲取賣出句柄 # 點擊F2 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F2) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F2) time.sleep(0.5) self.賣出句柄 = {} i = 0; self.賣出句柄['hand'] = 0 self.賣出句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.賣出句柄['hand'] = win32gui.GetDlgItem(self.賣出句柄['hand'], 0xE901) while self.賣出句柄['hand'] == 0 and i < 5: i = i + 1 self.賣出句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.賣出句柄['hand'] = win32gui.GetDlgItem(self.賣出句柄['hand'], 0xE901) time.sleep(0.1) if self.賣出句柄['hand'] == 0: self.zyc_print('請登錄同花順股票統一客戶端') return else: pass self.zyc_print('獲取賣出句柄成功,賣出句柄=' + str(self.賣出句柄['hand'])) i = 0 self.賣出句柄['hand_stock'] = 0 self.賣出句柄['hand_price'] = 0 self.賣出句柄['hand_num'] = 0 self.賣出句柄['hand_sell'] = 0 while (self.賣出句柄['hand_stock'] == 0 or self.賣出句柄['hand_price'] == 0 or self.賣出句柄['hand_num'] == 0 or self.賣出句柄['hand_sell'] == 0) and i < 10: i = i + 1 self.賣出句柄['hand_stock'] = win32gui.GetDlgItem(self.賣出句柄['hand'], 1032) self.賣出句柄['hand_price'] = win32gui.GetDlgItem(self.賣出句柄['hand'], 1033) self.賣出句柄['hand_num'] = win32gui.GetDlgItem(self.賣出句柄['hand'], 1034) self.賣出句柄['hand_sell'] = win32gui.GetDlgItem(self.賣出句柄['hand'], 1006) time.sleep(0.1) if i > 5: self.zyc_print('異常') # 獲取撤單句柄 # 點擊F3 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F3) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F3) time.sleep(0.5) self.撤單句柄 = {} i = 0; self.撤單句柄['hand'] = 0 self.撤單句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.撤單句柄['hand'] = win32gui.GetDlgItem(self.撤單句柄['hand'], 0xE901) while self.撤單句柄['hand'] == 0 and i < 5: i = i + 1 self.撤單句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.撤單句柄['hand'] = win32gui.GetDlgItem(self.撤單句柄['hand'], 0xE901) time.sleep(0.1) if self.撤單句柄['hand'] == 0: self.zyc_print('請登錄同花順股票統一客戶端') return else: pass self.zyc_print('獲取撤單句柄成功,撤單句柄=' + str(self.撤單句柄['hand'])) i = 0 self.撤單句柄['撤單'] = 0 self.撤單句柄['全撤'] = 0 self.賣出句柄['撤買'] = 0 self.賣出句柄['撤賣'] = 0 while (self.撤單句柄['撤單'] == 0 or self.撤單句柄['全撤'] == 0 or self.撤單句柄['撤買'] == 0 or self.撤單句柄['撤賣'] == 0) and i < 10: i = i + 1 self.撤單句柄['撤單'] = win32gui.GetDlgItem(self.撤單句柄['hand'], 1099) self.撤單句柄['全撤'] = win32gui.GetDlgItem(self.撤單句柄['hand'], 30001) self.撤單句柄['撤買'] = win32gui.GetDlgItem(self.撤單句柄['hand'], 30002) self.撤單句柄['撤賣'] = win32gui.GetDlgItem(self.撤單句柄['hand'], 30003) time.sleep(0.1) if i > 5: self.zyc_print('異常') # 獲取查詢資金句柄 # 點擊F4 win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F4) # 發送雙向交易窗口 win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F4) time.sleep(0.5) self.查詢句柄 = {} i = 0; self.查詢句柄['hand'] = 0 self.查詢句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.查詢句柄['hand'] = win32gui.GetDlgItem(self.查詢句柄['hand'], 0xE901) while self.查詢句柄['hand'] == 0 and i < 5: i = i + 1 self.查詢句柄['hand'] = win32gui.GetDlgItem(self.hand, 0xE900) self.查詢句柄['hand'] = win32gui.GetDlgItem(self.查詢句柄['hand'], 0xE901) time.sleep(0.1) if self.查詢句柄['hand'] == 0: self.zyc_print('請登錄同花順股票統一客戶端') return else: pass self.zyc_print('獲取查詢句柄成功,查詢句柄=' + str(self.查詢句柄['hand'])) # 買入 def 買入(self,stock,price,num): self.start() self.KnkDlg() win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F1) win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F1) time.sleep(0.1) i=0 while i==0 : try: win32_controls.EditWrapper(self.買入句柄['hand_stock']).set_edit_text(stock) win32_controls.EditWrapper(self.買入句柄['hand_price']).set_edit_text(price) win32_controls.EditWrapper(self.買入句柄['hand_num']).set_edit_text(num) except: pass a = win32_controls.EditWrapper(self.買入句柄['hand_stock']).texts()[1] == stock b = win32_controls.EditWrapper(self.買入句柄['hand_price']).texts()[1] == price c = win32_controls.EditWrapper(self.買入句柄['hand_num']).texts()[1] == num if a and b and c: i=1 if i==0: time.sleep(0.1) hand_buy = win32_controls.ButtonWrapper(self.買入句柄['hand_buy']) while hand_buy.IsVisible() == 0 or hand_buy.IsEnabled() == 0: time.sleep(0.1) hand_buy.Click() self.end() if self.KnkDlg()==0: self.zyc_print('買入失敗,'+stock+','+price+','+num) return 1 self.zyc_print('買入成功,'+stock+','+price+','+num) return 0 # 賣出 def 賣出(self,stock,price,num): self.start() self.KnkDlg() win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F2) win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F2) time.sleep(0.1) i=0 while i==0 : try: win32_controls.EditWrapper(self.賣出句柄['hand_stock']).set_edit_text(stock) win32_controls.EditWrapper(self.賣出句柄['hand_price']).set_edit_text(price) win32_controls.EditWrapper(self.賣出句柄['hand_num']).set_edit_text(num) except: pass a = win32_controls.EditWrapper(self.賣出句柄['hand_stock']).texts()[1] == stock b = win32_controls.EditWrapper(self.賣出句柄['hand_price']).texts()[1] == price c = win32_controls.EditWrapper(self.賣出句柄['hand_num']).texts()[1] == num if a and b and c: i=1 if i==0: time.sleep(0.1) hand_sell = win32_controls.ButtonWrapper(self.賣出句柄['hand_sell']) while hand_sell.IsVisible() == 0 or hand_sell.IsEnabled() == 0: time.sleep(0.1) hand_sell.Click() self.end() if self.KnkDlg()==0: self.zyc_print('賣出失敗,'+stock+','+price+','+num) return 1 self.zyc_print('賣出成功,'+stock+','+price+','+num) return 0 # 撤單 def 撤單(self,batch=None): # self.撤單(batch='all')#全撤 # self.撤單(batch='buy')#全撤 # self.撤單(batch='sell')#全撤 # self.撤單(single='600784,7.00,證券買入')#按條件撤單 #self.撤單(subnum='1234')#按委托單號撤單 # self.KnkDlg() win32gui.PostMessage(self.hand, win32con.WM_KEYDOWN, win32con.VK_F3) win32gui.PostMessage(self.hand, win32con.WM_KEYUP, win32con.VK_F3) time.sleep(0.5) if batch=='all': hwndWrapper.HwndWrapper(self.撤單句柄['全撤']).SetFocus() win32_controls.ButtonWrapper(self.撤單句柄['全撤']).Click() elif batch=='buy': hwndWrapper.HwndWrapper(self.撤單句柄['撤買']).SetFocus() win32_controls.ButtonWrapper(self.撤單句柄['撤買']).Click() elif batch=='sell': hwndWrapper.HwndWrapper(self.撤單句柄['撤賣']).SetFocus() win32_controls.ButtonWrapper(self.撤單句柄['撤賣']).Click() else: pass trec=time.time() while True: if time.time()-trec>10: break time.sleep(0.5) if self.KnkDlg()==1: break return 0 def KnkDlg(self): # 關閉所有同進程同線程的對話框 thread, processId = win32process.GetWindowThreadProcessId(self.hand) temp_hwnd = pywinauto.findwindows.find_windows(top_level_only=True, class_name='#32770', parent=None) for hdlg in temp_hwnd: dlgthread, dlgprocessId = win32process.GetWindowThreadProcessId(hdlg) if dlgprocessId==processId and win32gui.IsWindowVisible(hdlg) : hcmd1 = pywinauto.findwindows.find_windows(top_level_only=False, class_name='Button', title_re='是',parent=hdlg) hcmd2 = pywinauto.findwindows.find_windows(top_level_only=False, class_name='Button', title_re='確定',parent=hdlg) hcmd3 = pywinauto.findwindows.find_windows(top_level_only=False, class_name='Button', title_re='確認',parent=hdlg) time.sleep(0.1) if len(hcmd1)>0: hwndWrapper.HwndWrapper(hcmd1[0]).SetFocus() win32_controls.ButtonWrapper(hcmd1[0]).Click() return 0 elif len(hcmd2)>0: hwndWrapper.HwndWrapper(hcmd2[0]).SetFocus() win32_controls.ButtonWrapper(hcmd2[0]).Click() return 0 elif len(hcmd3)>0: hwndWrapper.HwndWrapper(hcmd3[0]).SetFocus() win32_controls.ButtonWrapper(hcmd3[0]).Click() return 0 return 1 def chkwnd(self): if win32gui.IsWindow(self.hand)==0 or self.hand==0: print ('未發現交易窗口!') return 1 trec=time.time() while win32gui.IsWindowVisible( self.hand)==0: if time.time()-trec>3: print('無法調出隱藏的窗口!') return 1 thread, processId = win32process.GetWindowThreadProcessId(self.hand) p = psutil.Process(processId) win32process.CreateProcess(p.exe(),'',None,None,0,win32process.CREATE_NO_WINDOW,None,None,win32process.STARTUPINFO()) time.sleep(0.1) return 0 if __name__=='__main__': pass self=ths_api() self.同花順客戶端登錄() for i in range(3): is_buy= self.買入('000001','9.00','100') # stock='000001';price='10.5';num='300' is_sell= self.賣出('000001','11.35','100') # stock='000001';price='10.5';num='300' self.撤單(batch='all')#全撤