請問如何在日線上面抓到月MACD的DIF前三個月的收盤的值~~~

  •   338 
  • 最後發表   fangchih  2023 八月 01
fangchih 發文於   2023/06/25

xf_MACD("M",xf_weightedclose("M"),12,26,9,value1,value2,value3);

要抓value1月收盤的前三個月的值~~假如現在是6月~~我要抓3月4月5月的值

這樣寫跟月的收盤值不同

//setbackbar(550);

settotalBar(800);

xf_GetValue("M",value1,3)

xf_GetValue("M",value1,2)

xf_GetValue("M",value1,1)

 

再麻煩謝謝~~

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/06/27

Hello fangchih,

 

小幫手測試在指標上是正常的。(參考附圖)

您的狀況應該是資料讀取筆數不足。

由於您是使用在日頻率上取月頻率的MACD,所以會需要大約3150筆資料讀取筆數才能夠計算出正確的值。

附加文件

fangchih 發文於   2023/06/28

我設3150顯示正常了

再請問3150是這樣算出來的嗎

          ((26+9)            X4                    +3)                 X22(一個月22天)=3146

     最大均線26          四倍           抓前三個月

          平滑9       macd資料倍數       資料

 

在請問假如我這一行程式要近兩年都顯示是正常的是3150+250(一年約交易250天)X2=3650

settotalBar(3650);這樣是對的嗎?

如果要效能最佳setbackbar(??);需要額外設置嗎~

感謝

 

XQ小幫手 發文於   2023/06/30

 Hello fangchih,

 

是的,就是如此計算。

setbackbar是用來取得所需的資料,對計算效率並不會有影響 (不過讀取資料所花的時間會有影響)。

細節您可以參考 資料讀取範圍與腳本執行的關係

fangchih 發文於   2023/07/01

小幫手你好:

請教假如指標使用macd在月線計算~~讀取範圍變成(26+9)*4+3嗎?

因為我一直很好奇為什麼要有四倍的倍數~~

在月線上明明26+9+3這些根數就可以計算出來我要的值了~~

這種計算方式~~會有一大堆股票都會因為不足這些根數~~計算出來的值是錯誤~~

不知知道是不是我離解有錯誤~~

你貼的那個連接~~在我還沒有發問前已經看過N次了~~

因為裡面都沒有說明寫在程式裡面程式碼該用哪個函數~~

例如:

setbackbar

settotalBar

這兩個函數我在這個程式要如何設置~~寫指標或許不用兩個都設置因為慢慢跑還是跑得出來~~~

假如我需要讀取資料3150根~~那要如何讓警示只跑第3151根就好~~前面只讀取資料不計算~~~

但假如寫警示就需要~~警示要的就是要效能最快運算出來了~~~

我常常看你們回覆就是貼這一篇~~我看了還是不懂該怎麼寫~~

指標.警示.選股~~這些文章好像都沒有特別說明~~比如MACD要用四倍~~KD只要根數夠就可~~~RSI也是根數夠就可以~~

這些都是我爬以前有人問過才知道的~~~

再麻煩請教~~謝謝

XQ小幫手 發文於   2023/07/04

Hello fangchih,

 

能計算 跟 計算正確 是兩種不同的情況。

26+9+3 是能計算,(26+9)*4+3 是計算出正確的值。

如果您對這有興趣的話,可以去研究MACD的計算方式。

MACD 是種會運用到前期值的指標,所以需要經過運算一定時間的資料後才能夠收斂。

 

setbackbar是資料引用筆數,settotalbar是資料讀取筆數。

setbackbar是設定要引用多少資料,settotalbar是讓腳本先運算多少筆數,這樣像MACD這種需要經過一段時間運算才會收斂的資料 在 即時/回測區間 開始的時候就可以提供正確的值。

該篇文章的下方也有此說明。

 

KD、RSI 也相同,需要一定的資料讀取筆數。

關於所需的資料讀取筆數您可以參考內建的選股腳本。

