策略雷達觸發後如何print出

  •   907 
  • 最後發表   生生  2022 五月 11
生生 發文於   2022/04/11

我希望透過策略雷達觸發商品的當下print出該商品,比如當下條件出發臺積電,那我希望的print出來的效果就只有臺積電這一個商品,以下是我寫的程式碼,可是print出來的卻是很多串資訊,可以麻煩幫我檢查一下哪裏出問題了嗎?

variable: tr(0);

tr= ( (close-GetField("最高價","D"))/GetField("最高價","D") )*100;

if tr<=-2 then

ret=1;

print(file("C:\print\print.log"),date,symbol,close); 

附加文件

排序方式: 標準 | 最新
蕎伊斯 發文於   2022/04/11

print(file("C:\print\print.log"),symbol); //去除日期跟收盤價,只列印股號

生生 發文於   2022/04/12

謝謝您的回復,可是我不是這個意思,我原文的用意是指希望我print出來的文字檔裏面應該只有被觸發的商品,而不是出現被觸發以外的商品也被同時列印出來,然後同個商品在策略雷達上只被觸發一次,可是print出後卻一直出現

XQ小幫手 發文於   2022/04/18

Hello 生生,

 

如果您只希望觸發後才印出的話,那麼需要把Print的資訊包在條件裡面。

variable: tr(0);

tr= ( (close-GetField("最高價","D"))/GetField("最高價","D") )*100;

if tr<=-2 then begin

    ret=1;

    print(file("C:\print\print.log"),date,symbol,close); 

    end;

這樣寫才會是當 tr <= -2 時印出資訊。

感謝 蕎伊斯 的熱心回覆。

生生 發文於   2022/04/19

按照小編的説法,我把print包在條件裏面,可是當圖中的股票“毛寳”被觸發後,print出來的數據除了09:10:32被觸發後的毛寳還包括其他股票。可以麻煩小編看清楚我的問題嗎?我需要的是當股票被觸發(假設是09:10:32毛寳被觸發),那print出來的資訊就只是單獨09:10:32毛寳這一個數據,意思就是觸發什麽股票就print什麽股票,什麽時間觸發就print什麽時間的股票,麻煩了!!!

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

Hello 生生,

 

您上面附圖中的多出的部分,其中啟動時印出的資訊為資料預讀筆數計算出的結果。

如果要避免這種狀況的話,您可以使用 GetInfo("IsRealTime") 來判斷。

舉例來說:

if tr<=-2 and GetInfo("IsRealTime") = 1 then begin

    ret=1;

    print(file("C:\print\print.log"),date,symbol,close); 

    end;

這樣預讀筆數運算的結果就不會出來。

但需注意即時的狀況下只要腳本有計算,且條件符合print的就會執行。

所以若您將雷達設為逐筆洗價 (每次洗價運算),但觸發設定為K棒內單次觸發的話,雖然系統每根Bar都只會觸發一次,但實際上腳本還是在每次洗價中運算,所以一樣會在符合條件時print。

若要每根Bar只要print一次的話,建議您可以使用intrabarpersist的變數來記錄控制。

舉例來說

var: intrabarpersist oncePerBar(0);

variable: tr(0);

 

tr= ( (close-GetField("最高價","D"))/GetField("最高價","D") )*100;

if tr<=-2 and GetInfo("IsRealTime") = 1 and oncePerBar<> currentbar then begin

    ret=1;

    print(file("C:\print\print.log"),date,symbol,close); 

    oncePerBar= currentbar;  //若當根Bar已經執行過,limit就會記錄當根Bar的編號避免再度執行。

    end;

  • 按讚來自於
  • r1171125
生生 發文於   2022/05/04

請問如果我希望跟系統一樣可以啓動後只觸發一次,我的intrabarpersist可以怎麽改?

 

XQ小幫手 發文於   2022/05/09

Hello 生生,

 

您可以參考 Once 語法搭配 GetInfo("IsRealTime") 就可以讓其在即時運作下只print一次。

生生 發文於   2022/05/09

按照你的説法參考once了,一直沒辦法寫好,可以幫我看一下哪裏出問題嗎?

 

var: intrabarpersist onceperday(0);

variable: tr(0);

tr= ( (close-GetField("最高價","D"))/GetField("最高價","D") )*100;

once(onceperday=0 and currentbar>=1 and GetInfo("IsRealTime") = 1 and tr<=-2  then begin

        ret=1;

        Print(file("C:\print\print.log"),"開盤爆量",FormatDate("yyyy/MM/dd", currentDate),FormatTime("HH:mm:ss", currentTime),symbol,symbolName,"價格",numToStr(,close,2));

        oncePerday= currentbar;

        end;

XQ小幫手 發文於   2022/05/11

Hello 生生,

 

once後面少了一個後括號,且不需要then。

細節請參考 Once 的說明。

修改過的腳本如下:

var: intrabarpersist onceperday(0);

variable: tr(0);

tr= ( (close-GetField("最高價","D"))/GetField("最高價","D") )*100;

once(onceperday=0 and GetInfo("IsRealTime") = 1 and tr<=-2) begin

    ret=1;

    Print(file("C:\print\print.log"),"開盤爆量",FormatDate("yyyy/MM/dd", currentDate),FormatTime("HH:mm:ss", currentTime),symbol,symbolName,"價格",numToStr(,close,2));

    oncePerday= currentbar;

    end;

另外,您once這樣包的話print和警示都只會執行一次。

如果只有print要執行一次的話,可以這樣寫:

variable: tr(0);

tr= ( (close-GetField("最高價","D"))/GetField("最高價","D") )*100;

if GetInfo("IsRealTime") = 1 and tr<=-2 then begin

    ret =  1;

    once(True) begin

        Print(file("C:\print\print.log"),"開盤爆量",FormatDate("yyyy/MM/dd", currentDate),FormatTime("HH:mm:ss", currentTime),symbol,symbolName,"價格",numToStr(,close,2));

        end;

    end;

 

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

發表回覆
Close