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)
再麻煩謝謝~~
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)
再麻煩謝謝~~
我設3150顯示正常了
再請問3150是這樣算出來的嗎
((26+9) X4 +3) X22(一個月22天)=3146
最大均線26 四倍 抓前三個月
平滑9 macd資料倍數 資料
在請問假如我這一行程式要近兩年都顯示是正常的是3150+250(一年約交易250天)X2=3650
settotalBar(3650);這樣是對的嗎?
如果要效能最佳setbackbar(??);需要額外設置嗎~
感謝
Hello fangchih,
是的,就是如此計算。
setbackbar是用來取得所需的資料,對計算效率並不會有影響 (不過讀取資料所花的時間會有影響)。
細節您可以參考 資料讀取範圍與腳本執行的關係。
小幫手你好:
請教假如指標使用macd在月線計算~~讀取範圍變成(26+9)*4+3嗎?
因為我一直很好奇為什麼要有四倍的倍數~~
在月線上明明26+9+3這些根數就可以計算出來我要的值了~~
這種計算方式~~會有一大堆股票都會因為不足這些根數~~計算出來的值是錯誤~~
不知知道是不是我離解有錯誤~~
你貼的那個連接~~在我還沒有發問前已經看過N次了~~
因為裡面都沒有說明寫在程式裡面程式碼該用哪個函數~~
例如:
setbackbar
settotalBar
這兩個函數我在這個程式要如何設置~~寫指標或許不用兩個都設置因為慢慢跑還是跑得出來~~~
假如我需要讀取資料3150根~~那要如何讓警示只跑第3151根就好~~前面只讀取資料不計算~~~
但假如寫警示就需要~~警示要的就是要效能最快運算出來了~~~
我常常看你們回覆就是貼這一篇~~我看了還是不懂該怎麼寫~~
指標.警示.選股~~這些文章好像都沒有特別說明~~比如MACD要用四倍~~KD只要根數夠就可~~~RSI也是根數夠就可以~~
這些都是我爬以前有人問過才知道的~~~
再麻煩請教~~謝謝
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)。
不想要計算那麼長的資料讀取筆數的話,那麼就需要自行撰寫函數腳本計算相關指標。
例如利用陣列來計算保存所需頻率的指標值,這樣就不需要計算那麼長的讀取筆數,經過第一次運算過前期值後,接下來只要計算最新值跟移動陣列中的值即可。
小編你好:
你提到陣列是我沒有想到的~再請教一下~~假如我用陣列去計算~~這樣要取第一次的MACD參數~~~
還是需要3150根才可以取到要的數值~~這樣不是沒有縮短~~是否可以請教假如我要縮短讀取筆數~可以怎麼樣寫~~
要抓DIF前三個月收盤的數值跟日期~~在日線裡~~是否可以教學一次~~非常感謝~~~
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 筆。
但在陣列上計算的話就可以避開這種狀況。
小幫手你好~
我照你的方法設定月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
再請教這個函數要怎麼改~~謝謝~~
Hello fangchih,
函數本身只能夠回傳一個值,但是您可以傳變數或陣列給函數當input,讓函數修改該變數/陣列的數值。
可參考 NumericRef 和 NumericArrayRef 等宣告方式。
小幫手你好~
我自己試著改了幾種不同版本~~
但是結果都沒有辦法把三個值~~在指標呼叫出來~~
是否可以教學一次~~如果我要一個函數~~
最後可以呼叫出來三個函數~~~
非常感謝~~
13 評論