经过一段时间的学习和摸索,制作了自动下单模块。把读取新浪或东方财富接口实时数据,编写策略,和自动下单三项结合一起,可能是个低风险稳定盈利模式,但也有可能进入自动赔光模式噢。
1、打开证券软件,用“按键精灵”等可以查询句柄的软件查询输入证券代码该文本框、数量文本框、下单按钮等句柄值。句柄可简单理解为WINDOWS对窗口控件的临时编号(软件关闭后重启,句柄值要重新查)。句柄也可以用程序遍历,写在后面。
2、打开excel行情表并实时更新,可以是股票,或者是期权、期货、可转债等衍生品。网上有模板,我也补充了一部分,详见https://www.jisilu.cn/question/352388
3、当满足策略触发条件时,自动进入买入或卖出,调用sendmessage向证券软件的相关句柄发送信息(填写代码、数量,模拟鼠标点击等),完成自动下单。
VBA 代码示例
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal TofMilliSeconds As Long)
Const WM_LBUTTONDOWN = &H201 '鼠标按下
Const WM_LBUTTONUP = &H202 '鼠标弹出
Const WM_SETTEXT = &HC '发送代码到文本框
Sub test0501()
Dim AWnd As Long, BWnd As Long, CWnd As Long, DWnd As Long, a$, b$, c$
AWnd = Range("C2") '填入证券代码句柄值
BWnd = Range("C3") '填价格框句柄值
Wnd = Range("C4") '填数量框句柄值
DWnd = Range("C5")
a = Range("D2") '证券代码
b = Range("D3") '价格
c = Range("D4") '股数
SendMessage AWnd, WM_SETTEXT, 0, ByVal a '填入证券代码
Sleep 200
SendMessage BWnd, WM_SETTEXT, 0, ByVal b '输入价格
Sleep 200
SendMessage CWnd, WM_SETTEXT, 0, ByVal c '输入股数
Sleep 200
SendMessage DWnd, WM_LBUTTONDOWN, 0&, 0& '按下单按钮
SendMessage DWnd, WM_LBUTTONUP, 0&, 0&
End Sub
PYTHON 代码示例,须先安装pywin32模块
import win32con,win32gui
import time
t1=264270#代码句柄值
t2=460854#价格句柄值
t3=328896#数量句柄值
t4=133236#下单句柄值
a='501050'#股票代码
b='1.1'#价格
c='100'#数量
win32gui.SendMessage(t1,win32con.WM_SETTEXT,None,a)
time.sleep(0.1)
win32gui.SendMessage(t2,win32con.WM_SETTEXT,None,b)
time.sleep(0.1)
win32gui.SendMessage(t3,win32con.WM_SETTEXT,None,c)
time.sleep(0.1)
win32gui.PostMessage(t4, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32gui.PostMessage(t4, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
句柄遍历:
用FindWindow查到券商软件的顶层句柄,然后用FindWindowEx查找下一级所有的句柄。层层推进。从理论上讲,应该用深搜或宽搜做更好,现在不会了。我用多层循环了。
每次打开券商软件,句柄值会变,结构不变。遍历句柄后,以我的国信证券为例,取第十级的9,10,13,16。即二维数组中的arrjb(10,9)等可做买入操作。
python句柄遍历示例
import win32api,win32con,win32gui
import time
HWnd=0
HWnd=win32gui.FindWindow(None,"****网上交易***某某某")
listjb.append(HWnd)
list_tt = []
BBB = win32gui.FindWindowEx(listjb[0], BBB, None, None)
#print(BBB)
if BBB > 0:
list_tt.append(BBB)
else:
break
listjb.append(list_tt)
list_tt=[]
for j in listjb[i-1]:#遍历父句柄
for m in range (10000):
BBB = win32gui.FindWindowEx(j, BBB, None, None)
if BBB > 0:
list_tt.append(BBB)
else:
break
listjb.append(list_tt)
print(listjb[7][151])
bb = win32gui.FindWindowEx(listjb[6][6], 0, None, "卖出下单")
if aa == 0 or bb == 0:
print("句柄可能有误")
if aa !=listjb[7][18] or bb != listjb[7][151]:
print("句柄可能有误")
附注:
1、券商软件默认设置一般有个下单确认,是自动下单的障碍,在设置中将勾勾取消即可,如果勾不掉,参照上面的FindWindow和FindWindowEx和sendmessage机器自动点掉。
2、下单模块我贴出来了,有点VBA基础的稍作修改就可以用了。
3、如果是代码小白或调试不成功,我微信号luckyszt,或加我QQ415216616为好友后,申请远程协助。
4、不是每个券商软件都能搞定,经实战,国信 广发 银河行,华宝、中航不行,华宝和中航中的证券代码输入框的句柄类型是 Afxwnd42,不是eidt,信息发送不了。
1、打开证券软件,用“按键精灵”等可以查询句柄的软件查询输入证券代码该文本框、数量文本框、下单按钮等句柄值。句柄可简单理解为WINDOWS对窗口控件的临时编号(软件关闭后重启,句柄值要重新查)。句柄也可以用程序遍历,写在后面。
2、打开excel行情表并实时更新,可以是股票,或者是期权、期货、可转债等衍生品。网上有模板,我也补充了一部分,详见https://www.jisilu.cn/question/352388
3、当满足策略触发条件时,自动进入买入或卖出,调用sendmessage向证券软件的相关句柄发送信息(填写代码、数量,模拟鼠标点击等),完成自动下单。
VBA 代码示例
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal TofMilliSeconds As Long)
Const WM_LBUTTONDOWN = &H201 '鼠标按下
Const WM_LBUTTONUP = &H202 '鼠标弹出
Const WM_SETTEXT = &HC '发送代码到文本框
Sub test0501()
Dim AWnd As Long, BWnd As Long, CWnd As Long, DWnd As Long, a$, b$, c$
AWnd = Range("C2") '填入证券代码句柄值
BWnd = Range("C3") '填价格框句柄值
Wnd = Range("C4") '填数量框句柄值
DWnd = Range("C5")
a = Range("D2") '证券代码
b = Range("D3") '价格
c = Range("D4") '股数
SendMessage AWnd, WM_SETTEXT, 0, ByVal a '填入证券代码
Sleep 200
SendMessage BWnd, WM_SETTEXT, 0, ByVal b '输入价格
Sleep 200
SendMessage CWnd, WM_SETTEXT, 0, ByVal c '输入股数
Sleep 200
SendMessage DWnd, WM_LBUTTONDOWN, 0&, 0& '按下单按钮
SendMessage DWnd, WM_LBUTTONUP, 0&, 0&
End Sub
PYTHON 代码示例,须先安装pywin32模块
import win32con,win32gui
import time
t1=264270#代码句柄值
t2=460854#价格句柄值
t3=328896#数量句柄值
t4=133236#下单句柄值
a='501050'#股票代码
b='1.1'#价格
c='100'#数量
win32gui.SendMessage(t1,win32con.WM_SETTEXT,None,a)
time.sleep(0.1)
win32gui.SendMessage(t2,win32con.WM_SETTEXT,None,b)
time.sleep(0.1)
win32gui.SendMessage(t3,win32con.WM_SETTEXT,None,c)
time.sleep(0.1)
win32gui.PostMessage(t4, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32gui.PostMessage(t4, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
句柄遍历:
用FindWindow查到券商软件的顶层句柄,然后用FindWindowEx查找下一级所有的句柄。层层推进。从理论上讲,应该用深搜或宽搜做更好,现在不会了。我用多层循环了。
每次打开券商软件,句柄值会变,结构不变。遍历句柄后,以我的国信证券为例,取第十级的9,10,13,16。即二维数组中的arrjb(10,9)等可做买入操作。
python句柄遍历示例
import win32api,win32con,win32gui
import time
1、求一级句柄
listjb=[]HWnd=0
HWnd=win32gui.FindWindow(None,"****网上交易***某某某")
listjb.append(HWnd)
print(listjb[0])
BBB = 0list_tt = []
2、求二级句柄
for i in range (10000):BBB = win32gui.FindWindowEx(listjb[0], BBB, None, None)
#print(BBB)
if BBB > 0:
list_tt.append(BBB)
else:
break
listjb.append(list_tt)
print(listjb[1])
3、求三级及以上句柄
for i in range(2,11):#第i+1级句柄list_tt=[]
for j in listjb[i-1]:#遍历父句柄
for m in range (10000):
BBB = win32gui.FindWindowEx(j, BBB, None, None)
if BBB > 0:
list_tt.append(BBB)
else:
break
listjb.append(list_tt)
print(listjb)
print(listjb[7][18])print(listjb[7][151])
4、核对
aa = win32gui.FindWindowEx(listjb[6][5], 0, None, "买入下单")bb = win32gui.FindWindowEx(listjb[6][6], 0, None, "卖出下单")
if aa == 0 or bb == 0:
print("句柄可能有误")
if aa !=listjb[7][18] or bb != listjb[7][151]:
print("句柄可能有误")
附注:
1、券商软件默认设置一般有个下单确认,是自动下单的障碍,在设置中将勾勾取消即可,如果勾不掉,参照上面的FindWindow和FindWindowEx和sendmessage机器自动点掉。
2、下单模块我贴出来了,有点VBA基础的稍作修改就可以用了。
3、如果是代码小白或调试不成功,我微信号luckyszt,或加我QQ415216616为好友后,申请远程协助。
4、不是每个券商软件都能搞定,经实战,国信 广发 银河行,华宝、中航不行,华宝和中航中的证券代码输入框的句柄类型是 Afxwnd42,不是eidt,信息发送不了。
0
楼主请教一下这句代码:
ID_control_hWnd = GetDlgItem(FWnd, &HF)
这里面的EDIT编辑框句柄是&HF。
我用按键精灵去抓,得到的是这样的句柄:1117770,不是&HF啊。
楼主方便给解惑答疑么。
ID_control_hWnd = GetDlgItem(FWnd, &HF)
这里面的EDIT编辑框句柄是&HF。
我用按键精灵去抓,得到的是这样的句柄:1117770,不是&HF啊。
楼主方便给解惑答疑么。
0
romapass - I love FJ.
关掉系统中再次确认设置后,也无法最终解决问题。
买卖A股股票确实不再弹出再次确认框,但只能一次下单成功,因为还会弹出下单成功的框,导致后面的下单无法实现。
买卖A股股票确实不再弹出再次确认框,但只能一次下单成功,因为还会弹出下单成功的框,导致后面的下单无法实现。
0
楼主,谢谢你的好思路,我按你的提示,快搞成了,只差一步,求教一下:
以卖出为例:我用VBA编的小程序,自动在交易软件中输入卖出股票代码、卖出股数、卖出价格,都成功,而且点【确定】也成功。讨厌的是,点【确定】后,又弹出一个小窗口,让再次确认是否委托。这个我试了一晚上也没有试成功。现在我还差的是在新弹出的小窗口中再按一下《确定》按钮,请教如何实现。我用的是银河证券海王星融资融券合一版交易软件。
以卖出为例:我用VBA编的小程序,自动在交易软件中输入卖出股票代码、卖出股数、卖出价格,都成功,而且点【确定】也成功。讨厌的是,点【确定】后,又弹出一个小窗口,让再次确认是否委托。这个我试了一晚上也没有试成功。现在我还差的是在新弹出的小窗口中再按一下《确定》按钮,请教如何实现。我用的是银河证券海王星融资融券合一版交易软件。
16
赞同来自: 孔老大 、wang2017 、壹壹壹 、jiangdaya 、fxie 、 、 、 、 、 、 、 、 、 、更多 »
下单模块
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal TofMilliSeconds As Long)
Const WM_LBUTTONDOWN = &H201 '鼠标按下
Const WM_LBUTTONUP = &H202 '鼠标弹出
Const WM_COMMAND = &H203 '鼠标双击
Const WM_SETTEXT = &HC '发送合约代码到文本框
Sub xd1()
'竖式下单,
Dim XWnd As Long, YWnd As Long, ZWnd As Long, a$, b$, c$, d$, e$
XWnd = Workbooks("xq4月").Worksheets("xq").Range("g2") '填入合约组合框句柄值
YWnd = Workbooks("xq4月").Worksheets("xq").Range("g4") '按下单按钮句柄值
a = Workbooks("xq4月").Worksheets("xq").Range("g8") '合约代码2
b = Workbooks("xq4月").Worksheets("xq").Range("g9") '合约代码2
SendMessage XWnd, WM_SETTEXT, 0, ByVal a '填入合约代码
Sleep 100
SendMessage YWnd, WM_LBUTTONDOWN, 0&, 0& '按下单按钮
SendMessage YWnd, WM_LBUTTONUP, 0&, 0&
Sleep 100
SendMessage XWnd, WM_SETTEXT, 0, ByVal b '填入合约代码
Sleep 100
SendMessage YWnd, WM_LBUTTONDOWN, 0&, 0& '按下单按钮
SendMessage YWnd, WM_LBUTTONUP, 0&, 0&
End Sub
原理和代码并不复杂。这个SendMessage比较冷门,网上资料有但偏少,有些用不同的语言来调用sendmessage,格式还不一样,所以调试比较辛苦。真舍不得免费放出来哈。
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal TofMilliSeconds As Long)
Const WM_LBUTTONDOWN = &H201 '鼠标按下
Const WM_LBUTTONUP = &H202 '鼠标弹出
Const WM_COMMAND = &H203 '鼠标双击
Const WM_SETTEXT = &HC '发送合约代码到文本框
Sub xd1()
'竖式下单,
Dim XWnd As Long, YWnd As Long, ZWnd As Long, a$, b$, c$, d$, e$
XWnd = Workbooks("xq4月").Worksheets("xq").Range("g2") '填入合约组合框句柄值
YWnd = Workbooks("xq4月").Worksheets("xq").Range("g4") '按下单按钮句柄值
a = Workbooks("xq4月").Worksheets("xq").Range("g8") '合约代码2
b = Workbooks("xq4月").Worksheets("xq").Range("g9") '合约代码2
SendMessage XWnd, WM_SETTEXT, 0, ByVal a '填入合约代码
Sleep 100
SendMessage YWnd, WM_LBUTTONDOWN, 0&, 0& '按下单按钮
SendMessage YWnd, WM_LBUTTONUP, 0&, 0&
Sleep 100
SendMessage XWnd, WM_SETTEXT, 0, ByVal b '填入合约代码
Sleep 100
SendMessage YWnd, WM_LBUTTONDOWN, 0&, 0& '按下单按钮
SendMessage YWnd, WM_LBUTTONUP, 0&, 0&
End Sub
原理和代码并不复杂。这个SendMessage比较冷门,网上资料有但偏少,有些用不同的语言来调用sendmessage,格式还不一样,所以调试比较辛苦。真舍不得免费放出来哈。