想請求技術支援,關於自動交易逐筆洗價時的多單停損

  •   487 
  • 最後發表   CYL  2024 十一月 21
CYL 發文於   2024/11/14

想請小幫手幫幫忙,以下是我的多單停損邏輯

// -------- 停損邏輯 (多單) --------

if Position > 0 and Filled > 0 then begin

    // 計算過去 13 根K棒的最低價

    if not long_stop_loss_initialized then begin

               long_stop_loss_price =Lowest(Low[1], 13) ;  // 只在建倉時設定一次

        long_stop_loss_initialized = true;  // 初始化後設置標誌

    end;

 

    // 當價格上漲13點時,將止損設為進場價格+8點

    if Close >= FilledAvgPrice + 13 then

        long_stop_loss_price = FilledAvgPrice + stop_loss_buffer;

 

    // 停損邏輯:價格達到停損價格時平倉

    if Close <= long_stop_loss_price then begin

        SetPosition(0);  // 停損平倉

        max_profit_point = 0;  // 重置最大獲利點

        long_stop_loss_initialized = false;  // 停損後重置標誌

    end;

 

end;

我在執行自動交易的時候,是使用1min自動洗價的方式來執行,不過實際測試起來會遇到

 long_stop_loss_price =Lowest(Low[1], 13) ;

停損價好像會變成出現在同一根K棒中間13次最低價而不是最近13根K棒最低點,
想請您幫忙協助看要怎麼修改才會得到正確的結果,
謝謝!!

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/11/14

(1)實際測試起來會遇到 long_stop_loss_price =Lowest(Low[1], 13) ;

Ans:  long_stop_loss_price初始化為Lowest(Low[1], 13),若Close沒有大於等於 FilledAvgPrice + 13,會一直是過去13期的最低價。

(2)停損價好像會變成出現在同一根K棒中間13次最低價而不是最近13根K棒最低點

Ans: long_stop_loss_price應該用intrabarpersist宣告。

  • 按讚來自於
  • chihyil
CYL 發文於   2024/11/14

收到 謝謝許教授,

另外有兩個問題想要一併請教您

一、如果使用自動交易並依照上述的停損條件,並且有勾選庫存異動時自動加入執行的選項,那是否過程中自己手動買進部位,也會自動依照此停損條件執行?

二、我在部位進場時有使用 _barNum <> currentbar 並且也有用hasMarkedBreakthrough_Long = true 與 triggeredLongBarIndex = 0 希望能在一個周期內第一次訊號觸發時進場,並且每根K棒只觸發一次(但是在逐筆洗價模式下執行)。只是實際測試起來根據成交回報還是會每根K棒不斷進場,並且在一個周期內只要符合條件就算之前已停損,仍是會持續建倉。

    // 根據條件執行 多單進場

    if condition1 and Position < 2 and _barNum <> currentbar then

begin

if triggeredLongBarIndex = 0 then

begin

Alert(text("突破停損", NumToStr(lastDivergenceLow_Long, 0)));

SetPosition(Position + 1, Market);

triggeredLongBarIndex = CurrentBar;  // 記錄觸發的BarIndex

hasMarkedBreakthrough_Long = true; 

end;

 

end

 

想麻煩教授幫忙解答,謝謝!

虎科大許教授 發文於   2024/11/14

(1)如果使用自動交易並依照上述的停損條件,並且有勾選庫存異動時自動加入執行的選項,那是否過程中自己手動買進部位,也會自動依照此停損條件執行

Ans:若手動進場的商品並非監控中的商品,則會自動加入監控。但由於加入商品時,並不會將庫存加入,所以position及filled都是0,並無法用你的停損條件出場。在3.15.01版本(大約12月上旬上架)會新增功能,可以在加入商品時一併帶入庫存。你的問題就可以解決。若手動進場的商品是監控中的商品,目前的版本是不會更新手動進場的部位。停損一樣會按照舊庫存處理。

(2)希望能在一個周期內第一次訊號觸發時進場,並且每根K棒只觸發一次(但是在逐筆洗價模式下執行)。只是實際測試起來根據成交回報還是會每根K棒不斷進場。

Ans:進場之後要將_barNum=currentBar,才不會在同一根K棒一直進場。 _barNum、triggeredLongBarIndex及hasMarkedBreakthrough_Long這三個變數都要用intrabarpersist宣告。

  • 按讚來自於
  • chihyil
