XS語法問題

  •   450 
  • 最後發表   DEAN1231  2025 一月 22
DEAN1231 發文於   2025/01/12

請問小編

在使用策略雷達時使用的回測結果與自動交易中心使用的回測結果不同

想請問問題可能會出在哪呢?

另外XS如何讓程式可以再當根K棒觸發出場策略後馬上執行而不要等到下一根K棒再執行呢?

 

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

(1)若兩者的內容一樣,且回測的商品一樣,且回測成功數也相同,則兩者的回測結果應該一樣。不一樣的可能是,警示腳本的進場出場分開寫,交易腳本則寫在一起,你得留意,兩者是否一致。另外,策略雷達的出場可設定損益趴數及持有期數,在交易腳本就需要自己寫,你也要確定這部份寫的是正確的。還有,回測商品成功數與執行當下的環境有關,若不同時間回測,成功數可能不同,回測結果當然也會不一樣。

(3)XS程式是可以當根K棒觸發,只要勾選逐筆洗價即可。

XS小編 發文於   2025/01/17

Hello DEAN1231,

 

小編補充,除了 虎科大許教授 提到的幾點外,目前策略雷達/選股中心回測報酬率計算的方式亦和自動交易回測不同,故兩者出來的數值可能會不同是正常的。

若邏輯和設定相同的話,則兩者進出場條件觸發的時間點應該會相同。

 

在選股/警示回測中可以選擇 進/出場價格 當期收盤價,交易回測則可以勾選 觸發即判斷成交,這樣就可以成交在洗價當下的成交價 (交易回測的部分還要視委託是否會成交)。

DEAN1231 發文於   2025/01/17

我在自動交易的語法裡面直接複製雷達策略裡的"價量同創近期新高"語法,

input: Price(close); setinputname(1,"比較價別");

input: Length(20); setinputname(2,"近期期數");

 

settotalbar(3);

setbarback(Length);

 

if  Price > highest(high[1] ,Length) and 

    volume > highest(volume[1],length) then ret=1;

 

並將ret=1改成SetPosition(1)

 

同時加入出場設定套用xs裡面多單固定停利停損(點)

{

多單停損(點)

}

 

input: profit_point(10, "停利(點)");

input: loss_point(10, "停損(點)");

 

 

if Position = 1 and Filled = 1 then begin

{ 依照成本價格設定停損/停利 }

 

if profit_point > 0 and Close[0] >= FilledAvgPrice + profit_point then begin

{ 停利 }

SetPosition(0);

end else if loss_point > 0 and Close[0] <= FilledAvgPrice - loss_point then begin

{ 停損 }

SetPosition(0);

end;

end;

我在猜想兩著出場設定的差別不同可能造成自動交易與策略雷達回測的數據不同,策略雷達可選擇看下期開盤價或是當期收盤價,自動交易的xs語法不知道是依什麼為基準,抑或是以洗價當時價格決定?

ps.兩個方式回測出來的總交易次數差很多,總報酬天差地遠

如果可以,我該如何在自動交易語法裡面加入以"下期開盤價或是當期收盤價"才觸發的語法呢?

另外可以詢問是否有{觸發下單設定後,自動幫我掛上停利的單子,如果順利出場則沒事,等待下次進場訊號;相反,如果停損則幫我觸發市價賣出且移除停利的單子}的語法呢??

虎科大許教授 發文於   2025/01/17

要在下期開盤出場,若是分K,可用Time控制。

var: intrabarpersist hasOut(false);

if myTime<>Time then

      begin

            setposition(0);

            myTime=Time;

      end;

//進場之後掛限價停利單:

if position>0 and filled>0 then

        setPosition(0,filledAvgPrice*(1+2/100));

//沒停利,卻先停損:

if filled>0 and hasOut=false then

       if Close <= FilledAvgPrice - loss_point then

             begin

                  setposition(0,market);

                  hasOut=true;

             end;

 

DEAN1231 發文於   2025/01/19

許教授您好,照您給的程式碼邊亦有出現問題,想請教該怎麼修正

 

input: Price(close); setinputname(1,"比較價別");

input: Length(20); setinputname(2,"近期期數");

 

settotalbar(3);

setbarback(Length);

 

if  Price < lowest(low[1] ,Length) and 

    volume > highest(volume[1],length) then SetPosition(1);

 

input: profit_point(10, "停利(點)");

 

input: loss_point(10, "停損(點)");

 

 

 

 

 

var: intrabarpersist hasOut(false);

 

if myTime<>Time then

 

      begin

 

            setposition(0);

 

            myTime=Time;

 

      end;

 

//進場之後掛限價停利單:

 

if position>0 and filled>0 then

 

        setPosition(0,FilledAvgPrice + profit_point);

 

//沒停利,卻先停損:

 

if filled>0 and hasOut=false then

 

       if Close <= FilledAvgPrice - loss_point then

 

             begin

 

                  setposition(0,market);

 

                  hasOut=true;

 

             end;

 

20 4未知的關鍵字 "myTime",請檢查是否有宣告此變數或是拼字是否有誤。

20 12"<>" 左右兩邊的型態不同。

26 13變數 "myTime" 沒有宣告,請用 Vars: 的方式宣告,冒號後面是變數名稱再用括號填入預設值。例如: Vars:varA(100); 如果要宣告陣列請用 Arrays: 冒號後面是名稱再用 [] 設定維度與大小,括號填入預設值。例如 Arrays:arr1[10](0);。

20 12「IF/Once/While/Repeat」後面需要一個真偽值或是真偽值的判斷式。

 

DEAN1231 發文於   2025/01/19

//沒停利,卻先停損:

if filled>0 and hasOut=false then

       if Close <= FilledAvgPrice - loss_point then

             begin

                  setposition(0,market);

                  hasOut=true;

             end;

 

以上這段是會把限價掛的停利單刪除的意思嗎

 

虎科大許教授 發文於   2025/01/19

if barfreq<>"Min" then raiseRunTimeError("限用分鐘資料");
input: Price(close); setinputname(1,"比較價別");
input: Length(20); setinputname(2,"近期期數");
input: profit_point(10, "停利(點)");
input: loss_point(10, "停損(點)");
var: intraBarPersist myTime(0);
var: intrabarpersist hasOut(false);
settotalbar(3);
setbarback(Length);
if  Price < lowest(low[1] ,Length) and 
    volume > highest(volume[1],length) then SetPosition(1);
if myTime<>Time then
    begin
        setposition(0);
        myTime=Time;
    end;
//進場之後掛限價停利單:
if position>0 and filled>0 then
    setPosition(0,FilledAvgPrice + profit_point);
//沒停利,卻先停損:
if filled>0 and hasOut=false then
    if Close <= FilledAvgPrice - loss_point then
        begin
            //獲利限價單若未成交,觸發停損時改市價單停損
            setposition(0,market); 
            hasOut=true;
        end;

XS小編 發文於   2025/01/22

Hello DEAN1231,

 

小編補充,自動交易回測成交是用模擬撮合的方式,和雷達/選股這種指定下次開盤價/當次收盤價進場的方式不太相同。

細節可以參考 【XQ回測說明】回測成交價搓合 這篇文章的說明。

若要確保觸發後馬上進場,建議可以使用市價單來處理。

發表回覆
Close