腳本

  •   227 
  • 最後發表   阿林  2022 十月 26
阿林 發文於   2022/10/11

input:StopUpdateTime(100000,"HHMMSS停止更新時間");

if time <> time[1] then value1 += 1;

if getfieldDate("date") <> getfieldDate("date")[1] then value1 = 0;

if time <= StopUpdateTime then value2 = value1;

value3 = countif(close*100>close[1]*101,value2);

以上是很久之前的腳本 我有點忘記自己寫什麼了

只知道條件是value3 = 今天開盤到10點的k棒 必須要有1%的漲幅

我印象中 我寫這樣 當天第一根開盤的k棒是不納入計算的 

所以我想請教小幫手的問題是

上面這個腳本的value3是當天開盤的第一根k棒的漲幅是不納入計算的嗎

再麻煩小幫手了 感謝

 

 

 

 

排序方式: 標準 | 最新
musashi 發文於   2022/10/11

用中文記錄每一行吧,你的寫法value3在第一根K棒都是0,因為countif的期數1等於計算當根K棒,0等於無效不計算。

input:StopUpdateTime(100000,"HHMMSS停止更新時間");
//計算每根K棒編號由0開始累加+
if time <> time[1] then value1 += 1;
//換日更新value1=0
if getfieldDate("date") <> getfieldDate("date")[1] then value1 = 0;
//在停止更新時間之前,將value1存放到value2
if time <= StopUpdateTime then value2 = value1;
//計算符合if條件的次數,value2等於1表示計算當根K棒,value2=0不會計算。
value3 = countif(close*100>close[1]*101,value2);

XQ小幫手 發文於   2022/10/12

 Hello 阿林,

 

您可以參考 musashi 的回覆。

另外 time <> time[1] 這個條件只要在分鐘頻率上一定會吻合,因為上根Bar和當根Bar的time一定是不同的。

所以可以直接寫 value1 += 1 即可。

 

由於您的順序是

value1 += 1;

if getfieldDate("date") <> getfieldDate("date")[1] then value1 = 0;

所以開盤第一根的Bar value1 (value2)會是0,value3的計算符合條件次數因此不會計算第一根。

如果要包含第一根Bar的話可以改為

if getfieldDate("date") <> getfieldDate("date")[1] then value1 = 0;

value1 += 1;

這樣第一根Bar就會被包含在內。

 

感謝 musashi 的熱心回覆。

阿林 發文於   2022/10/21

感謝小幫手跟musashi 大大的回覆

還有一個問題想請問 以下是腳本

if barfreq <> "Min" or Barinterval <> 2 then RaiseRuntimeError("請設定頻率為2分鐘");

input:StopUpdateTime(132500,"HHMMSS停止更新時間");

Value6 = GetQuote("振幅");

 

if time <> time[1] then value1 += 1;

if getfieldDate("date") <> getfieldDate("date")[1] then value1 = 0;

if time <= StopUpdateTime then value2 = value1;

value3 = countif(close*100>close[1]*101,value2);

 

condition1 = value3 = 1 and close > close[1]*1.01;

condition2 = value3 > 2 ;

 

if Value6 >= 2 and GetField("成交量", "D") >= 1000 and 

close <> GetField("漲停價", "D") and close[1] <> GetField("漲停價", "D")

 then

if condition1[1] or condition2 then ret = 1;

我是用逐筆洗價 覺得有問題的是 if condition1[1] or condition2 then ret = 1;

裡面的condition1[1]  因為我用逐筆洗價 所以只要今天當天k棒 只要有一根有漲幅超過1%

但是變成可能會妳當根還在成交的時候 漲幅是有超過1% 但是最後收盤是<1%的

所以我寫這樣希望等這根k棒收盤 確認漲幅有1%在告訴我就好 但是我發現

因為我寫這樣就是希望今天一整天就只能有這一根漲幅超過1%

但我發現如果前面已經有一根漲幅超過1%的k棒了 加上當根已經是兩根了 雷達一樣會告訴我

然後也不是condition2達到條件 因為condition2至少要有3根

