新浪博客

autoit连通文华财经与excel

2010-12-14 18:21阅读:
autoit连通文华财经与excel
101122

autoit
可以抓控件内的文本信息,但是文华财经大量非标准控件,信息抓取不了(比如图标标题栏的指标数值等信息)
之前用模拟键鼠操作另一个应用程序Text Catch来从指定位置抓取文本信息,然后存到文本文件,再运行excel文件,模拟键鼠操作导入文件
昨天又看了autoit帮助以及一些国外论坛,发现有更简洁高效的方法来用autoit实现连通文华财经与excel
autoit
可以调用其他软件的
dll文件来直接实现功能,而不需要用模拟键鼠操作这个程序。先安装Aqua Deskperience(一个抓文本的程序),它会注册一个dllTCaptureXautoit里拿来用就好了。下面的代码就是取了我的文华财经里的一个图标窗口的标题栏,其中有显示反手裕量。信息在字符串$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, $val+1, 3)
_ExcelWriteCell($oExcel, $dtky, $val+1, 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')) Then

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交易信息系统')) Then
while(1)
Run('D:\上海中期Mytrader交易信息系统\mytrader2009.exe')
WinWait ( '登录上海中期服务器')
WinActivate( '登录上海中期服务器')
Send ( '{ENTER}' )
WinWaitClose ('登录上海中期服务器')
sleep(3000)
if WinExists ( '消息') Then
WinClose ( '消息')
EndIf
sleep(3000)
if WinExists ( '系统通知') Then
WinClose( '系统通知')
EndIf
sleep(1000)
If WinActive ( '文华财经 - Mytrader交易信息系统') Then ExitLoop
ProcessClose('mytrader2009.exe')
ProcessWaitClose('mytrader2009.exe')
WEnd
EndIf
WinActivate( '文华财经 - Mytrader交易信息系统')
$i=0
$str='rbzncutal9rum9a9y9p9s9cfdx59'
$Title = WinGetTitle( '文华财经 - Mytrader交易信息系统')
$hwnd = Dec(StringTrimLeft(WinGetHandle($Title), 2))
$oShellx = ObjCreate('TCaptureX.TextCaptureX')
while(1)
WinActivate( '文华财经 - Mytrader交易信息系统')
ControlFocus ( '文华财经 - Mytrader交易信息系统', '', 32873)
ControlSend ( '文华财经 - Mytrader交易信息系统', '', 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 ( '文华财经 - Mytrader交易信息系统', '', 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
WinActivate( '文华财经 - Mytrader交易信息系统')
If(Not WinExists ( '帐号')) Then
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='rb1zn1cu1ta1l11ru1m11a11y11p11sr1cf1dx1511'
$j=0
Do
$aa=ControlListView ( '帐号', '', 2411, 'GetText',$j,0 )
$bb=StringInStr ( $aa, '1' )
$cc=StringMid( $aa, 1,$bb)
If $bb>0 Then
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')) Then
;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)
$line1 = FileReadLine($file,1)
$line2 = 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)

我的更多文章

下载客户端阅读体验更佳

APP专享