請問,15根bar 如何觸發一次紅二兵加上一次紅四兵,如何學習腳本

  •   339 
  • 最後發表   Alumi  2023 五月 23
Alumi 發文於   2023/04/05

您好,感謝多次的學習基本腳本,有些想法來使用選股策略。現在準備要再購買選股模組研究。~~~有幾個輯輯學習問題想請教小幫手。我暫時先使用一分k來做測試的話。
(一)15根bar內,只要有出現1次紅二兵與1次紅4兵的話通知我,請問學習這樣腳本?這樣邏輯對嗎?

Condition1= trueall(close > close[1],2);  //收盤大於前根收盤紅三兵

Condition2= trueall(close > close[1],4);  //收盤大於前根收盤紅三兵

value2 = 1; //跑一次

for value1 = 0 to 15 begin

if Condition1   then value2 (我如果在這建立了value2 行的通嗎?還是不需要用value2 = 1; //跑一次,~~只要加 if condition1 [value1]  即可

end;

@以上我是要condition1與condditon2合併寫begin ..edn,,還是分開呢?

condition3 = value2 >= 2 and value2 > value2[1];// 增加紅二兵+紅三兵次數不持續跳警示

 if  condition3 then ret = 1;    //如果condition1及condition2符合的話就警示 

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

(二)我要學習 一定要先出現了三紅兵後馬上接著以後的三根bar內有出現長上影線(由tcick取代影線),我用了很多不同的方式測試,就是跑不出來,我再修成這樣邏輯對嗎

Condition1= trueall(close > close[1],3);  //收盤大於前根收盤紅三兵

then begin

 if close < 10 then value1 = 0.01

 else if close <50 then value1 = 0.05

condition2  = (high - maxlist(open, close)) >= value1 * 5

trueany(condition 2 ,3 )

then ret = 1;

 end;

這是使用begin ..edn  //所有條件都符合才成立,但如何決策先跑紅三兵腳本再跑長上影線,這邏輯成立嗎?

 




 

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/04/07

 Hello Alumi,

 

小幫手建議您先閱覽網站教學區的文章,如果有那裡不清楚的地方麻煩告知,這樣小幫手才有辦法協助您。

您也可以參考 3周學會程式交易 這本書,裡面有XS語法的教學。

如果不清楚語法的話就算邏輯理解了,寫出來的腳本還是不一定能夠正確編譯。

 

1.

value2 = 1; //跑一次

for value1 = 0 to 15 begin

if Condition1   then value2 (我如果在這建立了value2 行的通嗎?還是不需要用value2 = 1; //跑一次,~~只要加 if condition1 [value1]  即可

end;

@以上我是要condition1與condditon2合併寫begin ..edn,,還是分開呢?

 

小幫手看不懂以上這段您想要表達什麼。

 

15根bar內,只要有出現1次紅二兵與1次紅4兵的話警示,小幫手會這樣寫:

Condition1= trueall(close > close[1],2);  //收盤大於前根收盤紅二兵

Condition2= trueall(close > close[1],4);  //收盤大於前根收盤紅四兵

 

value2 = 0;

value3 = 0;

for value1 = 0 to 14 begin

    if condition1[value1] and not condition1[1] then value2 += 1;  //當根condition1成立且前一根condition1不成立才紀錄紅二兵次數

    if condition2[value1] and not condition2[1] then value3 += 1;  //當根condition2成立且前一根condition2不成立才紀錄紅四兵次數

    end;

 

condition3 = value2 >= 1 and value3 >= 1;   //紅二兵與紅四兵都至少一次

condition4 = value2 <> value2[1] or value3 <> value3[1];    //前15根Bar的 紅二兵 與 紅四兵 數量有發生變動時

if conditoni3 and condition4 then ret = 1;

 

需注意 condition1 (紅二兵)符合的時候 condition2 (紅四兵)也會符合。

 

2.

小幫手會建議您先判斷近三根Bar是否有長上影線,接著再判斷上影線之前是否有紅三兵。

簡單來說,就會是:

condition1 = 近三根Bar長上影線;

if condition1 then begin

    condition2 = 三根Bar之前是否為紅三兵;

    if condition2 then ret = 1;

    end;

Alumi 發文於   2023/04/11

小幫手,您好,非常感謝你的指導,~~~我寫這腳本的需求測試是要如何區隔出就是先跑出連續三根bar(紅三兵)完成,然後第四~六根有出線上線4tick通知我。~~~
目前測試警示現在通知都是三根紅三兵裡內含加長上影線4tcik,請小幫手指導,非常感恩~~~~~~~~

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

 

if close < 10 then value1 = 0.01

else if close <50 then value1 = 0.05

else if close < 100 then value1 = 0.1

else if close < 500 then value1 = 0.5

else if close < 1000 then value1 = 1

else if close >= 1000 then value1 = 5;

condition1 =(high - maxlist(open, close)) >= value1 * 4 ;

 if trueany (condition1,3 ) 

 

then begin 

 

Condition2 = close > close [1] ;

if trueall (condition2,3)  //收盤大於前根收盤紅三兵

then ret = 1;

 

end ;

 

 

 

 

XQ小幫手 發文於   2023/04/13

Hello Alumi,

 

您的 trueany(condition1,3) 和  trueall(condition2,3) 都是檢查近3根Bar,那麼當然會是三根紅三兵裡內含加長上影線4tcik警示。

建議您可以將 condition2 修改為 condition2 = close[3] > close[4];

這樣 trueall(condition2,3) 就會是檢查 1 ~ 3 根Bar是否為紅三兵,而 trueany(condition1,3) 就會是檢查 4 ~ 6根Bar是否有上影線4Tick。

Alumi 發文於   2023/04/18

小幫手,你好請益,試測測了二天,常常警示會像圖這樣,1~3bar紅三兵,第四根是縮頭影線通知,再連接著5~7根都會連續通知,是寫腳本有問題嗎?縮頭如何通知一次就好!


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

 

 

if close < 10 then value1 = 0.01

else if close <50 then value1 = 0.05

else if close < 100 then value1 = 0.1

else if close < 500 then value1 = 0.5

else if close < 1000 then value1 = 1

else if close >= 1000 then value1 = 5;

 

condition1 =(high - maxlist(open, close)) >= value1 * 5 ;

 

if trueany (condition1,3 ) 

 

then begin 

 

Condition2 = close [3] > close [4] ;

 

if trueall (condition2,3)  //收盤大於前根收盤紅三兵

  

 

then ret = 1;

 

end ;

 

 

 

 

XQ小幫手 發文於   2023/04/19

Hello Alumi,

 

因為您的條件是 trueany(condition1,3),所以只要近3根Bar有任何一根達成的話就會符合。

可以將其改成

condition1 = trueany((high - maxlist(open, close)) >= value1 * 5, 3);

 

if condition1 and not condition1[1] then begin 

    Condition2 = close [3] > close [4] ;

    if trueall (condition2,3) then ret = 1;

    end;

 

這樣就只有在 condition1 第一次達成 (當次符合,前次不符合) 時會觸發。

Alumi 發文於   2023/04/26

小幫手,不好意思,請教一下,以下三紅兵這根BAR收盤要比前面高收盤高,要發生在第3~6根 bar,我須要在加上3~6根bar漲有要量!!

 

我一開始寫是(1)但腳本跑出來,但常沒有帶量,應該是寫錯了,是不是改為(2)的寫法才是對的。~~~請問tureall計算只給當根close[3]>open[3],算近三根bar是會往前計算,還是往後計算。

(1)

Condition2 = close [3] > close [4] and  close > open * value2 ;

if trueall (condition2,3)  //收盤大於前根收盤紅三兵+每根要帶量

(2)

Condition2 = close [3] > close [4] and  close [3]> open[3] * value2 ;

if trueall (condition2,3)  //收盤大於前根收盤紅三兵+每根要帶量

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

if close < 10 then value2 = 1.005

 

else if close <50 then value2 = 1.005

 

else if close < 100 then value2 = 1.01

 

else if close < 500 then value2 = 1.005

 

else if close < 1000 then value2 = 1.005

 

else if close >= 1000 then value2 = 1.01;

 

condition1 = trueany((high - maxlist(open, close)) >= value1 * 5, 3); // condition1 第一次達成 (當次符合,前次不符合) 時會觸發

 

if condition1 and not condition1[1] then begin 

 

Condition2 = close [3] > close [4] and  close > open * value2 ;

 

if trueall (condition2,3)  //收盤大於前根收盤紅三兵

XQ小幫手 發文於   2023/05/02

Hello Alumi,

 

不論是(1)還(2),您寫的條件中沒有用到成交量,自然不會判斷有沒有帶量。

TrueAll 是條件往前,所以 trueall(close[3]>open[3], 3) 會檢查的就會是 close[3] > open[3], close[4] > open[4], close[5] > open[5] 這3個條件。

需注意XS無法取到運算當根Bar之後的資料。(無法取用未來的資料)

 

舉例來說,假設您有帶量的定義是成交量要是10期成交量平均的1.5倍好了:

Condition2 = close [3] > close [4] and volume[3] > average(volume[3], 10) * 1.5;

if trueall(condition2,3) then ...

 

網站上有教學區,裡面有XS語法的基礎和應用可以閱覽。

Alumi 發文於   2023/05/09

小幫手,不好意思,常常紅二兵+紅四兵  ,如圖示,有時侯觸發條件後晚了好根幾bar才通知,不然有時(只有紅四兵沒有紅二兵)就通知,是哪裡要調整呢?~~~感恩!!

 

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

 

if close < 10 then value5 = 1.01

 

else if close <50 then value5 = 1.01

 

else if close < 100 then value5 = 1.01

 

else if close < 500 then value5 = 1.01

 

else if close < 1000 then value5 = 1.01

 

else if close >= 1000 then value5 = 1.01;//連續2根bar上漲調整%數

 

if close < 10 then value6 = 0.02

 

else if close <50 then value6 = 0.10

 

else if close < 100 then value6 = 0.2

 

else if close < 500 then value6 = 1

 

else if close < 1000 then value6 = 2

 

else if close >= 1000 then value6 = 10;//上漲%每個級距價格

 

Condition1= trueall(close > close [1] and close > open * value5 ,2); //二根Bar都要是大於前根, 且收盤每個上漲級距價格

Condition2= trueall(close > (close[1] + value6 ),4) ; //紅四兵收盤大於前根, 比前一根收盤高2個Tick以上

 

value2 = 0;

value3 = 0;

 

for value1 = 0 to 12 begin

 

if condition1[value1] and not condition1[1] then value2 += 1;  //當根condition1成立且前一根condition1不成立才紀錄紅二兵次數

 

if condition2[value1] and not condition2[1] then value3 += 1;  //當根condition2成立且前一根condition2不成立才紀錄紅四兵次數

 

end;

 

condition3 = value2 >= 1 and value3 >= 1;   //紅二兵與紅四兵都至少一次

 

condition4 = value2 <> value2[1] or value3 <> value3[1]; //前12根Bar的 紅二兵 與 紅四兵 數量有發生變動時

 

 

if condition3  and condition4  then ret = 1;


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

XQ小幫手 發文於   2023/05/10

Hello Alumi,

 

網站上有教學區,裡面有XS語法的基礎和應用可以閱覽。

另外建議您在遇到問題時可以在將腳本中運算的數值 print 出來,這樣就可以知道為什麼沒有觸發。

或是更直接的方法是撰寫成指標,這樣就可以直接畫出相關數值。

檢查 condition1, condition2, value2, value3, condition3, condition4 是否有如您所想的運作。

 

您的value5不論在任何時候都是1.1,那麼就不需要寫這麼長的判斷式,直接用 value1 = 1.01; 即可。

且for迴圈內計算的式子也有寫錯,應該是

if condition1[value1] and not condition1[value1 + 1] then value2 += 1;

if condition2[value1] and not condition2[value1 + 1] then value3 += 1;

才對。

 

小幫手建議您可以先從簡單的條件寫起,寫完後用 print 或 plot 確認是否有如您所想的運作。

這樣一個個條件寫完後再組合起來比較不會出錯。

Alumi 發文於   2023/05/10

好的,謝謝小幫手!!

顯示更多回應 發表回覆
Close