歷史資料陣列問題

  •   610 
  • 最後發表   努力之人  2021 八月 06
努力之人 發文於   2021/07/19

我有個需求是
1.需要將過去五年的資料(收盤價) 判斷條件(大於月線)後分別放入陣列,之後須把陣列重複的數據給移除,再加以排序,那目前的程序如下,發現運行的時間會很久(約20-30秒),請問有改善方法 。

 

Value1 = DateAdd(date, "D", -365*5);  

value2 = GetBarOffset(Value1); 

Array_SetMaxIndex(array_top, 1825);

topCount=0;

For i = 0 to value2-1

Begin

t_sma20= average(close[i],20);

if  close[i]>t_sma20  a then

begin

array_top[topCount] = t_sma20;

topCount=topCount+1;

end;

Array_SetMaxIndex(array_top, topCount);

//排序

Array_Sort(array_top,0,topCount-1,true);

//刪除同樣的元素

j=0;

For i=0 to topCount-1

begin

if array_top[j]<>array_top[i] then

begin

j=j+1;

array_top[j]=array_top[i];

end;

end;

 

topCount=j+1;

 

 

 

2.請問有矩陣自動刪除同樣元素的函示嗎?

排序方式: 標準 | 最新
XQ小幫手 發文於   2021/07/21

Hello 努力之人,

 

1.小幫手看下來應該是沒有函數可以簡化您的計算。

簡單的優化想法是您減少搜尋過去五年的資料並整理的次數(使用時間條件或 once 函數來控制),接下來只比較最新的值。

這樣的話就不用每根Bar都要跑迴圈。

 

2.就小幫手所知是沒有。

您可以在XS函數搜尋網查詢跟array有關的函數。

努力之人 發文於   2021/07/21

hi 小幫手

我目前有使用once 去減少計算量,目前遇到一個問題因為k棒每次都是從離現在時間最遠的地方開始運算,有辦法在once內的函示去取得n年內的每一根k棒資料得到某個數據後 ,再根據這數據去跑每根k棒 謝謝

努力之人 發文於   2021/07/23

hi小幫手還在嗎?感覺好像很難呼叫到小幫手

XQ小幫手 發文於   2021/07/27

Hello 努力之人,

 

小幫手有詢問相關人士看您的腳本是否有辦法優化。

但由於您需要作大量的判定,而這需要使用迴圈去檢查,所以應該是沒辦法靠修改運算方式來縮短時間。

 

另外建議您,如果是只需要計算當下的那根Bar的話,可以使用 isLastBar 函數。

如此就可以讓此計算只在最新的Bar上作執行。

 

關於once函數您可以參照說明。

once函數遇到多行指令的狀況可以使用begin / end 來包圍。

換句話說,就是把您上面的整段用 begin / end 來包起來,這樣腳本執行後就只會運算一次。

努力之人 發文於   2021/07/27

hi,小幫手,在麻煩你了,以下是我的程序架構,我利用Once來一次執行,我希望在Once內去或去五年的資料,目前第一次執行因日期為"date= 19920513.000000" 1992年的五月13號,我有辦法在once內去獲取到今天算起過去五年內的相關資訊嗎?謝謝

 

var:t_initCal(false);

Once(t_initCal = false)

BEgin

//讀取過去五年內的數據

value1 = GetBarOffset(20210727); //取得20210727這根K棒的相對位置

value2 = GetField("close","D")[value1];

print("date=",date,",value1:",value1,",value2:",value2);

t_initCal =true;

END;

//根據Once內的函示運算出某個常數去畫指標

 

 

 

 

努力之人 發文於   2021/07/27

hello小幫手,或者你可以直接幫我寫出從今天開始算過去五年內的次大或次次大的正乖離率與負乖離率,之後用此乖離率與每一個k棒收盤價去推算此指標

XQ小幫手 發文於   2021/07/30

Hello 努力之人,

 

乖離率您可以使用 Bias 函數來計算。

次高或次次高可以使用 NthHighest 函數來取得。

次低或次次低可以使用 NthLowest 函數來取得。

 

由於1年大約有240~250天交易日,假設使用245天好了。

value1 = bias(20); //看您所需的均線期數作修改

value2 = NthHighest(2, value1, (245*5)); //過去5年的次高乖離率

value3 = NthLowest(2, value1, (245*5)); //過去5年的次低乖離率

接著您就可以使用value2跟value3去計算想要的指標了。

 

假如您只要計算最新Bar的值就好的話,可以使用islastbar作判斷。

if islastbar then begin

    value1 = bias(20); //看您所需的均線期數作修改

    value2 = NthHighest(2, value1, (245*5)); //過去5年的次高乖離率

    value3 = NthLowest(2, value1, (245*5)); //過去5年的次低乖離率

    ...計算指標的邏輯...

    end;

 

努力之人 發文於   2021/07/30

Hi小幫手 你的方法無法只能最後一根最後一根的bar,但是我的需求是每一個bar都要去運算,請問有沒有方法?此問題已經來來回回很久了

XQ小幫手 發文於   2021/08/03

Hello 努力之人,

 

如同小幫手上面所說,如果您每根Bar都需要計算的話,那麼就不要加isLastBar作判斷即可。

value1 = bias(20); //看您所需的均線期數作修改

value2 = NthHighest(2, value1, (245*5)); //過去5年的次高乖離率

value3 = NthLowest(2, value1, (245*5)); //過去5年的次低乖離率

 

您也可以嘗試使用once後記錄最高、次高乖離率後接下來只用當期的乖離率與此值作比較,或許會比較快。

舉例來說:

value1 = bias(20);

once(True) begin

value2 = Highest(value1, (245*5)); //過去5年的最高乖離率

value3 = NthHighest(2, value1, (245*5)); //過去5年的次高乖離率

value4 = Lowest(value1, (245*5));  //過去5年的最低乖離率

value5 = NthLowest(2, value1, (245*5)); //過去5年的次低乖離率

end;

 

if value1 > value2 then value2 = value1 //當下乖離率大於過去最高乖離率的話就更新最高

else if value1 < value2 and value1 > value3 then value3 = value1 //當下乖離率大於次高且小於最高的話更新次高

else if value1 < value4 then value4 = value1 //當下乖離率小於過去最低乖離率的話就更新最低

else if value1 > value4 and value1 < value5 then value5 = value1; //當下乖離率小於次低且大於最低的話更新次低

您所需使用的就是value3 與 value5 (次高與次低乖離率)。

努力之人 發文於   2021/08/03

hi小幫手 謝謝回答,我詳細讀完回覆後,問題還是存在,可能我沒有詳細說清楚,抱歉我在說明一下,
今天是2021/08/03 那我想要程序一開始從日期2017/08/03~2021/08/03找出最高 次高乖離率(在這我們簡稱bais_1H ,bais_2H ),找出後我需要在1992/01/01~至今天的每一根K棒都根據bais_1H ,bais_2H去運算出每一個K棒的數據在畫在每一個K棒上的指標,以上不知道是否可以明白我的意思 謝謝 

顯示更多回應 發表回覆
Close