打造山寨版的证券自动交易系统

经过一段时间的学习和摸索,制作了自动下单模块。把读取新浪或东方财富接口实时数据,编写策略,和自动下单三项结合一起,可能是个低风险稳定盈利模式,但也有可能进入自动赔光模式噢。
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 = 0
list_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

zxd0424

赞同来自:

学习
2020-10-06 17:18 引用
0

KKKKKKK

赞同来自:

天书,奇谈!
2020-08-09 22:30 引用
1

越冷越起风

赞同来自: 还是IUV

你一本正经的说,我一脸懵逼的看。
2020-08-09 19:53 引用
0

xiaofeng71

赞同来自:

文科生如观天书,不明觉厉
2020-08-04 07:47 引用
0

northwolf

赞同来自:

Mark
2020-08-04 07:40 引用
0

百可乐度

赞同来自:

谢谢,学习一下
2020-08-04 00:40 引用
5

千千日本

赞同来自: 王诺诚 coolchan bill1234567890 超车不翻车

用python每次下50个订单不到1分钟,运行一年多没出错,自己开发的
2020-07-01 01:55 引用
0

量化自由之路

赞同来自:

一个python足以
2020-06-30 23:38 引用
0

bill1234567890

赞同来自:

我试过,花了两周,最后放弃。
2020-06-30 23:32 引用
1

水果教

赞同来自: exunsoft

手动填好,只发送确定消息就好了
2020-06-30 23:01 引用
0

sunbird6

赞同来自:

恭喜进入自动赔光程序
2020-05-08 09:31 引用
0

linzhfq

赞同来自:

学习
2020-05-03 22:39 引用
0

小猫抓老鼠

赞同来自:

广发的,不知道能不能用?
2020-05-03 22:34 引用
0

bhong

赞同来自:

mark
2020-05-03 21:57 引用
0

zhp123456

赞同来自:

牛逼了
2020-04-26 18:21 引用
0

哼哈嘿

赞同来自:

不明觉厉
2020-04-26 16:29 引用
0

jonathanzn

赞同来自:

群主,请教个问题,vba老是提示我类型不匹配是什么原因呢?我用的64位的win10和office365.

2020-04-26 16:04 引用
1

fronz

赞同来自: xtzxzhx

马克一下
2020-04-26 13:34 引用
0

linzhfq

赞同来自:

学习
2020-04-26 12:20 引用
0

zhou000084

赞同来自:

学习下
2020-04-26 09:37 引用
0

zlwjx

赞同来自:

学习
2020-04-22 22:41 引用
0

早上好

赞同来自:

楼主请教一下这句代码:
ID_control_hWnd = GetDlgItem(FWnd, &HF)

这里面的EDIT编辑框句柄是&HF。

我用按键精灵去抓,得到的是这样的句柄:1117770,不是&HF啊。

楼主方便给解惑答疑么。
2020-04-22 20:50 引用
0

刘瑾

赞同来自:

支持了!!
2020-04-22 09:28 引用
1

hellomh

赞同来自: luckyszt

我用同花顺的统一交易端,然后写了一个自动交易的服务端,发送命令就能传递过去交易数据
2020-04-22 08:44 引用
0

长期投资坚持者

赞同来自:

mark
2020-04-22 06:29 引用
0

好大风

赞同来自:

2020-04-22 06:21 引用
0

chenweibin

赞同来自:

2020-04-21 23:34 引用
3

gwxkai

赞同来自: 趋势交易者 benben炒股 scottuji

AutoIt, UIPath, MultiCharts,那个不比楼主的好啊?
学习精神可嘉(我以前也整过类似的),但是这个技术路线、工具、方法,真的很不咋地。。。
2020-04-21 23:27 引用
1

panpan2313

赞同来自: jimmy818

学习一下
2020-04-21 23:16 引用
1

szwangwei88

赞同来自: A杨baby

这些功能用python最方便。
2020-04-07 08:32 引用
1

luckyszt

赞同来自: jimmy818

