交易軟件都做得差強(qiáng)人意。。。同花順有熱鍵F1呼出買入和F2賣出的功能(見下圖),通達(dá)信則沒有(是有數(shù)字熱鍵221,223 總之是別扭)
來為通達(dá)信普通買入賣出功能增加熱鍵!(程序化交易的先得能呼叫出買賣功能然后自動填單)
(有錢的可以直接購買fix協(xié)議或者dll接口,沒錢的用ahk模擬人來操作吧,窮得蛋疼。。。)
【技術(shù)原理】
MSAA的全稱是Microsoft Active Accessibility。這是類似DCOM技術(shù)。
技術(shù)模型是這樣的,UI程序可以暴露出一個Interface,方便另一個程序?qū)ζ溥M(jìn)行控制。
MSAA技術(shù)的初衷是為了方便殘疾人使用Windows 程序。自動化自然可以借用這項(xiàng)技術(shù)。
[源代碼]
- ;功能:給通達(dá)信軟件增加類似同花順的交易功能熱鍵
- ;2015年10月25日11:39:03
- ;作者:sunwind
- #SingleInstance,Force
- DetectHiddenWindows,On
- WINNAME := "TdxW_MainFrame_Class"
- CTRLNAME := "MHPToolBar1"
- hwnd:=ControlGetHwnd(CTRLNAME, WINNAME)
-
- idObject:=0
- ;~ window :=0 SELF
- ;~ client := -4
- ;~ child_1 := 1;
- ;~ child_2 := 2;
- ;~ child_3 := 3;
-
- ;========MHPToolBar1========
- ;按鈕所在的“小”窗口
- window := Acc_ObjectFromWindow(hwnd, idObject)
- ;========MainViewBar========
- ;窗口里面的工具欄
- MainViewBar:= Acc_Children(window)[3]
-
-
- ;下面代碼是基于中銀國際交易軟件客戶端測試的
- ;========買入按鈕========
- buy:= Acc_Children(MainViewBar)[1]
- ;~ MsgBox % Acc_Role(buy) " :: " buy.accName(0)
- ;========賣出按鈕========
- sell:= Acc_Children(MainViewBar)[2]
- ;========撤單按鈕========
- cancel:= Acc_Children(MainViewBar)[3]
- ;========成交按鈕========
- chengjiao:= Acc_Children(MainViewBar)[4]
- ;========持倉按鈕========
- chicang:= Acc_Children(MainViewBar)[5]
-
-
-
-
- ;招商證券的
-
- ;========買入按鈕========
- ;buy:= Acc_Children(MainViewBar)[12]
- ;========賣出按鈕========
- ;sell:= Acc_Children(MainViewBar)[13]
-
- ;這些信息查詢,需要用到AccViewer工具。
-
-
- ;========熱鍵定義========
-
- ;F1買入,F(xiàn)2賣出,F(xiàn)3撤單,F(xiàn)4持倉查詢
- f1::
- buy.accDoDefaultAction(0)
- return
-
- f2::
- sell.accDoDefaultAction(0)
- return
-
- f3::
- cancel.accDoDefaultAction(0)
- return
-
- f4::
- chicang.accDoDefaultAction(0)
- return
- ;========輔助函數(shù)========
- ControlGetHwnd(aCtrl, aWin)
- {
- ControlGet, cID,hwnd, , %aCtrl%, ahk_class %aWin%
- Return cID
- }
-
-
- ;========acc庫函數(shù)========
- ; Written by jethrow
- Acc_Init()
- {
- Static h
- If Not h
- h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
- }
- Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
- try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
- }
- Acc_Error(p="") {
- static setting:=0
- return p=""?setting:setting:=p
- }
- Acc_ObjectFromWindow(hWnd, idObject = 0)
- {
- Acc_Init()
- If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
- Return ComObjEnwrap(9,pacc,1)
- }
-
- Acc_Children(Acc) {
- if ComObjType(Acc,"Name") != "IAccessible"
- ErrorLevel := "Invalid IAccessible Object"
- else {
- Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
- if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
- Loop %cChildren%
- i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
- return Children.MaxIndex()?Children:
- } else
- ErrorLevel := "AccessibleChildren DllCall Failed"
- }
- if Acc_Error()
- throw Exception(ErrorLevel,-1)
- }
-
- Acc_Role(Acc, ChildId=0) {
- try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetRoleText(Acc.accRole(ChildId)):"invalid object"
- }
- Acc_GetRoleText(nRole)
- {
- nSize := DllCall("oleacc\GetRoleText", "Uint", nRole, "Ptr", 0, "Uint", 0)
- VarSetCapacity(sRole, (A_IsUnicode?2:1)*nSize)
- DllCall("oleacc\GetRoleText", "Uint", nRole, "str", sRole, "Uint", nSize+1)
- Return sRole
- }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。