如何寫出一個可以準確觸發的 跨頻KD警示?

  •   86 
  • 最後發表   morris8888  2025 八月 10
morris8888 發文於   2025/08/01

//2分鐘頻率

SetTotalBar(750);

value15 = xfMin_Stochastic("5",9,3,3,value16,value17,value18);

value19 = xfMin_GetValue("5",value17,0);

value20 = xfMin_GetValue("5",value18,0);

condition1 = value19 >= value20; // 5KD多

condition2 = filter(condition1,5);//過濾未來5期內重複

IF condition1 and condition2 then ret=1;

以上 我希望能在2分鐘的頻率下 跨頻取得5分鐘的KD 當K值>D值的時候 觸發警示 並且 過濾掉未來5期 重複的訊號

究竟 需要讀取多少根K棒的資料才能計算出正確的KD指標? 另外 要過濾未來5期重複的訊號 我這樣編寫 正確嗎?

我若是想使用Print 指令 以下 這樣編寫 正確嗎? 以上若有錯誤 麻煩小編 幫忙指正! 並給予正確的 XS指令!不勝感激

Print("time=",numToStr(time,0), "Close=", Close, "Value19", Value19, "Value20", Value20); 

 

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

(1)讀取資料750筆,應該是足夠的。

(2)filter跨頻率處理不對,這樣寫是排除後續5個2分K,而非後續5個5分K的條件。這個需求無法使用filter函數處理。

 

morris8888 發文於   2025/08/04

感謝許教授撥空回覆

但 跨頻率KD錯誤觸發的問題還是持續發生!

能請許教授 或是 小編 提供 您們 處理跨頻 KD 的方式嗎?

另外 請小編幫忙 告知 究竟 需要讀取多少根K棒的資料才能計算出正確的跨頻KD指標?

還有 Print 指令 該如何編寫

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

(1)你的需求不容易處理。需要寫一個跨頻率的Filter函數。

(2)會錯誤觸發,是因為Filter的期數是主頻率的期數,而跨頻率的數據你又使用變數處理。value19是目前2分鐘頻率下的5分鐘K值,但value19[1]是前2分鐘的5分鐘K值,而非前一根5分K的K值。

(3)你讀取的資料筆數應該足夠,計算的跨頻率KD數值不對,在於透過變數處理。

morris8888 發文於   2025/08/07

請問 許教授

在捨棄 Filter 這個指令的情形之下 要如何編寫運算KD指令?

還是只要捨棄Filter 這個指令 跨頻運算 KD 就能正常運作?

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

你的例子,若捨棄Filter,就可正確運算。

//2分鐘頻率

SetTotalBar(750);

xfMin_Stochastic("5",9,3,3,value16,value17,value18);

condition1 = value17 >= value18; // 5KD多

IF condition1 then ret=1;

morris8888 發文於   2025/08/08

謝謝許教授詳細 且 耐心的解說 謝謝您

XQ的小編有空 請幫忙 解惑 

從8月1號提出問題 到今天8月8號 都不見蹤影 

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

應該不是小編不理你,而是看到我在回覆問題,他就不摻和了。

morris8888 發文於   2025/08/09

//5分不跨頻

value7 = K_Value(9,3);

value8 = D_Value(9,3);

condition6 = value7 > value8; //KD多

IF condition6 then ret=1;

Print(file("D:\print\[Symbol]\"),"Time=", NumToStr(Time, 0), "K=", value7,"D=", value8);

 

//2分跨頻

SetTotalBar(750);

value15 = xfMin_Stochastic("5",9,3,3,value16,value17,value18);

value19 = xfMin_GetValue("5",value17,0);

value20 = xfMin_GetValue("5",value18,0);

condition6 = value19 >= value20; // 5KD多

IF condition6 then ret=1;

Print(file("D:\print\[Symbol]\"),"Time=", NumToStr(Time, 0), "跨頻K=", value19,"跨頻D=", value20);

以上是計算5分鐘KD,第一個是5分鐘不跨頻,第二個是2分鐘跨頻!

我希望能用Print指令紀錄,跨頻 與 不跨頻 的KD觸發狀態,並加以比較正確與否!

紀錄內容包含 商品代碼 觸發時間 觸發時的K值 以及 觸發時的D值 

能否請 許教授 及 線上的 前輩 撥空幫忙 除錯指正!

萬分感謝!

 

 

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

(1)若你只搜集觸發時的數據,則不需要用ret=1,去除時間的小數點,不要用NumToStr,而應使用TimeToString。

IF condition6 then

Print(file("D:\print\[Symbol]\"),"Time=", TimeToString(Time), "K=", value7,"D=", value8);

 

IF condition6 then

Print(file("D:\print\[Symbol]\"),"Time=", TimeToString(Time), "跨頻K=", value19,"跨頻D=", value20);

(2)跨頻率的程式有不必要的指令(value19及value20的計算,value15也不需要)。可優化如下:

SetTotalBar(750);

xfMin_Stochastic("5",9,3,3,value16,value17,value18); 

condition6 = value17 >= value18; // 5KD多

IF condition6 then

Print(file("D:\print\[Symbol]\"),"Time=", TimeToString(Time), "跨頻K=", value17,"跨頻D=", value18);

morris8888 發文於   2025/08/10

謝謝許教授

XQ自學 對我這樣的理工門外漢著實不容易!

若只是單純文字講解 時常會有 霧裡看花 費解難明 之感。

感謝許教授 不惜花費寶貴時間 多次解惑,甚者 直接用指令示範 ,更是讓我瞬間豁然開朗!

謝謝您!

發表回覆
Close