本楼主也有搞不定求助的时候。我买基金自动下单,系统挂了。原因是我输入的是16开头深圳的基金,系统会跳出这个框,有人能帮忙搞定么。不行的话,只能券商的专业版转智能版了。
2020-04-06 22:58 引用
0

johnwhite

赞同来自:

关注
2020-04-05 20:32 引用
0

格栅思维

赞同来自:

学习
2020-03-31 08:03 引用
0

喔喔鸡

赞同来自:

diao
2020-03-30 23:34 引用
0

菜鸟进化ing

赞同来自:

感谢楼主的好思路,今天终于把excel自动更新股票行情价格等数据弄好,然后已经可以实现自动交易了,谢谢。
2020-03-30 21:33 引用
3

小竹

赞同来自: charlies 量化投资先锋 jimmy818

按键精灵类的东西,部成或单腿处理起来就麻烦了
2020-03-30 13:04 引用
0

lhtsteve

赞同来自:

关注
2020-03-30 13:01 引用
0

racine

赞同来自:

mark
2020-03-30 12:58 引用
0

天天1133

赞同来自:

学习下。
2020-03-30 12:35 引用
0

romapass - I love FJ.

赞同来自:

关掉系统中再次确认设置后,也无法最终解决问题。

买卖A股股票确实不再弹出再次确认框,但只能一次下单成功,因为还会弹出下单成功的框,导致后面的下单无法实现。
2020-03-30 10:18 引用
0

frenk

赞同来自:

请问楼主这工具能否获取 持仓、挂单、成交的数据? 先获取这些数据再根据行情下单会安全些。
2020-03-30 02:22 引用
0

大雪

赞同来自:

学习了。。
2020-03-30 01:06 引用
0

lzq8919283

赞同来自:

2020-03-30 01:01 引用
0

joseph

赞同来自:

mark
2020-03-29 21:34 引用
0

rabbittony

赞同来自:

mark,榜样,先研究下
2020-03-29 16:25 引用
0

财探花

赞同来自:

记录 学习
2020-03-29 15:50 引用
0

wang306

赞同来自:

mark
2020-03-29 10:36 引用
1

x0z0y0

赞同来自: Brevin

mark
2020-03-29 10:28 引用
1

lieshu

赞同来自: A杨baby

mark
2020-03-29 10:22 引用
0

又打新又炒股

赞同来自:

感谢楼上的WATERTY,你提供的办法我也想到了。我要交易的是港股通的股票,我关掉系统中再次确认设置后,买卖A股股票确实不再弹出再次确认框,但港股通交易时,仍会弹出那个再次确认的框。
2020-03-29 10:19 引用
1

aop1234

赞同来自: jimmy818

记号,思路不错!
2020-03-29 10:05 引用
0

gjf2003

赞同来自:

mark
2020-03-29 09:56 引用
0

z7c9

赞同来自:

mark
2020-03-29 09:54 引用
0

又打新又炒股

赞同来自:

最后弹出的让再次确认是否委托的窗口,应该是个MESSAGEBOX窗口。
2020-03-29 07:47 引用
0

又打新又炒股

赞同来自:

楼主,谢谢你的好思路,我按你的提示,快搞成了,只差一步,求教一下:
以卖出为例:我用VBA编的小程序,自动在交易软件中输入卖出股票代码、卖出股数、卖出价格,都成功,而且点【确定】也成功。讨厌的是,点【确定】后,又弹出一个小窗口,让再次确认是否委托。这个我试了一晚上也没有试成功。现在我还差的是在新弹出的小窗口中再按一下《确定》按钮,请教如何实现。我用的是银河证券海王星融资融券合一版交易软件。
2020-03-29 00:26修改 引用
0

潇湘雨

赞同来自:

牛逼
2020-03-28 21:20 引用
0

Dmonk1010

赞同来自:

楼主的作品可以共享吗?
2020-03-28 20:27 引用
0

淋漓尽致

赞同来自:

mark
2020-03-28 19:50 引用
0

yxtsir2003

赞同来自:

牛啊,这个硬核
2020-03-28 17:57 引用
0

