【自動下單外掛】


# -*- 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')#全撤

        
        
        
        
        
        
        
        
        
        
        
        
        

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM