XS語法求救,不知道哪邊寫錯,以及要怎麼除錯?

  •   671 
  • 最後發表   ChaosFractal  2020 九月 05
ChaosFractal 發文於   2020/08/09

小幫手求救

我在警示腳本寫了一個布林通道爆發的策略時遇到下面兩個問題

1. 進行10年回測卡在0.82%不動了,過半小時我就手動停止了,請問有什麼可以增加效率/避免當掉的方法嗎?

   或是我哪邊寫錯?

2. 假若策略沒抓到任何一支的話就沒辦法print了嗎? 這樣要怎麼debug?? 

3. 警示腳本好像沒法取得EPS、周轉率等指標? 或有無替代方式?

 

我用的電腦是1年前買的電競筆電 i7-9750H,效能全開

入場策略:布林通道爆發,隔天買入

範圍:所有上市上櫃普通股全部

出場策略:虧損5% 或 跌破月線 或 除權息前2天,隔天賣出

 

從15:45 開始執行,很快就到0.82%,但開始卡在這裡直到16:10分手動停止都還在0.82%

 

入場策略

 

Input: 
    Length(20, "期數"), 
    SD(2, "標準差"); // 標準差 Standard Deviation


SetBackBar(25);

var:BBUp(0),BBDown(0);

// 判斷現在是否正在計算當前資料
if currentbar=gettotalbar then
begin

    // 判斷大盤 20ma翻揚(沒翻揚就離開)
    if Average(GetSymbolField("TSE.TW","收盤價"),Length) < Average(GetSymbolField("TSE.TW","收盤價")[1],Length)
    then Ret = 0;

Print(File("d:\xq_log\[ScriptName]_[Symbol]_[Freq].log"), date, symbol, close);

    // 個股 20ma翻揚(沒翻揚就離開)
    if Average(close,5) <= Average(close[1],5) then ret=0;

    // 收紅,沒就離開
    if close < open then ret = 0;

    // 成交量 > 5日均量的2倍,沒就離開
    if volume < Average(volume,5) * 2 then ret=0;

    // 成交金額大於1000萬,沒就離開
    if GetField("成交金額(元)") < 10000000 then ret=0;

    // 過去10天通道壓縮,沒就離開
    if not trueall((
        // 上通道下降
        bollingerband(Close[2], Length, SD) >= bollingerband(Close[1], Length, SD) 
        and
        // 下通道上升
        bollingerband(Close[2], Length, -SD) <= bollingerband(Close[1], Length, -SD) 
    ),10) then ret = 0;


    // 基本面

    // 過去四季EPS總和 > 0
    //if getfield("每股稅後淨利","Q")[4] + getfield("eps","Q")[3] + getfield("eps","Q")[2] + getfield("eps","Q")[1] <= 0 then ret = 0;

    // 周轉率50以上
    //if getfield("周轉率") < 50 then ret = 0;


    // 上述條件都通過就ok
    ret = 1;

end;

 

 

出場策略

 

// 若有除權息就提早前兩天出掉

if close < average(close,20) or 
   (datediff(GetField("除權息日期"), date) <= 2 and datediff(GetField("除權息日期"), date) >0)
then ret = 1;

 

排序方式: 標準 | 最新
XQ小幫手 發文於   2020/08/12

Q1.進行10年回測卡在0.82%不動了,過半小時我就手動停止了,請問有什麼可以增加效率/避免當掉的方法嗎?

   或是我哪邊寫錯?

A: 因為我們的回測系統會有運算時間限制,主要是怕CPU過熱死當(我們要考慮並非所有用戶電腦配備都頂尖XDD )

    所以小幫手建議您如果策略條件很多的話,建議您分批回測(ex 3年3年..or 分產業別)

Q2. 假若策略沒抓到任何一支的話就沒辦法print了嗎? 這樣要怎麼debug?? 

A: 如果您的程式內有賺寫PRINT,那即使沒有篩出東西,也是會有每一支股票的PRINT資料的

Q3. 警示腳本好像沒法取得EPS、周轉率等指標? 或有無替代方式?

A:如果您想取得一些財報相關的資料,那需要使用選股模組才能達成。

 

另外想跟您討論一下,小幫手幫您看了下您的策略後,

想詢問下「判斷大盤 20ma翻揚(沒翻揚就離開)」,像是這一段的意思是,

你想取得目前的平均價大於過去[1]的平均價嗎?

我覺得我停工給您一些想法,您參考看看,您其實只要把您想要的判斷式,

寫入您的策略裡就可行了

像是

Average(GetSymbolField("TSE.TW","收盤價"),Length) > Average(GetSymbolField("TSE.TW","收盤價")[1]

如果是你要篩選出的股票其中一個條件的話,

而不是用反向的<  。

如果您有疑問,歡迎在提出來一起討論。

ChaosFractal 發文於   2020/08/12

我會反過來寫是因為有些是要先計算後才能判斷,沒法全部都塞進一行ret中

ret = .....AND......AND.............AND......;   

而若事先計算,在到ret中直接判斷結果也ok,更直覺

但我覺得,

比如說像是大盤月線下彎,那本策略就直接離開,

不用再去浪費效能判斷布林帶寬有無連續10天壓縮等其他大量計算

然後ret發現大盤月線下彎直接離開,

沒用到計算結果,

白白浪費運算所花時間~~

 

就我的想法透過這樣應該可以提升效能~~

若我的觀念有誤請告知~~

感恩

ChaosFractal 發文於   2020/08/12

另外"運算時間限制"

有什麼限制?

XQ小幫手 發文於   2020/08/12

ChaosFractal 大  您好

1.所謂的運算時間限制是,如果回測時間跑超過大概5分鐘左右,就會自動中斷。

2.當然也是可以拉~ 只是我看到時的直覺反應會覺得為何不用連續if  ( if..... then if ......then......)

這部分我會在幫您想看看,如果有想到更好的方法,我在po上來提供給您參考!

ChaosFractal 發文於   2020/09/05

目前我試了幾次發現...

其實像您說的用連續 if  ... and ...then ret = 1來處理即可

因為前面出現ret=0照樣會執行到最後一行,然後才再看最後的ret 值是多少....

 

不然就是要使用這樣了

if ret > 0 then
begin
...
end;

  • 按讚來自於
  • b24524658
發表回覆
Close