SMA的MACD

  •   51 
  • 最後發表   CL  2025 八月 18
CL 發文於   2025/08/15

您好

我試著寫一個用SMA而不是EMA的MACD指標,如果是單一頻率沒什麼問題,但我嘗試寫跨屏頻率的版本時,雖然可以執行,但是要等很久圖才會出來,不知道是不是因為計算跨頻率變數平均值的關係,我寫的程式如下:

input: FastLength(3, "DIF短天數"), SlowLength(10, "DIF長天數"), MACDLength(16, "MACD天數"),a1(20210101),

FreqType("30", "跨頻率週期", inputkind:=dict(["1分鐘","1"],["5分鐘","5"],["10分鐘","10"],["15分鐘","15"],["30分鐘","30"],["60分鐘","60"],["日","D"],["還原日","AD"]));

var:i(0);

array: ave1[20](0);

switch (FreqType)

begin

case  "1":

if barfreq <> "Tick" and barfreq <> "Min" then raiseruntimeerror("不支援大頻率跨小頻率:主頻率大於1分鐘");

if barinterval <> 1 then raiseruntimeerror("不支援大頻率跨小頻率:主頻率大於1分鐘");

 

Value1 = Average(getfield("close","1"), FastLength) - Average(getfield("close","1"), SlowLength); //macd line

for i=1 to MACDLength

begin

  ave1[i]=xfmin_getvalue("1",value1,i-1);

end;

Value2 = Array_Sum(ave1,1,MACDLength)/MACDLength ; //signal line

Value3 = Value1 - Value2 ; //histogram

其他的頻率就直接剪貼。

想請問一下,有什麼更有效率的寫法,可以讓圖比較快產生。我看了一下內建跨頻率MACD的寫法,都是用函數,但是我不知道要怎麼寫,之前嘗試過,但因為不知道在函數中要怎麼把Getfield的參數傳進去,所以寫不出來。麻煩您的指教。

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/08/15

我們假設你的主頻率是1分鐘,打算計算30分鐘的MACD數值。在非逐筆洗價的情況下,每分鐘都跑迴圈,計算過去15個30分鐘的value1以與本期的value1計算指標(MACDLength=16),在這30分鐘還沒結束之前,過去15個value1的數據並沒有改變,不需要重複一直計算。這是造成效率差的主要原因。

CL 發文於   2025/08/17

我大概了解你的意思,剛想了一下,不知道這樣迴圈是不是就只會執行一次?不過執行時還是要等大概五秒才會出現,看來迴圈可能不是只有執行一次?

但出現另一個問題,就是日級別的數字都正確,但當我把"D"改成其他分鐘的頻率時,不知道為什麼出來的數字不正確。

而且不知道為什麼,其他分鐘頻率的圖就跑很久才出來。

----------------------------------------------------------------------------

假設要在分鐘頻率下放日K的這個指標

//計算當日的均線差

value1=average(getfield("close","D"),FastLength) - average(getfield("close","D"),SlowLength);

//陣列儲存前N-1日的均線差

 for i=1 to MACDLength-1
        begin
          ave1[i]=average(getfield("close","D")[i],FastLength) - average(getfield("close","D")[i],SlowLength);

        end;

//把前N-1日均值差的合加上今日均值差再除以N日

Value2 = (Array_Sum(ave1,1,MACDLength-1)+value1)/MACDLength ; //signal line

Value3 = Value1 - Value2;

 

 

虎科大許教授 發文於   2025/08/18

if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");
input:  FastLength(3, "DIF短天數"), 
        SlowLength(10, "DIF長天數"), 
        MACDLength(16, "MACD天數");
var:i(0), intraBarPersist myTime(0);
array: ave1[20](0);
Value1 = Average(getfield("close","30"), FastLength) - Average(getfield("close","30"), SlowLength); //macd line
myTime=getfield("時間","30");
if myTime<>myTime[1] then //30分鐘的第一分鐘,記錄過去15期的value1
    for i=1 to MACDLength-1
        ave1[i]=xfmin_getvalue("30",value1,i);
ave1[MACDLength]=value1; //記錄16期的value1
Value2 = Array_Sum(ave1,1,MACDLength)/MACDLength ; //signal line
Value3 = Value1 - Value2 ; //histogram
plot1(value3,"histogram");

發表回覆
Close