小編你好,
如題想請問要如何在全日盤的台指期,抓固定期間(例如: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 評論