再麻煩了 感謝

 

XQ小幫手 發文於   2022/10/24

 Hello 阿林,

 

如果您不希望連續兩根的狀況發生,那麼只要再往前檢查 condition1 的狀況即可。

舉例來說:

if (conditioon1[1] and not condition1[2]) or condition2 then ret = 1;

 

如果您希望的是一天只觸發一次 condition1 的狀況,可以用變數來控制。

舉例來說:

var: _cond(0);

 

if date <> date[1] then _cond = 0;  //每日重置

 

condition1 = value3 = 1 and close > close[1]*1.01 and _cond = 0;

if condition1[1] then _cond = 1;   //如果上一根Bar達成過的話,_cond 就變為1

這樣condition1每日就只會觸發一次。

 

阿林 發文於   2022/10/25

不好意思 我講的不好理解 我意思是

if barfreq <> "Min" or Barinterval <> 2 then RaiseRuntimeError("請設定頻率為2分鐘");

input:StopUpdateTime(132500,"HHMMSS停止更新時間");

Value6 = GetQuote("振幅");

 if time <> time[1] then value1 += 1;

if getfieldDate("date") <> getfieldDate("date")[1] then value1 = 0;

if time <= StopUpdateTime then value2 = value1;

value3 = countif(close*100>close[1]*101,value2);

condition1 = value3 = 1 and close > close[1]*1.01;

if Value6 >= 2 and GetField("成交量", "D") >= 1000 and 

close <> GetField("漲停價", "D") and close[1] <> GetField("漲停價", "D") then

if condition1[1] then ret = 1;

我把condition2先改掉 那我condition1 = value3 = 1 and close > close[1]*1.01;

是因為有可能有一種情況 因為我是用逐筆洗價 所以實際情況會出現 假設今天是第10根兩分K

那這根k棒還在成交還沒收盤 然後前面的9根k棒都沒有超過1%的漲幅 但這根還在成交的k棒

漲幅有1% 因為我用逐筆洗價 所以雷達在這根k棒結束前就通知我 但是其實這根k棒最後收盤漲幅是沒有1%的

所以我用if condition1[1] then ret = 1; 希望當根k棒結束確認漲幅有1%在告訴我

可是我發現我寫這樣一樣會沒有在這根結束確認再告訴我 或者今天的前9根k棒

其實裡面已經有一根有1%的k棒了 那加上現在成交的第10根漲幅是有1%的 一樣會告訴我

但是這就不符合只能有一根有漲幅1%的條件了 然後因為其他條件 所以只能用逐筆洗價

condition1 = value3 = 1 and close > close[1]*1.01;

因為我寫這樣是因為如果 value3 = 1 and close > close[1]*1.01; 那前面那一根k棒也有1%漲幅 那就代表

我上述的情況 就是一整天只有上一根有1% 而且也是上一根收盤過後再告訴我

不知道是哪裡寫錯了 再麻煩小幫手了

XQ小幫手 發文於   2022/10/26

 Hello 阿林,

 

小幫手會用比較簡單的方式處理,您不需要使用 countif 來計算過去的資訊,只要用變數保存符合條件的次數即可。

 

舉例來說:

input: StopUpdateTime(132500,"HHMMSS停止更新時間");

 

if time >= StopUpdateTime then return;  //如果過了停止更新時間就停止執行

 

if date <> date[1] then value1 = 0;  //value1每日重置

if time > 090000 and close > close[1] * 1.01 then value1 += 1;  //每次條件符合時 value1 增加1 (開盤第一根不算,一根 Bar 只會增加一次)

if value1[1] = 1 and value1[2] = 0 then ret = 1;  //如果上一根有符合條件,且為當日次數為1的話警示

 

另外,腳本警示是運算符合條件就會觸發,所以當這根Bar洗價時,若上根Bar符合條件的話就會警示,不是這根Bar結束的時候才警示。

用 [1] 的方式只是確保是要結束的Bar符合條件,並不會影響警示觸發的時間。

如果您要這根Bar結束時再警示,那麼就不要勾選逐筆洗價。

 

發表回覆
Close