settotalBar 跟 if條件 相關應用

  •   386 
  • 最後發表   里歐  2025 四月 11
里歐 發文於   2025/03/23

疑問
實驗 同時寫兩種條件,跟兩種條件分兩次跑,結果沒有完全對上。
(單跑都有加then)

兩種條件如下:


輸出如下: 右邊是兩種寫在一起,少了6117/6415/8096


付上完整腳本:

input: HH(8,"N天前突破");
input: n(10,"Search天數");

input: v0(50,"量超過均量趴數");
input: percent(4,"漲幅上限");
input:avg_3_line(0);  //均線糾結開關 //距離n%以內
input:main_force(0); //主力買超次數開關
input:today_include(1); //包含金日達成條件也抓

var: hasCrossOver(false);
settotalBar(n);
var: BarCount(0);

//=====================================================
Value11 = average(close, 5);
Value22 = average(close, 10);
Value33 = average(close, 20);


value55 = MaxList(Value11, Value22, Value33); //均線 取最大
value66 = MaxList2(Value11, Value22, Value33); //均線 第二大
value77 = MinList(Value11, Value22, Value33);
value88 = MinList2(Value11, Value22, Value33);
//=====================================================

//突破 站上均線的條件
if (close > highest(h[1],HH) and hasCrossOver=false 
   and ( (Volume > Average(Volume[1], 5) * 1.9) or (Volume > Volume[1] * 1.9) )
   and close>close[1]*1.01)

   or

   (((close[1] < value11[1]) or (close[1] < value22[1]) or (close[1] < value33[1]) and ((close > value11) and (close > value22) and (close > value33) ))
   and ( (Volume > Average(Volume[1], 5) * 1.9) or (Volume > Volume[1] * 1.9) )
   and hasCrossOver=false
   and close>close[1]*1.02)
   then

begin

hasCrossOver=true;

BarCount=currentBar;

value111 = close; //儲存突破k棒的收盤價
end;

if islastBar then

if hasCrossOver=true then

begin


//

//=====================================================
//達成站上均線條件後,未漲超過n%以上。
//-----------------------------------------------------
value44=rateOfChange(c,n-BarCount+1);

condition3=value44<percent;
//condition4=countIf( (high/value111) > 1.06 ,n-BarCount+1 ) <1; //突破到現在 最高價不能 曾超過6%
//似乎不能這樣使用
//=====================================================

//=====================================================
//希望該股 非牛皮股,設定曾經單日漲幅
//-----------------------------------------------------
condition7= countif(close/close[1] > 1.039, 90) > 0; //過去三個月 曾經單日漲幅4%以上

//=====================================================
If today_include >0 then
Begin
  condition6 = true;
End
Else 
Begin
  condition6 = BarCount <n; 
  //剛突破不抓 ,若突破根search日同一天,BarCount會=n
End;


condition6 = BarCount <n; 
//剛突破不抓 ,若突破根search日同一天,BarCount會=n

//=====================================================

if   condition3 and condition6 and condition7 then ret=1;



outputField1(date[n-BarCount],"突破or站上日期");

//outputField2(value1,"突破至今的主力買賣超張數");
//outputField3(value2,"突破至今的主力買超天數");
//outputField4(value3,"突破至今的主力賣超天數
//outputField12(countIf( (high/value111) > 1.06 ,n-BarCount+1  ),"最高價,超過突破收盤價6%次數");
outputField6(n-BarCount+1,"n-BarCount+1");
outputField7(BarCount,"BarCount");
outputField5(value44,"突破至今的漲跌幅");

end;

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

問題出在condition3。

以6415為例,

(1)合在一起時,從3/17時,condition3就變成False,最後只有condition6及condition7是True,所以沒被選出來。

20250310.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250311.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250312.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250313.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250314.000000 condition3= TRUE condition6= TRUE condition7= TRUE 

20250317.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250318.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250319.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250320.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250321.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

 

(2)只有條件1時,從3/20時,condition3就變成True,所以會被選出來。

20250310.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250311.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250312.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250313.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250314.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250317.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250318.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250319.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250320.000000 condition3= TRUE condition6= TRUE condition7= TRUE 

20250321.000000 condition3= TRUE condition6= TRUE condition7= TRUE 

 

(3)只有條件2時,從3/17時,condition3就變成False,最後只有condition6及condition7是True,所以沒被選出來。

20250310.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250311.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250312.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250313.000000 condition3= FALSE condition6= FALSE condition7= FALSE 

20250314.000000 condition3= TRUE condition6= TRUE condition7= TRUE 

20250317.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250318.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250319.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250320.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

20250321.000000 condition3= FALSE condition6= TRUE condition7= TRUE 

 

你自己再檢查一下,為何條件是這樣。

XS小編 發文於   2025/03/26

Hello 里歐,

 

小編補充,由於您的1和2條件中有and和or交互使用,建議使用括號來確保條件的運算順序正確。

或是另外撰寫condition將其整理起來會比較容易管理。

里歐 發文於   2025/04/06

請教下,我要怎麼像G這樣印出 某範圍日期的 condition的status

或者我可以在xs搜尋怎樣的關鍵字有類似範例用法

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

用if控制。例如:想要列印3月份的condition3:

if date>=20250301 and date<=20250331 then print(condition3);

里歐 發文於   2025/04/06

sor 不知道怎麼使用,原本想說加在最後一行,會出現在"編譯輸出"或者 "編譯結果" 但沒看到。


沒有同時加,只是表示我嘗試加的位置。

里歐 發文於   2025/04/06

有找到這個範例
https://www.xq.com.tw/learn/xspractice/printdebug/

直接複製以下,也沒看到印出的資訊。C:\SysJust\XQLite\XS\Print 這底下也沒有。

Value1 = Average(Close, 5);

Print("Date=", Date, "Close=", Close, "Value1", Value1);

 

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

若你是用警示腳本,則編譯完成之後,加入策略雷達,且啟動策略,則print的內容會以檔案方式輸出到C:\SysJust\XQLite\XS\Print的資料夾裡面。若是回測,則要記得在執行回測的視窗裡面,將「啟動腳本內Print指令」打勾。

XS小編 發文於   2025/04/11

Hello 里歐,

 

若您是在選股中心的話,要勾選右上角的 啟動腳本內Print指令 (參考附圖)。

輸出位置如果要指定的話可參考 File 函數的說明。

附加文件

發表回覆
Close