CYL 發文於   2024/11/14

許教授,

假若我的部位是不同訊號分次建倉,那目前的寫法是不是只會計算第一筆交易的停損價格?

// -------- 停損邏輯 (多單) --------

 

if Position > 0 and Filled > 0 then begin

 

    // 計算過去 13 根K棒的最低價

 

    if not long_stop_loss_initialized then begin

 

               long_stop_loss_price =Lowest(Low[1], 13) ;  // 只在建倉時設定一次

 

        long_stop_loss_initialized = true;  // 初始化後設置標誌

 

    end;

想請教您如果想要每次新增倉位都可以用最新的平均成本設定停損價,應該要如何修改呢?

另外,移動停利的部分是不是也有需要修正的地方,因為夜盤測試

input: 

    profit_drawback_point_13(4, "當上漲超過 13 點時的回撤點數"),

   profit_drawback_point_26(10, "當上漲超過 26 點時的回撤點數"),

    profit_drawback_point_39(13, "當上漲超過 39 點時的回撤點數");

// -------- 移動停利邏輯 (多單) --------

if Position > 0 and Filled > 0 then begin

    // 停利邏輯:當獲利達到26點時啟動移動停利

    if max_profit_point = 0 and Close >= FilledAvgPrice + 26 then

        max_profit_point = High;  // 啟動移動停利

 

    // 設定回撤點數

 

   if max_profit_point > 39 then

        current_drawback_point = profit_drawback_point_39

    else if max_profit_point > 26 then

        current_drawback_point = profit_drawback_point_26

    else if max_profit_point > 13 then

        current_drawback_point = profit_drawback_point_13;

 

    // 計算移動停利價格

    long_trail_stop_price = max_profit_point - current_drawback_point;

 

    // 停利回撤判斷,若達到回撤條件則平倉

    if Close <= long_trail_stop_price then begin

        SetPosition(0);  // 停利平倉

        max_profit_point = 0;  // 重置最大獲利點

        long_stop_loss_initialized = false;  // 停利後重置標誌

    end

    else if Close > max_profit_point then begin

        // 更新最大獲利點,若價格上升,更新停利條件

        max_profit_point = High;

    end;

 

end;

自動交易有在

20241115 01:37:46 建立多單 22755

然後在

20241115 01:50:01 多單移動停利賣出 22729

可是期間高點已經有達到 22768,應該是要執行profit_drawback_point_13(4, "當上漲超過 13 點時的回撤點數")
於22764時執行出場,可是實測結果卻跟理想中有出入,至少也希望能執行原本多單停損// 當價格上漲13點時,將止損設為進場價格+8點的邏輯,
因此想請教您,不知道是不是哪邊的寫法與邏輯有錯誤,需要調整呢?

 

虎科大許教授 發文於   2024/11/15

你啟動移動停利的獲利點數是26點,當只獲利13點,max_profit_point仍然是0,並不會在回吐4點時停利。

CYL 發文於   2024/11/15

啊~原來是我的錯,沒有改到,
可是為什麼原本的停損

// 當價格上漲13點時,將止損設為進場價格+8點

    if Close >= FilledAvgPrice + 13 then

        long_stop_loss_price = FilledAvgPrice + stop_loss_buffer;

就不會啟動了? 停損跟 移動停利彼此會互相抵觸嗎?

另外上一個問題中 不同訊號分次建倉,如果想在新增/減 部位時更新平均成本應該要如何修改會比較呢?

 

虎科大許教授 發文於   2024/11/15

停損跟 移動停利彼此會互相抵觸嗎?

若停損與移動停利條件沒設好,有可能互相抵觸。

XS小編 發文於   2024/11/21

Hello CYL,

 

小編補充,您可以在腳本使用 print 將相關數值印出,會比較容易理解程式運作的狀況。

另外 FilledAvgPrice 會隨著庫存變動而自動更新數值,故不用特別調整。

除非是要重新計算 max_profit_point,那麼就會需要在庫存變動時將 max_profit_point 歸0,讓其能夠重算。

舉例來說,在 if Position > 0 and Filled > 0 then begin 前面加上:

var: _filled(0);

 

if _filled <> filled then max_profit_point = 0;

_filled = filled;

這樣就會在每次庫存有變動時將 max_profit_point 給歸0。

 

感謝 虎科大許教授 的熱心回覆。

發表回覆
Close