2018年12月27日 星期四

關於陣列偏移的應用與更新數值先後的影響

之前分享過的舊文:陣列偏移。其應用的情境,我自己常常使用在要讓陣列的第一格是目前最新的數值,其後的格子,依序是預定規則儲存... 大家可能覺得很空泛 =_=

舉個例子來說,在 1分鐘K的圖表上,我想計算15分K的10MA,通常最快的方式是開 15分K最為 Data2,然後 value1= ( Average( Close, 10 ) ) of Data2。但是,除了 Data2 開越多會讓你的 MultiCharts 效率變低以外,還會引動其他的問題。所以,如果不是很困難的狀況,跨週期資料的計算,我喜歡自己用陣列處理。


這不是個泛用於多種跨週期資料建立的方式,只是簡單表達概念。在 1分K 的圖表上,這個 Close15K 陣列所存下來的數值,就會是 15分K、近 10根的收盤價,不需要去開 Data2。Close15K[1] 是15K最近一根的收盤、Close15K[2]則會是15K的上一根收盤價... 只要把前10格的陣列值拿來做平均計算,就會是 15分K 的 10MA 了。
array: Close15K[11](0);

if Mod( time, 15 )=0 then 
  begin
    _arrayShift( Close15K );
    Close15K[1]= Close;
  end
else
  Close15K[1]= Close;

Value1= Average_a( Close15K, 10 );


然而,有同學知道陣列偏移就是一串格子的資料,逐格往後搬,卻苦於想像不出把陣列先搬後更新第一格與先更新第一格再搬的差異... 也許有會有不少人想像不出,以下這兩個 code 造成的效果差異?
我是先搬後更新
_arrayShift( Close15K );
Close15K[1]= Close;

我是先更新後搬
Close15K[1]= Close;
_arrayShift( Close15K );


於是,假設一個有三格供使用的陣列,每個 Round 的第一格更新值依序為 1、2、3,經過三次先搬後存與先存後搬的不同執行順序,最後陣列內容的結果或是什麼?我做了一張圖來幫助了解這個差異。