autoit连通文华财经与excel
autoit连通文华财经与excel
101122
autoit可以抓控件内的文本信息,但是文华财经大量非标准控件,信息抓取不了(比如图标标题栏的指标数值等信息)
之前用模拟键鼠操作另一个应用程序Text
Catch来从指定位置抓取文本信息,然后存到文本文件,再运行excel文件,模拟键鼠操作导入文件
昨天又看了autoit帮助以及一些国外论坛,发现有更简洁高效的方法来用autoit实现连通文华财经与excel。
autoit可以调用其他软件的dll文件来直接实现功能,而不需要用模拟键鼠操作这个程序。先安装Aqua
Deskperience(一个抓文本的程序),它会注册一个dll,TCaptureX,autoit里拿来用就好了。下面的代码就是取了我的文华财经里的一个图标窗口的标题栏,其中有显示反手裕量。信息在字符串$resx中,再通过一点字符串处理代码就能把反手裕量取到。
AutoItSetOption ( “WinTitleMatchMode”, 2)
$Title = WinGetTitle( “文华财经
- Mytrader交易信息系统“)
$hwnd = Dec(StringTrimLeft(WinGetHandle($Title), 2))
$oShellx = ObjCreate(“TCaptureX.TextCaptureX”)
$resx = $oShellx.GetTextFromRect($hwnd, 519, 73, 850, 100)
MsgBox(0, $hwnd, $resx)
然后呢,我也不需要再运行excel文件模拟键鼠操作录入数据,可以用命令直接控制excel行为。autoit装好后有个文件Excel.au3,用
#include
<Excel.au3>
加载后可以使用一系列命令,比如下面的代码先打开文件,然后在“权益”表上增加一行当天的数据
$sFilePath1 = “c:\aa.xlsx”
$oExcel = _ExcelBookOpen($sFilePath1)
_ExcelSheetActivate($oExcel, “权益“)
$val = _ExcelReadCell($oExcel, 1,1) ;cell(1,1)用公式取最后一行的行号
_ExcelWriteCell($oExcel, $val+1, $val+1, 1)
_ExcelWriteCell($oExcel, _NowDate(), $val+1, 2)
_ExcelWriteCell($oExcel,
$dtqy,
_ExcelWriteCell($oExcel,
$dtky,
4)
上面的直接抓取非标准控件内的文本信息,我暂时只是用来取一些信息完成盘后记录,其实再加一点代码就可以自动交易了,比如文华财经里编一个指标确定买卖方向,买就在图上写个“B”,卖就写个“S”,然后autoit定时取这个信息,取到后和目前持仓方向(从交易软件里获取信息)做比较,如果不一致就控制交易软件反手。
101214:
自用的两个盘后记录程序(用在2010年12月开始的新的期货组合和记录表格)。(不多解释,如果你用得到,可以看看)
#############################
盘后1.au3
#Include <Array.au3>
#include <Date.au3>
#include <Excel.au3>
AutoItSetOption ( “WinTitleMatchMode”, 2)
If(Not WinExists ( “IB Trader Workstation”))
MouseClick(“left”,116,752,1)
WinWait(“登录”)
Send(“帐号“)
Send(“{tab}”)
send(“密码“)
send(“{enter}”)
winwait(“IB Trader Workstation”)
sleep(5000)
EndIf
$sFilePath1 = “c:\ib.xls”
$oExcel = _ExcelBookOpen($sFilePath1)
_ExcelSheetActivate($oExcel, “sheet8”)
###################################
#Include <Array.au3>
#include <Date.au3>
#include <Excel.au3>
Dim $avArray[14]
Dim $avArray2[14]
Dim $avArray3[14]
Dim $avArray4[14]
Dim $avArray5[14]
Dim $xa
Dim $xl
AutoItSetOption ( “WinTitleMatchMode”, 2)
If(Not WinExists ( “文华财经 - Mytrader交易信息系统”))
while(1)
Run(“D:\上海中期Mytrader交易信息系统\mytrader2009.exe”)
if WinExists ( “消息”) Then
EndIf
if WinExists ( “系统通知”) Then
EndIf
sleep(1000)
If WinActive (
ExitLoop
ProcessClose(“mytrader2009.exe”)
ProcessWaitClose(“mytrader2009.exe”)
WEnd
EndIf
WinActivate( “文华财经 - Mytrader交易信息系统”)
$i=0
$str=”rbzncutal9rum9a9y9p9s9cf
$Title = WinGetTitle( “文华财经 - Mytrader交易信息系统”)
$hwnd = Dec(StringTrimLeft(WinGetHandle($Title), 2))
$oShellx = ObjCreate(“TCaptureX.TextCaptureX”)
while(1)
WinActivate( “文华财经 - Mytrader交易信息系统”)
ControlFocus ( “文华财经 - Mytrader交易信息系统”, “”, 32873)
ControlSend
32873,”nj”)
Send ( “{enter}”)
sleep(1000)
$resx = $oShellx.GetTextFromRect($hwnd, 450, 73, 850, 100)
$poshl=StringInStr ( $resx, “cc” )+5
$hl=Number(StringMid ( $resx,$poshl,6))
If $hl>0 Then ExitLoop
WEnd
Do
while(1)
$pingzhong=StringMid ( $str, $i*2+1,2)
WinActivate( “文华财经 - Mytrader交易信息系统”)
ControlFocus ( “文华财经 - Mytrader交易信息系统”, “”, 32873)
ControlSend
32873,$pingzhong)
Send ( “{enter}”)
sleep(1000)
$resx = $oShellx.GetTextFromRect($hwnd, 450, 73, 850, 100)
$pos=StringInStr ( $resx, “zz” )+5
$pos2=StringInStr ( $resx, “ZHMT” )+5
$pos3=StringInStr ( $resx, “cc” )+5
$avArray[$i]=Number(StringMid ($resx,$pos,6))
$avArray2[$i]=Number(StringMid ( $resx,$pos2,4))
$avArray3[$i]=Number(StringMid ( $resx,$pos3,6))
If $avArray3[$i]>0 And
abs($avArray[$i])>0 Then ExitLoop
WEnd
$i=$i+1
Until $i = 14
ControlClick ( “文华财经 - Mytrader交易信息系统”,””, 2089)
ControlFocus ( “客户登录”, “”, 1966)
Send(“帐号“)
sleep(500)
ControlFocus ( “客户登录”, “”, 1967)
Send(“密码“)
sleep(500)
ControlCommand ( “客户登录”, “”, 1968, “SetCurrentSelection”, 10
)
ControlClick (“客户登录”, “”,1970)
WinWait ( “帐号“)
while(1)
$zzzzz=ControlListView ( “帐号“, “”, 2411,
“GetText”,0,3 )
$msgb1=WinGetTitle ( “帐号“)
$msgb2=StringInStr ( $msgb1, “,” )
If $zzzzz>0 and $msgb2>0 Then
ExitLoop
WEnd
$msgb4=StringInStr ( $msgb1, “,” ,1)
$msgb5=StringInStr ( $msgb1, “资金”)
$dtqy=StringMid( $msgb1, $msgb2-2,2) & StringMid(
$msgb1, $msgb2+1,$msgb4-($msgb2+1))
$dtky=number(stringMid( $msgb1, $msgb5+3,2)) &
StringMid( $msgb1, $msgb5+5,5)
EndIf
$str2=”rb1zn1cu1ta1l11ru1m11a11
$j=0
Do
$aa=ControlListView ( “帐号“, “”, 2411,
“GetText”,$j,0 )
$bb=StringInStr ( $aa, “1” )
$cc=StringMid( $aa, 1,$bb)
If $bb>0
If $cc=”a1″ Then
$avArray4[7]=ControlListView ( “11800425”, “”,2411, “GetText”, $j,1
)
$avArray5[7]=ControlListView ( “11800425”, “”,2411, “GetText”, $j,3
)
Else
$dd=(StringInStr ( $str2,$cc )+2)/3-1
$avArray4[$dd]=ControlListView ( “11800425”, “”,2411, “GetText”,
$j,1 )
$avArray5[$dd]=ControlListView ( “11800425”, “”,2411, “GetText”,
$j,3 )
EndIf
EndIf
$j=$j+1
Until $j = 14
WinClose ( “帐号“)
WinActivate( “文华财经 - Mytrader交易信息系统”)
;If(Not WinExists ( “帐号2“))
;MouseClick(“right”,840,726,1)
;MouseClick(“left”,863,734,1)
;ControlClick (“提示”, “”,6)
;sleep(500)
;MouseClick(“left”,840,726,1)
;ControlFocus ( “客户登录”, “”, 1966)
;Send(“帐号2“)
;ControlFocus ( “客户登录”, “”, 1967)
;Send(“密码2“)
;ControlClick (“客户登录”, “”,1970)
;WinWait ( “帐号2“)
;while(1)
;$zzzzz=ControlListView ( “帐号2“, “”, 2411,
“GetText”,0,3 )
;sleep(10000)
;$msgb1x=WinGetTitle ( “帐号2“)
;$msgb2x=StringInStr ( $msgb1x, “,” )
;If $zzzzz>0 And $msgb2x>0 Then
ExitLoop
;WEnd
;$msgb4x=StringInStr ( $msgb1x, “,” ,1)
;$msgb5x=StringInStr ( $msgb1x, “资金”)
;$dtqyx=number(StringMid( $msgb1x, $msgb2x-2,2)) &
StringMid( $msgb1x, $msgb2x+1,$msgb4x-($msgb2x+1))
;$dtkyx=number(stringMid( $msgb1x, $msgb5x+3,2)) &
StringMid( $msgb1x, $msgb5x+5,5)
;EndIf
$dtqyx=100
$dtkyx=100
$file = FileOpen ( “c:\ibmg.txt”, 0)
FileReadLine($file,1)
FileReadLine($file,2)
FileClose($file)
$sFilePath1 = “c:\aa.xlsm”
$oExcel = _ExcelBookOpen($sFilePath1)
_ExcelSheetActivate($oExcel, “当日信息”)
_ExcelWriteArray($oExcel, 2,6,$avArray3, 1)
_ExcelWriteArray($oExcel, 2, 2,$avArray2, 1)
_ExcelWriteArray($oExcel, 2, 5,$avArray, 1)
_ExcelWriteArray($oExcel, 2, 3,$avArray4, 1)
_ExcelWriteArray($oExcel, 2, 4,$avArray5, 1)
_ExcelWriteCell($oExcel, $dtqy, 19, 2)
_ExcelWriteCell($oExcel, $dtky, 20, 2)
_ExcelWriteCell($oExcel, $dtqyx, 19, 3)
_ExcelWriteCell($oExcel, $dtkyx, 20, 3)
_ExcelWriteCell($oExcel, $line1, 19, 4)
_ExcelWriteCell($oExcel, $line2, 20, 4)
_ExcelWriteCell($oExcel, $hl, 28, 2)