選股腳本撰寫KD值達成條件後,取得當天的高中低價位。

  •   834 
  • 最後發表   Jack  2017 五月 22
Jack 發文於   2017/05/05

大家好,

如何使用選股腳本撰寫KD值達成條件後,取得當天的高中低價位?

 

例如:

K值貫穿20,達成條件後取得這一根的高低收價位數值,

第1根 K值為25

第2根 K值為19    高價50 低價40 收價 45

第3根 K值為15

如何取得 第2根 K值為19 的這天高低收價位數值?

 

大致邏輯:

1. 使用 Stochastic 函數 算出K值。

2. 如果 K值 貫穿 20 則 序列資料(相對K棒數)歸0,否則 序列資料累加1。

3. 如果 K[序列資料]  = 0 則終止腳本,否則挑選出該檔股票商品;因為計算KD值,會有K值=0的狀況發生,須將此剃除。

 

注意:

資料讀取範圍我設定為從今年 2017/01/01 至今。

 

執行完該選股策略後的畫面:

 

完整範例選股腳本程式碼:

input: Length(9), RSVt(3), Kt(3), _LowK(20);
variable: rsv(0), k(0), _d(0);

setfirstbardate(20170101);

SetInputName(1, "天數");
SetInputName(2, "RSVt權數");
SetInputName(3, "Kt權數");

Stochastic(Length, RSVt, Kt, rsv, k, _d);

if k cross below _LowK then value1 = 0 else value1 += 1;

if k[value1] = 0 then return else ret = 1;

//outputfield1(value1,"K值貫穿20相對K棒數");
outputfield1(date[value1],"K值貫穿20的日期");
outputfield2(high[value1],"high");
outputfield3(low[value1],"low");
outputfield4(close[value1],"close");
outputfield5(k[value1],"k");

 

以上,供參考,有問題歡迎詢問。

排序方式: 標準 | 最新
icoolhome 發文於   2017/05/05

你好 先說聲謝謝

請教下問題  

使用上這樣會有點不準,如K值20以下了,但沒有超出K值20以上,則產生的K值得出的值是下一個K棒19.99

下圖 第一筆  K值為19.99 ,不是我要的值,

我要的值是20以下後,產生第一個K棒的值,例如:下技術指標圖第一筆,K值為20.63 ,下一個K值19.45

第一筆資料

 

 

我的邏輯是

1.算出K值           例如: 第一筆資料中  第1個K棒K值20.63 、第2個棒K值19.45   

2.K值 > 20以下 ,計算出當天日期     得出值為19.45,日期為2017/05/03   

3.依日期在取得高低收價格     日期2017/05/03得出值為高25 低24.55 收24.65

 

或是有更好的方案,

只要取得K值20以下第一個K棒的K值19.45這筆高低收資料,請問要如何寫呢?  

技術分析圖

Jack 發文於   2017/05/05

icoolhome 兄,

不客氣,

謝謝回覆,我原先誤會您的意思了,

 

查看您之後的描述,猜想您的意思可能是指K值摜破20,

我直接修改了程式碼範例與敘述,如我原文所述,供參考,再請您試試看,

 

若有問題,歡迎再詢問。

icoolhome 發文於   2017/05/05

不好意思了,是我沒說清楚,讓你多費心了,謝謝。

有什麼問題的話在請教你 

 

  • 按讚來自於
  • jacklee
icoolhome 發文於   2017/05/10

請教一下,策略要如何寫?

1.取得了K值向下貫破20的第一個K棒日期、高低收價格?

2.向上貫穿取得的第一個K棒收盤價,觸發警示?

Jack 發文於   2017/05/11

icoolhome 兄,

請問你要撰寫的腳本類行是什麼?(指標、選股、警示)

icoolhome 發文於   2017/05/11

Jack 兄 你好,請問如何撰寫警示腳本?

 

 

Jack 發文於   2017/05/16

icoolhome 兄,

我分成以下說明,供參考,

 

1.取得了K值向下貫破20的第一個K棒日期、高低收價格?警示腳本

警示程式碼範例如下,SettotalBar參考內建警示腳本KD高檔死亡交叉,

input: Length(9), RSVt(3), Kt(3), _LowK(20);
variable: rsv(0), k(0), _d(0);

