KD低檔背離腳本如何寫

  •   645 
  • 最後發表   Jack Williams  2024 六月 30
Jack Williams 發文於   2024/06/28

我想寫一個選股本:股價在5203060日均線之下;股價不再破新低;低檔量能增加1000張以上。5 20 30 60日均線靠攏30%KKD指標在低檔背離,背離幅度15度以上;股價觀察期間為連續36日以上;且前面60日前,曾經連續上漲10天以上又拉回,股價拉回下跌到5203060日均線之下;我試著寫成附加檔案,但編譯未能成功,請教不知那裡有錯誤? 可以幫我修改嗎?

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/06/28

能否直接貼上程式碼?我看不到你上傳的附件。

Jack Williams 發文於   2024/06/29

//選股腳本:股價在5日20日30日60日均線之下;股價30日內未再破新低;低檔量能3日內增加1000張以上。5日 20 日30日均線靠攏30%;日K的KD指標在低檔出現背離,且60日前,股價曾經上漲一波且有漲停現象,那60日期間DMI的ADX曾經到達50到70區域。

// 均線條件

def ma5 = average(close, 5)

def ma20 = average(close, 20)

def ma30 = average(close, 30)

def ma60 = average(close, 60)

 

def maCondition = ma5 < close && ma20 < close && ma30 < close && ma60 < close

def maCloseness = (ma5 / ma20) >= 0.7 && (ma20 / ma30) >= 0.7 && (ma30 / ma60) >= 0.7

 

// 股價條件

def newLow = low < lowest(low, 30)

def volumeIncrease = volume > average(volume, 3) + 1000

 

// KD指標條件

def k = reference KSTOCHASTICSLOW("fastK")

def d = reference KSTOCHASTICSLOW("fastD")

def kdDivergence = k < d

 

// ADX條件

def adx = reference ADX()

def previousHigh = high > highest(high, 60)

def adxRange = adx >= 50 && adx <= 70

 

// 綜合條件

def finalCondition = maCondition && !newLow && volumeIncrease && kdDivergence && previousHigh && adxRange

 

plot scan = finalCondition;

 

 

Jack Williams 發文於   2024/06/29

無法編譯。先謝謝教授! 

 

虎科大許教授 發文於   2024/06/29

這些陳述式都不是XS的陳述式,當然編譯過不了。

Jack Williams 發文於   2024/06/29

請教教授要如何用XS語法寫出這樣的選股腳本:股價在5日20日30日60日均線之下;股價30日內未再破新低;低檔量能3日內增加1000張以上。5日 20 日30日均線靠攏30%;日K的KD指標在低檔出現背離,且60日前,股價曾經上漲一波且有漲停現象,那60日期間DMI的ADX曾經到達50到70區域。我好想得到解答。教授可以指點嗎?

謝謝許教授。

虎科大許教授 發文於   2024/06/29

你可以問問ChatGPT,看看能否幫你翻譯。此外,建議你學習XS。XQ有豐富的資料庫,要選股或盤中即時警示,程式不用寫太多就可達到效果。

Jack Williams 發文於   2024/06/30

 

 

我把腳本敘述簡化成「股價在5日均線下,量增加,日K KD背離,近30日未再破低,60日內漲停過,投信買進』,用XS語法寫下面這樣的
腳本有編譯成功,惟雖然編譯成功但9951皇田投信並未買進,為何會出現?,另「那60日期間DMI的ADX曾經到達50到70區域』語法要如
何寫? 腳本如下:
//股價在5日均線下,近期量增,日K KD背離,近30日未再破低,60日內漲停過,投信買進 //股價在5日均線下 input:N(5); setinputname(1, "期別"); SetTotalBar(3); Value1 = Average(GetField("Close"),N); if GetField("Close") < Value1 then ret=1; SetOutputName1("均價"); outputfield1(Value1); //量增 input: Length(5), VolFactor(2); SetInputName(1, "均量區間"); SetInputName(2, "放大倍數"); settotalbar(3); Ret = Volume > Average(Volume[1], Length) * VolFactor; //日KKD 背離 input: KDLength(9), RSVt(3), Kt(3), DayLength(9), Min15Length(15); variable: rsvDay(0), kDay(0), dDay(0), rsv15Min(0), k15Min(0), d15Min(0); variable:dayDivergence(0); variable:min15Divergence(0); // 設定日K線的KD指標 if barfreq = "D" then begin Stochastic(DayLength, RSVt, Kt, rsvDay, kDay, dDay); end; // 檢查日K線的KD背離 if barfreq="D" then begin if (close > close[1] and kDay < kDay[1]) or (close < close[1] and kDay > kDay[1]) then dayDivergence = 1 else dayDivergence = 0; end; // 同時檢查日K線的KD背離 if dayDivergence=1 then ret = 1 else ret = 0; //股價30日內未再破底 input:period(30); input:day(10); setinputname(1,"計算期間"); setinputname(2,"未破底天數"); value1=lowestbar(low,period); if value1>day then ret=1; //近日有過漲停的 input:day1(60,"計算區間"); value1=GetField("漲停價","D"); if trueany(close=value1,day1) //近60日有一天漲停 and close<close[30]*1.2 //近三十日漲幅不到兩成 then ret=1; //投信買進 value1=GetField("最新股本");//單位:億 value2=GetField("投信買張","D"); value3=value2*close/10; //單位:萬} condition1=value3>200 and value1<80; condition2=filter(condition1,5); if condition2 then ret=1;

 

 

Jack Williams 發文於   2024/06/30

且皇田60日內並未漲停過但也出現,這是為甚麼?

虎科大許教授 發文於   2024/06/30

你有很多ret=1。只有第一個會被執行。若必須這些條件都符合才選股,則這些條件分別用condition1、condition2代表,然後在最後用if condition1 and condition2 then ret=1;

Jack Williams 發文於   2024/06/30

懂了,感恩! 謝謝許教授。

發表回覆
Close