小編你好,
如題想請問要如何在全日盤的台指期,抓固定期間(例如:10天),每天8:45開盤後的第1小時內"每根"5分K的振幅,
並且將這10天的所有第1小時內的每根5分K振幅全部拿出來算出平均振幅
小編你好,
如題想請問要如何在全日盤的台指期,抓固定期間(例如:10天),每天8:45開盤後的第1小時內"每根"5分K的振幅,
並且將這10天的所有第1小時內的每根5分K振幅全部拿出來算出平均振幅
(1)可使用日盤的數據計算。
(2)每一個交易日有60根K棒,碰到最後結算日會少3根。10個交易日,共需要準備600筆5分K。
(3)用Time判斷大於等於084500且小於等於094000,若為True,則用變數計算振幅並累加,當到最後一根K棒(isLastBar=True)時,將累加的振幅再除以120。
以警示腳本用陣列公式測試 print出來有數值
不曉得這樣合乎要求否 有錯請指正
//適用台指期5分K日盤,全日盤請自行修改期數 SettotalBar(600); variables:r5(0); Arrays:range5[10](0); value1=((high/low)-1)*100; if time>=094500 and time<=094559 then r5=average(value1,12); range5[1]=r5[0]; range5[2]=r5[60]; range5[3]=r5[120]; range5[4]=r5[180]; range5[5]=r5[240]; range5[6]=r5[300]; range5[7]=r5[360]; range5[8]=r5[420]; range5[9]=r5[480]; range5[10]=r5[540]; value2=AvgList(range5[1],range5[2],range5[3],range5[4], range5[5],range5[6],range5[7],range5[8],range5[9],range5[10]); once(close>10000) begin ret=1; end; Print(file("C:\Users\Documents\XS Print\Range5(TEST)\"), "time=",NumToStr(currenttime, 0), "1=",NumToStr(range5[1], 2), "2=",NumToStr(range5[2], 2), "3=",NumToStr(range5[3], 2), "4=",NumToStr(range5[4], 2), "5=",NumToStr(range5[5], 2), "6=",NumToStr(range5[6], 2), "7=",NumToStr(range5[7], 2), "8=",NumToStr(range5[8], 2), "9=",NumToStr(range5[9], 2), "10=",NumToStr(range5[10], 2), "Avg=",NumToStr(value2, 2));
GammaCEO,
你的程式至少有下列兩個問題,而且似乎有效率不佳(重複一直計算不需要計算的平均值r5)及可能的邏輯錯誤(這部份需要再驗證):
(1)當該5分K的最高價等於最低價時,會出現除以零的錯誤,今年4/7跌停鎖死及4/10漲停鎖死,就會出錯。
(2)Time沒有秒鐘,所以Time<=094559要修改,而且應該改成Time<=094000,不然會多算一根K棒,亦即多算094500這根K棒。
請問許教授:
(1)是指說用GetSymbolField抓台指期一般盤5分K的數據,用在台指期全日盤的5分K圖上嗎?(因為我是要用在全日盤5分K圖)
(2)因為台指期一般盤一個交易日有60根5分K,因此語法上10個交易日,是用SettotalBar(12*5*10)來鎖定資料範圍對嗎?
(3)用time鎖定第一小時去計算振幅並累加,我要怎麼確定變數裡面累加的振幅數值是只有抓10天內的?是靠SettotalBar鎖定資料範圍來確保他每次計算不斷累積的振幅數據是只有10天內的資料嗎?
GammaCEO,
你的程式至少有下列兩個問題,而且似乎有效率不佳(重複一直計算不需要計算的平均值r5)及可能的邏輯錯誤(這部份需要再驗證):
(1)當該5分K的最高價等於最低價時,會出現除以零的錯誤,今年4/7跌停鎖死及4/10漲停鎖死,就會出錯。
(2)Time沒有秒鐘,所以Time<=094559要修改,而且應該改成Time<=094000,不然會多算一根K棒,亦即多算094500這根K棒。
多謝教授糾錯
因為在個人腳本內是先將r5函數化後再求計算值,為了簡便回答直接用單一警示腳本計算
的確要避開分母為零的除錯,是應該加上if high>low then value1=((high/low)-1)*100 else value1=((high[1]/low[1])-1)*100;
期數的時間應該改成>=094000 and <094459
這二點疏忽了
(1)若用全日盤,則每天要多準備75根5分K,亦即總共要準備(60+75)*10=1350筆資料。受限於伺服器存放的分K數量,用全日盤5分K,你只能抓到最近6個交易日的資料。
(2)SetTotalBar用來準備資料,日盤的話,每天60筆,10天就SetTotalBar(600);
GammaCEO,
程式可以更有效率地處理,你參考一下:
//計算10個交易日第一個小時的5分鐘平均振幅(盤中) setTotalBar(600); if barfreq<>"Min" or barinterval<>5 then raiseRunTimeError("限用5分鐘"); var: Sum(0); if getInfo("TradeMode")=0 and date<>currentdate then begin if time>=084500 and time<=094000 then begin value1=IFF(high>low,100*(high/low-1),0); Sum=Sum+value1; print(date,time,"最高價",high,"最低價",low,"振幅",value1); end; end; if isLastBar then print("平均振幅", Sum/120);
//計算10個交易日第一個小時的5分鐘平均振幅(收盤後) setTotalBar(600); if barfreq<>"Min" or barinterval<>5 then raiseRunTimeError("限用5分鐘"); var: Sum(0); if time>=084500 and time<=094000 then begin value1=IFF(high>low,100*(high/low-1),0); Sum=Sum+value1; print(date,time,"最高價",high,"最低價",low,"振幅",value1); end; if isLastBar then print("平均振幅", Sum/120);
原來抓區間值可以在指定讀取筆數內以迴圈方式累加
之前都一根一根Kbar去計算取值
多謝教授開示👍👍👍
這樣我很多腳本都可以依樣畫葫蘆去做簡化了
根據時序程式運作的方式來處理資料,會是比較有效率的做法。很多時候,迴圈或是陣列是可以不用的。
15 評論