Dmonk1010

赞同来自:

你好 我 想在别人的基础上,把稳定性完善下,你可以提供给 大家一起参考一下嘛 ,半成品也可以 ,关键是你的证券公司跟我的要搭配
2020-03-28 17:52 引用
0

涨停10000

赞同来自:

楼主加油,好样的
2020-03-28 16:39 引用
0

Iter王珂

赞同来自:

探索精神很棒
2020-03-28 15:03 引用
0

zzzer

赞同来自:

py最方便,特别操作网页版的
2020-03-28 14:14 引用
0

玉宇

赞同来自:

学习
2020-03-28 14:06 引用
3

修身明德

赞同来自: 刘明LM 熊市手册

Mark一下。买了python,一直提不起学的兴趣,因为需求不大。
其实我的需求只有一个,就是大盘分时低点一键发送买单,分时高点一键发送卖单。很可惜,没有一个交易软件能实现这个功能。就为了这个,花费大量时间学习语言有点得不偿失。
希望楼主这个能帮忙解决我的问题。
2020-03-28 14:01 引用
0

Aspirin

赞同来自:

赞啊
2020-03-28 13:31 引用
1

fr小嗨

赞同来自: 飞的高远

mark
2020-03-28 13:07 引用
0

hippohippo

赞同来自:

赞赞
2020-03-28 12:59 引用
0

数据矿工

赞同来自:

赞,打卡学习
2020-03-28 12:58 引用
2

与时间为友

赞同来自: marler 大象小尚

我就喜欢用Excel来做证券交易,喜欢手动刷新,盘中预测基金净值,晚上核对系统误差的那种感觉,在整理资料的时候你会发现基金调仓的痕迹,盘中会发现好的投资机会。
去年初做了可转债的,今年新增了科创基的,lof基金的,原油基金的。
2020-03-28 12:55 引用
1

having

赞同来自: WLVI

mark
2020-03-28 12:52 引用
3

盛唐风物

赞同来自: jm258 marler 天空海阔风清扬

Excel vba的速度还是不行吧,我用i7试了试行情自动更新,几十个证券就卡顿明显。

用Python同时抓几百个证券一点都不卡。
2020-03-28 12:40 引用
1

zgand

赞同来自: jm258

2020-03-28 12:29 引用
1

sanye

赞同来自: 蚁工

收藏
2020-03-28 12:21 引用
0

风云1699

赞同来自:

*
2020-03-28 12:21 引用
0

没钱又老

赞同来自:

jilu
2020-03-28 12:16 引用
0

mmtian

赞同来自:

虽然我看不懂,还是要谢谢楼主。
2020-03-28 12:03 引用
0

yyttcc705

赞同来自:

必须赞一个。
2020-03-28 11:59 引用
2

招金牛 - 随心所欲而不逾规

赞同来自: rainright anan2201308

感谢分享,但是个人觉得用web下单也许会更加稳定
2020-03-28 11:58 引用
1

baixiqiang

赞同来自: 梦想在前方

可以有偿购买吗?任何一个股票软件都可以吗?
2020-03-28 11:44 引用
1

春秋战国

赞同来自: jm258

学习
2020-03-28 11:29 引用
1

BpAlex

赞同来自: 大象小尚

给个更好的思路,使用接口下单会更稳定更高效。
2020-03-28 10:56 引用
16

luckyszt

赞同来自: 孔老大 wang2017 壹壹壹 jiangdaya fxie 天涯没有海角 amayshen 桑寄生 梵高先生45 几度沉 zsp950 大象小尚 zxd0424 小韭菜团子 葱花饼更多 »

下单模块
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,格式还不一样,所以调试比较辛苦。真舍不得免费放出来哈。
2020-03-28 11:01修改 引用
0

cduym

赞同来自:

值得鼓励,加油
2020-03-28 10:41 引用

该问题目前已经被锁定, 无法添加新回复

发起人

问题状态

  • 最新活动: 2020-10-06 17:18
  • 浏览: 28592
  • 关注: 338