整個流程為:
8:40 自動開啟金字塔軟件,軟件登錄馬上加載交易圖表(Frame1)
30秒后自動啟動圖表交易(整個過程需要一兩分鐘)
17:30 自動執行收盤作業(請先設置好收盤作業的市場,和需要保存的K線周期)
19:00 自動關閉金字塔軟件
20:40 自動開啟金字塔軟件,軟件登錄馬上加載夜盤交易圖表(Frame2)
30秒后自動啟動圖表交易(整個過程需要一兩分鐘)
06:00 自動關閉金字塔軟件
軟件分為兩部分,VC++部分用途為每天兩次自動開啟金字塔軟件并自動點擊“登錄”按鈕。程序在附件中,只有兩個文件(testTraderApi.exe和thostmduserapi.dll),該程序自動連接某期貨公司的ctp行情服務器,取得交易日日期,從而自動判斷當天是否交易,不交易不開啟金字塔軟件。請將testTraderApi.exe設置為隨Windows自動啟動即可(放個快捷方式到“開始菜單》程序》啟動”)。軟件下載:
下載信息 [文件大小: 下載次數: ]點擊瀏覽該文件:自動開啟金字塔.zip
第二部分為金字塔VBA代碼,可復制并放入金字塔的任何一個VBA模塊中:
dim StartTime
dim StartTrade
dim HasDoClose
Sub APPLICATION_Start()
'''''''自動啟動相應的框架(分日盤、夜盤調出相應圖表,請自行疊加相應策略公式)
if cdate(time)>cdate("06:00:00") and cdate(time)<cdate("18:00:00") then
'''''''日盤交易,打開框架名“Frame1”
application.ActivateFrame "Frame1"
else
'''''''夜盤交易,打開框架名“Frame2”
application.ActivateFrame "Frame2"
end if
call application.Settimer(100,30000) '30秒時鐘循環
StartTime = cdate(time)
StartTrade = 0
HasDoClose = 0
End Sub
Sub APPLICATION_Timer(ID)
if ID=100 then
if StartTrade=0 then
''''''''''''''啟動圖表交易
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "user32.dll","FindWindowA","i=ss","f=s", "r=l"
Wrap.Register "user32.dll","FindWindowExA","i=llss","f=s", "r=l"
Wrap.Register "user32.dll","SendMessageA","i=lull","f=s", "r=l"
WM_LBUTTONDOWN=513
WM_LBUTTONUP=514
h = Wrap.FindWindowA("#32770","圖表程式化交易 - 日盤框架 - 交易中") '框架名稱請自行定義,下同
if h=0 then h = Wrap.FindWindowA("#32770","圖表程式化交易 - 夜盤框架 - 交易中")
if h<>0 then
Wrap.PostMessageA h,WM_CLOSE,0,0
StartTrade=1
else
h = Wrap.FindWindowA("#32770","金字塔")
if h<>0 then
h2 = Wrap.FindWindowExA(h,0,"Button","是(&Y)")
if h2<>0 then
Wrap.SendMessageA h2,WM_LBUTTONDOWN,0,0
Wrap.SendMessageA h2,WM_LBUTTONUP,0,0
end if
else
h = Wrap.FindWindowA("#32770","圖表程式化交易 - 日盤框架 - 已停止")
if h=0 then h = Wrap.FindWindowA("#32770","圖表程式化交易 - 夜盤框架 - 已停止")
if h<>0 then
h2 = Wrap.FindWindowExA(h,0,"Button","啟動交易")
if h2<>0 then
Wrap.SendMessageA h2,WM_LBUTTONDOWN,0,0
Wrap.SendMessageA h2,WM_LBUTTONUP,0,0
end if
else
application.PostMessage(33873)
end if
end if
end if
elseif HasDoClose=0 and cdate(time)>cdate("17:30:00") and cdate(time)<cdate("18:00:00") then
''''''''17:30~18:00啟動收盤
HasDoClose=1
call application.Settimer(5,2000)
application.PostMessage(454)'收盤
elseif (StartTime<cdate("16:00:00") and cdate(time)>cdate("19:00:00") and cdate(time)<cdate("19:30:00")) or ((StartTime<cdate("2:30:00") or StartTime>cdate("6:30:00")) and cdate(time)>cdate("06:00:00") and cdate(time)<cdate("06:30:00")) then
'''''''''''''關閉金字塔程序(早上2:30前或前一日6:30后開啟的凌晨6點關閉,下午16點前開啟的19點關閉)
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "user32.dll","FindWindowA","i=ss","f=s", "r=l"
Wrap.Register "user32.dll","FindWindowExA","i=llss","f=s", "r=l"
Wrap.Register "user32.dll","SendMessageA","i=lull","f=s", "r=l"
WM_LBUTTONDOWN=513
WM_LBUTTONUP=514
h = Wrap.FindWindowA("#32770","金字塔")
if h<>0 then
h2 = Wrap.FindWindowExA(h,0,"Button","是(&Y)")
if h2<>0 then
Wrap.SendMessageA h2,WM_LBUTTONDOWN,0,0
Wrap.SendMessageA h2,WM_LBUTTONUP,0,0
end if
else
application.PostMessage(57665)
end if
end if
elseif ID=5 then
'''''''''''開始收盤
call application.killtimer(5)
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "user32.dll","FindWindowA","i=ss","f=s", "r=l"
Wrap.Register "user32.dll","FindWindowExA","i=llss","f=s", "r=l"
Wrap.Register "user32.dll","PostMessageA","i=lull","f=s", "r=l"
WM_CLOSE=16
call application.Settimer(7,600000)'10分鐘后關閉收盤窗口
h = Wrap.FindWindowA("#32770","數據管理器")
tab=Wrap.FindWindowExA(h,0,"SysTabControl32","Tab1")
BM_CLICK=245
h1=Wrap.FindWindowExA(tab,0,"#32770","")
do while h1<>0
bt=Wrap.FindWindowExA(h1,0,"Button","執行收盤(&X)")
if bt<>0 then
Wrap.PostMessageA bt,BM_CLICK,0,0
h1=0
else
h1=Wrap.FindWindowExA(tab,h1,"#32770","")
end if
loop
call application.Settimer(6,2000)
elseif ID=6 then
call application.killtimer(6)
BM_CLICK=245
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "user32.dll","FindWindowA","i=ss","f=s", "r=l"
Wrap.Register "user32.dll","FindWindowExA","i=llss","f=s", "r=l"
Wrap.Register "user32.dll","PostMessageA","i=lull","f=s", "r=l"
h = Wrap.FindWindowA("#32770","金字塔")
bt=Wrap.FindWindowExA(h,0,"Button","是(&Y)")
Wrap.PostMessageA bt,BM_CLICK,0,0
elseif ID=7 then
'''''''結束收盤
Set Wrap = CreateObject("DynamicWrapper")
Wrap.Register "user32.dll","FindWindowA","i=ss","f=s", "r=l"
Wrap.Register "user32.dll","FindWindowExA","i=llss","f=s", "r=l"
Wrap.Register "user32.dll","PostMessageA","i=lull","f=s", "r=l"
WM_CLOSE=16
BM_CLICK=245
h = Wrap.FindWindowA("#32770","金字塔")
bt = 0
bt = Wrap.FindWindowExA(h,0,"Button","確定")
st = 0
st = Wrap.FindWindowExA(h,0,"Static","收盤作業結束。")
if bt<>0 and st<>0 then
Wrap.PostMessageA h,WM_CLOSE,0,0
h = Wrap.FindWindowA("#32770","數據管理器")
Wrap.PostMessageA h,WM_CLOSE,0,0
call application.killtimer(7)
'SendMail "收盤作業完成","收盤作業完成" ''''發信息通知收盤完成,是否需要個人決定
end if
end if
end sub
VBA部分,以往有不少網友不知道怎么用,上面僅用到兩個VBA事件:Sub APPLICATION_Start和Sub APPLICATION_Timer(ID),都是系統內置的,用金字塔菜單》工具》宏》V...B...工程就可以打開看到幾個模塊,任選一個模塊,把上面代碼添加即可。
需要注意的是兩點:
1、必須先停止VBA才能編輯模塊中的代碼
2、APPLICATION_Start和APPLICATION_Timer,在整個金字塔中都必須各只有一個,如果原來已經有了,不要直接覆蓋,而是修改原來的代碼,加到Sub內部。
另外,我原來寫過提高圖表交易程序效率的帖子,也寫過自動檢查金字塔運行狀態的帖子,都可以和本帖子的內容結合起來,結合的時候,注意同名函數的問題就行。同時,我原來還寫過盤后自動進行數據補充,可以結合起來,我自己的做法是,盤后先自動下載一次當天的分筆數據,下載完成后,進行一次當天數據K線檢查,檢查如果沒有發現問題,才啟動收盤,如果有問題,不收盤,短信通知。這個需要大家通過我幾個帖子結合起來,自行修改了。
最后補充一個問題:exe可改名,dll不可改名
[此貼子已經被作者于2013/10/23 13:45:12編輯過]