像KD就會是 SetTotalBar(maxlist(Length,6) * 3), RSI 則是 settotalbar(maxlist(ShortLength,LongLength,6) * 9)。

 

不想要計算那麼長的資料讀取筆數的話,那麼就需要自行撰寫函數腳本計算相關指標。

例如利用陣列來計算保存所需頻率的指標值,這樣就不需要計算那麼長的讀取筆數,經過第一次運算過前期值後,接下來只要計算最新值跟移動陣列中的值即可。

fangchih 發文於   2023/07/05

小編你好:

你提到陣列是我沒有想到的~再請教一下~~假如我用陣列去計算~~這樣要取第一次的MACD參數~~~

還是需要3150根才可以取到要的數值~~這樣不是沒有縮短~~是否可以請教假如我要縮短讀取筆數~可以怎麼樣寫~~

要抓DIF前三個月收盤的數值跟日期~~在日線裡~~是否可以教學一次~~非常感謝~~~

XQ小幫手 發文於   2023/07/10

Hello fangchih,

 

如果您用陣列重新撰寫MACD的話,不需要計算3150根,只需要用陣列計算保存近 (26+9)X4+3 筆月頻率 MACD 的值。

由於是將跨頻率MACD的前期值都保存在陣列內,所以也不需要資料讀取筆數即可計算正確。

只要您在腳本第一筆運算時拉出足夠的歷史資料直接算過去(26+9)X4+3 筆跨頻率MACD的值,接下來只要計算最新值,並在換月時按順序移動陣列中的歷史值即可。

 

在日頻率上會需要將 (26+9)X4+3 多乘以22,是因為要22天才是一根月頻率K棒,故需要經過這麼3150根日頻率Bar,累積的月頻率MACD前期值才有(26+9)X4+3 筆。

但在陣列上計算的話就可以避開這種狀況。

fangchih 發文於   2023/07/10

小幫手你好~

我照你的方法設定月MACD陣列的計算真的快了很多~

再請教一個函數的寫法~如果要同一個函數裡面輸出三個值(M_DIF.M_macd.M_osc)

這一段函數要怎麼改~再麻煩教學一次~~非常感謝

array:M_DIF[143](0),M_macd[143](0),M_osc[143](0);//包存M_MACD的陣列
xf_MACD("M",xf_weightedclose("M"),12,26,9, value1, value2, value3); value4 =getfield("Date","M");
                                          //DIF  //macd //osc 
if currentBar=3150 then//要有足夠筆數才計算
  begin    
    for value4=1 to 143 
      begin
        M_DIF[value4] =xf_getValue("M",value1,value4-1);//將過去143筆月DIF值放入陣列
        M_macd[value4]=xf_getValue("M",value2,value4-1);   
        M_osc[value4] =xf_getValue("M",value3,value4-1);        
      end;
  end else 
if currentBar>3150 then//大於143個月
  begin
    if value4<>value4[1] then 
      begin
        Array_Copy(M_DIF ,1,M_DIF ,2,142);//如果換月的話就移動陣列,把第143個月移出陣列
        Array_Copy(M_macd,1,M_macd,2,142);   
        Array_Copy(M_osc ,1,M_osc ,2,142);   
      end;
    M_DIF[1] =value1;//更新最新DIF值
    M_macd[1]=value2;
    M_osc[1] =value3;
  end; 

我想要輸出 .用存檔檔名改一次只能輸出一個~~

M_DIF

M_MACD

M_OSC

再請教這個函數要怎麼改~~謝謝~~

XQ小幫手 發文於   2023/07/13

Hello fangchih,

 

函數本身只能夠回傳一個值,但是您可以傳變數或陣列給函數當input,讓函數修改該變數/陣列的數值。

可參考 NumericRefNumericArrayRef 等宣告方式。

fangchih 發文於   2023/07/19

小幫手你好~

我自己試著改了幾種不同版本~~

但是結果都沒有辦法把三個值~~在指標呼叫出來~~

是否可以教學一次~~如果我要一個函數~~

最後可以呼叫出來三個函數~~~

非常感謝~~

顯示更多回應 發表回覆
Close