設定了停損3%,回測結果會超過停損的%數

  •   464 
  • 最後發表   chichi_77  2022 一月 14
chichi_77 發文於   2022/01/02

各位前輩們好,小弟的策略是當天只進場一筆單,設定檔數+2、-4為出場條件,並限定此筆單的虧損不超過3%,但在回測資料時,都會有損失金額超過3%的個股,甚至是有-11%的例子,想請問我該如何調整我的程式碼,謝謝!

底下附上我部份的程式碼:

var:intraBarPersist entry_date(0);
input: loss_percent(3, "停損(%)");

if position=0 and entry_date<>date then begin
    setposition(1,market);
    entry_date=date;
end;

if position =1 and filled =1 then begin
    if high >= addspread(filledavgprice, 2) then begin
        setposition(0, addspread(filledavgprice, 2), label:="獲利出場");
        print("獲利出場", date, time);
        end 
    else if low <= addspread(filledavgprice, -4) then begin  //當根Bar的Open = high 的話出場
        setposition(0, market, label:="虧損出場");
        print("虧損出場", date, time, filledavgprice, addspread(filledavgprice, -4));
        end;
    end;

if low <= FilledAvgPrice*(1-0.01*loss_percent) then begin
    setposition(filled, market);
    setposition(0,market);
end;

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/01/05

Hello chichi_77,

 

您腳本中撰寫了當價格下跌了3%出場,但並不能保證在3%時出場。

舉例來說,若是隔日向下跳空的話,就有可能超過3%。

另外需注意的是,若腳本內同時有複數交易指令觸發的話,只會執行最上面的那一個。

換句話說,當 low <= FilledAvgPrice*(1-0.01*loss_percent) 觸發時,只會執行 setposition(filled, market),並不會出場。

細節可以參考 SetPosition 裡面的說明。

chichi_77 發文於   2022/01/10

小幫手您好,

 

由於我的交易策略是當沖的模式,因此應該不會遇到跳空的問題。
看完這篇文章後,我理解大部分的意思,但我的案例似乎是另一種情況,可以麻煩小幫手教我如何撰寫這種情況嗎?

我的交易策略是:開盤進場我的選股策略,並限定這筆單是當沖,在市價買進後,立馬送出一筆進場價+2檔的限價賣出單。若沒成交,價格往下掉之後,當價格跌破進場價-4檔or 虧損超過3%,自動市價平倉。

 

這個問題就出在,第一筆限價單沒成交,價格往下掉,碰到我的停損價時,似乎不會刪除前一個委託單,並送出正確的停損單,因此想詢問小幫手,這種情況的程式碼該如何撰寫,謝謝!

XQ小幫手 發文於   2022/01/12

Hello chichi_77,

 

您可以參考 SetPosition 的說明。

目前XS自動交易的執行方式是只執行第一個交易指令,忽略之後的交易指令。

所以您的腳本只要有觸發 +2檔 或是 -4檔 的話,就會優先執行這兩個,而不會執行 3% 的停損。

但是若下次運算時沒有觸發 +2檔 卻觸發 -4檔或 3% 停損的話,就會將先前的單子取消,改為新的市價出場單。

 

您可以將出場的順序修改一下,舉例來說:

if position =1 and filled =1 then begin

    if low <= FilledAvgPrice*(1-0.01*loss_percent) then begin

        setposition(filled, market);

        setposition(0,market);

        end

    else if low <= addspread(filledavgprice, -4) then begin  //當根Bar的Open = high 的話出場

        setposition(0, market, label:="虧損出場");

        print("虧損出場", date, time, filledavgprice, addspread(filledavgprice, -4));

        end;

    else if high >= addspread(filledavgprice, 2) then begin

        setposition(0, addspread(filledavgprice, 2), label:="獲利出場");

        print("獲利出場", date, time);

        end 

    end;

這樣的話腳本就會優先下出場的交易指令。

chichi_77 發文於   2022/01/12

Dear 小幫手,

謝謝小幫手的回覆,但有一個問題想請教您,如同前面所述,我想在買進之後立即送出一筆+2檔的市價單,那我又該如何調整您幫忙寫的這段程式碼呢?

謝謝小幫手

XQ小幫手 發文於   2022/01/14

Hello chichi_77,

 

您可以不設條件,當有部位庫存時就送出交易指令,這樣就可以了。

另外,+2檔的單只能是限價單。

須注意要放在其他交易指令後面,不然就會變成只會執行 +2 的限價單。

if position =1 and filled =1 then begin

    if low <= FilledAvgPrice*(1-0.01*loss_percent) then begin

        setposition(0,market);

        print("停損出場");

        end

    else if low <= addspread(filledavgprice, -4) then begin  //當根Bar的Open = high 的話出場

        setposition(0, market, label:="虧損出場");

        print("虧損出場", date, time, filledavgprice, addspread(filledavgprice, -4));

        end;

    else begin    //這樣若沒有執行停損出場或虧損出場的話,只要有部位庫存就會執行這行

        setposition(0, addspread(filledavgprice, 2), label:="獲利出場");

        print("獲利出場", date, time);

        end;

    end;

發表回覆
Close