SetTotalBar(maxlist(Length,6) * 3 + 8);

SetInputName(1, "天數");
SetInputName(2, "RSVt權數");
SetInputName(3, "Kt權數");

Stochastic(Length, RSVt, Kt, rsv, k, _d);

if k cross below _LowK then value1 = 0 else value1 += 1;

if k[value1] = 0 then return;

value10 = date[value1];     //  K值向下貫破20的第一個K棒日期
value11 = high[value1];     //  K值向下貫破20的第一個K棒高價格
value12 = low[value1];      //  K值向下貫破20的第一個K棒低價格
value13 = close[value1];    //  K值向下貫破20的第一個K棒收價格

 

2.向上貫穿取得的第一個K棒收盤價,觸發警示?

警示程式碼範例如下,向上突破20當中的【突破】函數為 Cross above,修改此即可,

input: Length(9), RSVt(3), Kt(3), _LowK(20);
variable: rsv(0), k(0), _d(0);

SetTotalBar(maxlist(Length,6) * 3 + 8);

SetInputName(1, "天數");
SetInputName(2, "RSVt權數");
SetInputName(3, "Kt權數");

Stochastic(Length, RSVt, Kt, rsv, k, _d);

if k cross above _LowK then value1 = 0 else value1 += 1;

if k[value1] = 0 then return;

value10 = date[value1];     //  K值向上突破20的第一個K棒日期
value11 = high[value1];     //  K值向上突破20的第一個K棒高價格
value12 = low[value1];      //  K值向上突破20的第一個K棒低價格
value13 = close[value1];    //  K值向上突破20的第一個K棒收價格

icoolhome 發文於   2017/05/20

Jack 兄 你好,我寫的跟你差不多,但後續的問題想了也不知如何寫,不好意思了,是我又沒把問題説清楚。

在第一的警示程式碼範例中,得到了慣破20k的第一k棒日期、高價、低價、收盤價這四個數值,後續然後如有未來的收盤價向上貫穿第一警示程式範例中的收盤價警示。

例如:第一範例中

向下貫穿k20第一k棒日期20170501收盤價是50元,在第二k棒是日期20170502 收盤價是45元.... 在第6k棒是日期20170506 收盤價是51元。

請問警示要如何在第6k棒觸發?

a.觸發條件是收盤價大於等於第一範例中的50元k棒,發生的第一個k棒

b.觸發條件是盤中當日k棒所發生的價格如大於等於第一範例中50元k棒,當日所發生的價格。

c.觸發條件是向上貫穿50的第一個k棒

有個問題請教下?在b條件中是在20170506的當日中k棒價格所發生大於等於50元,這樣能不能回測?

謝謝你,又麻煩你了,感恩

 

 

Jack 發文於   2017/05/22

icoolhome 兄,

有個問題請教下?在b條件中是在20170506的當日中k棒價格所發生大於等於50元,這樣能不能回測?

先回答你此問題,可以回測,但是應該會跟現實有些落差,

原因是,回測是使用模擬逐筆洗價,來模擬當時的Tick資料,會與實際上當時的Tick報價有落差。

 

在第一的警示程式碼範例中,得到了慣破20k的第一k棒日期、高價、低價、收盤價這四個數值,後續然後如有未來的收盤價向上貫穿第一警示程式範例中的收盤價警示。

我依照你的敘述,撰寫警示完整的腳本程式碼如最下,

只要加上最後一行程式碼,判斷目前的收盤價有向上突破【K值向下貫破20的第一個K棒收盤價格】即可。

input: Length(9), RSVt(3), Kt(3), _LowK(20);
variable: rsv(0), k(0), _d(0);

//setfirstbardate(20170101);
SetTotalBar(maxlist(Length,6) * 3 + 8);

SetInputName(1, "天數");
SetInputName(2, "RSVt權數");
SetInputName(3, "Kt權數");

Stochastic(Length, RSVt, Kt, rsv, k, _d);

if k cross below _LowK then value1 = 0 else value1 += 1;

if k[value1] = 0 then return;

if value1 <> 0 and close cross above close[value1] then ret = 1;

 

以上,供參考,有問題歡迎詢問。

 

發表回覆
Close