【AHK】给通达信软件增加F1买入,F2卖出 交易热键(基于中银国际客户端测试)

54 篇文章 29 订阅

通达信金融终端网上交易软件 快捷键分为四种
数字键:比如1,61,81,10,91等
点系列键:比如.101,.201,.301.... .909等
功能键:比如F1,F2... 空格键,减号键,TAB等 (F1:分时成交明细、F2:分价表、F3:沪指分时、F4:深指分时、F5分时与K线切换、F6:自选股、F7:树状菜单、 F8:无、F9:期权交易、F10:基本资料、 F11:投资日历、F12:委托)
组合键:比如Ctrl+V,Alt+1,Ctrl+Z等

 

交易软件都做得差强人意。。。同花顺有热键F1呼出买入和F2卖出的功能(见下图),通达信则没有(是有数字热键221,223 总之是别扭)

同花顺的交易界面

 

来为通达信普通买入卖出功能增加热键!(程序化交易的先得能呼叫出买卖功能然后自动填单)

(有钱的可以直接购买fix协议或者dll接口,没钱的用ahk模拟人来操作吧,穷得蛋疼。。。)

 

【技术原理】

 

MSAA的全称是Microsoft Active Accessibility。这是类似DCOM技术。
技术模型是这样的,UI程序可以暴露出一个Interface,方便另一个程序对其进行控制。
MSAA技术的初衷是为了方便残疾人使用Windows 程序。自动化自然可以借用这项技术。


 [源代码]

 

;功能:给通达信软件增加类似同花顺的交易功能热键
;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买入,F2卖出,F3撤单,F4持仓查询
  f1:: 
  buy.accDoDefaultAction(0)
  return
 
  f2::
  sell.accDoDefaultAction(0)
  return
 
  f3::
  cancel.accDoDefaultAction(0)
  return
 
  f4::
  chicang.accDoDefaultAction(0)
  return
  ;========辅助函数========
  ControlGetHwnd(aCtrl, aWin)
{
      ControlGet, cID,hwnd, , %aCtrl%, ahk_class %aWin%
      Return cID
  }
 
 
  ;========acc库函数========
  ; 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
}

 

 

 

 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值