如何抓固定天數內,每天開盤第1小時內的5分K平均振幅

  •   323 
  • 最後發表   kkl  4 週前
kkl 發文於   2025/05/05

小編你好,
如題想請問要如何在全日盤的台指期,抓固定期間(例如:10天),每天8:45開盤後的第1小時內"每根"5分K的振幅,

並且將這10天的所有第1小時內的每根5分K振幅全部拿出來算出平均振幅

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/05/05

(1)可使用日盤的數據計算。

(2)每一個交易日有60根K棒,碰到最後結算日會少3根。10個交易日,共需要準備600筆5分K。

(3)用Time判斷大於等於084500且小於等於094000,若為True,則用變數計算振幅並累加,當到最後一根K棒(isLastBar=True)時,將累加的振幅再除以120。

GammaCEO 發文於   2025/05/05

以警示腳本用陣列公式測試 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));

虎科大許教授 發文於   2025/05/05

GammaCEO,

你的程式至少有下列兩個問題,而且似乎有效率不佳(重複一直計算不需要計算的平均值r5)及可能的邏輯錯誤(這部份需要再驗證):

(1)當該5分K的最高價等於最低價時,會出現除以零的錯誤,今年4/7跌停鎖死及4/10漲停鎖死,就會出錯。

(2)Time沒有秒鐘,所以Time<=094559要修改,而且應該改成Time<=094000,不然會多算一根K棒,亦即多算094500這根K棒。

kkl 發文於   2025/05/05

請問許教授:

(1)是指說用GetSymbolField抓台指期一般盤5分K的數據,用在台指期全日盤的5分K圖上嗎?(因為我是要用在全日盤5分K圖)

(2)因為台指期一般盤一個交易日有60根5分K,因此語法上10個交易日,是用SettotalBar(12*5*10)來鎖定資料範圍對嗎?

(3)用time鎖定第一小時去計算振幅並累加,我要怎麼確定變數裡面累加的振幅數值是只有抓10天內的?是靠SettotalBar鎖定資料範圍來確保他每次計算不斷累積的振幅數據是只有10天內的資料嗎?

GammaCEO 發文於   2025/05/05

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

這二點疏忽了

虎科大許教授 發文於   2025/05/05

(1)若用全日盤,則每天要多準備75根5分K,亦即總共要準備(60+75)*10=1350筆資料。受限於伺服器存放的分K數量,用全日盤5分K,你只能抓到最近6個交易日的資料。

(2)SetTotalBar用來準備資料,日盤的話,每天60筆,10天就SetTotalBar(600);

虎科大許教授 發文於   2025/05/05

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);

虎科大許教授 發文於   2025/05/05

//計算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);

GammaCEO 發文於   2025/05/05

原來抓區間值可以在指定讀取筆數內以迴圈方式累加

之前都一根一根Kbar去計算取值

多謝教授開示👍👍👍

這樣我很多腳本都可以依樣畫葫蘆去做簡化了

虎科大許教授 發文於   2025/05/05

根據時序程式運作的方式來處理資料,會是比較有效率的做法。很多時候,迴圈或是陣列是可以不用的。

顯示更多回應 發表回覆
Close