買進後才啟動移動停利腳本

  •   804 
  • 最後發表   路人小員工  2024 九月 19
路人小員工 發文於   2023/04/25

1.下面為程式中移動停利的範本,如果我已經買了一口期貨,然後才啟動下列的交易腳本,因為手中已有一口,所以long_condition應該是不會運作的吧?

2.因為手上已有多單一口,應該只會執行「if Position = 1 and Filled = 1 then begin」的部分,對嗎?

以上兩個疑問,麻煩小幫手回復,謝謝!

------------------------------------------------------------------------------------------------------------------------------------------------------------

{ 多單移動停利(點)

設定停損點(如果不設定的話, 請把loss_point設定成0), 以及停利點, 跟回跌點數

價格下跌到停損時出場

價格上漲到停利點後啟動移動停利, 如果價格繼續上漲, 則繼續持有, 如果價格回檔超過回跌點數時, 則停利出場

}

 

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

input: profit_drawback_point(5, "停利回跌(點)");

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

 

var: long_condition(false); { 進場買進作多 }

 

範例:

 

均線穿越時買進1張

以成交價為基礎, 設定固定停損以及移動停利

}

 

if profit_point = 0 then raiseruntimeerror("請設定停利(點)");

if profit_drawback_point = 0 then raiseruntimeerror("請設定停利回跌(點)");

if profit_drawback_point > profit_point then raiseruntimeerror("停利(點)需大於停利回跌(點)");

 

long_condition = Average(Close, 5) cross over Average(Close, 20);

 

if Position = 0 and long_condition then begin

SetPosition(1);{ 買進1張 }

end;

 

if Position = 1 and Filled = 1 then begin

var: intrabarpersist max_profit_point(0);{ 啟動停利後最大獲利點 }

 

if loss_point > 0 and Close <= FilledAvgPrice - loss_point then begin

{ 停損 }

SetPosition(0);

max_profit_point = 0;

 

end else begin

 

{ 判斷是否要啟動停利 }

if max_profit_point = 0 and Close >= FilledAvgPrice + profit_point then begin

max_profit_point = Close;

end;

 

if max_profit_point <> 0 then begin

if Close <= max_profit_point - profit_drawback_point then begin

{ 停利 }

SetPosition(0);

max_profit_point = 0;

end else if Close > max_profit_point then begin

{ 移動最大獲利點 }

max_profit_point = Close;

end;

end;

end;

end;

 

  • 按讚來自於
  • SEJU0313
排序方式: 標準 | 最新
XQ小幫手 發文於   2023/04/28

 Hello 路人小員工,

 

1.如果您的策略是設定為依庫存、執行商品內有包含該交易商品 且 啟動策略時有正確的讀到庫存的話,那麼 position 和 filled 就會是交易張數。

但 long_condition 還是會運算判斷,也有可能是 True 的狀況,差別在於

if Position = 0 and long_condition then begin

    SetPosition(1);{ 買進1張 }

    end;

這邊就不會執行,因為 position <> 0。

 

2.如果如上所述有正確讀到庫存的話,就會執行 if Position = 1 and Filled = 1 這部分沒錯。

 

您可以使用 print 函數將相關數值印出確認,看是否有符合您的預想。

路人小員工 發文於   2023/05/10

再請問一個移動停利的問題,

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

input: profit_drawback_point(20, "停利回跌(點)");

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

腳本中的停利或回跌點數,可否隨著 max_profit_point 的改變而變化。

例如獲利40點後,如果回跌20點即出場。如果獲利達到50點時,回跌點數變成25點,

獲利60點後,則回跌點數變成30點。

目前是可以寫出類似的作法嗎?謝謝!

 

 

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

 Hello 路人小員工,

 

可以的,關於移動停利的腳本您可以參考內建的交易腳本。

至於回跌點數要隨著max_profit_point 改變而變化的部分,您只要另外設一個變數來判斷即可。

舉例來說,多單的狀況下:

var: profit_drawback_point_var(0)

if filledavgprice <> 0 then begin

    value1 = close - filledavgprice;

    if value1 < 40 then profit_drawback_point_var = profit_drawback_point

    else if value1 < 50 then profit_drawback_point_var = 25;

    else if value1 < 60 then profit_drawback_point_var = 30;

    end;

 

然後將原本腳本中停利判斷使用的 profit_drawback_point 改為 profit_drawback_point_var 即可。

路人小員工 發文於   2023/05/11

感謝小幫手的回覆!

路人小員工 發文於   2024/09/13

如果一次買進兩口,在移動停利的點數啟動時,先賣出一口,另一口則進行移動停利的判斷,

這個部份的position and filled要怎麼寫,才能順利達到減碼跟移動停利呢?

虎科大許教授 發文於   2024/09/13

if 啟動移動停利的條件=true then setposition(1,market);

if 移動停利出場條件觸發=true then setposition(0,market);

XS小編 發文於   2024/09/19

Hello 路人小員工,

 

小編補充,要用position和filled來控制的話,可以讓其在2張時且移動停利啟動時出掉1張,在移動停利觸發時平倉。

if 啟動移動停利的條件=true and position = 2 and filled = 2 then setposition(1,market);

if 移動停利出場條件觸發=true and position > 0 and filled > 0 then setposition(0,market);  

會用 position > 0 and filled > 0 是為了萬一 啟動移動停利 和 移動停利出場條件觸發 時間太相近的話,可以確保兩張都賣出。

 

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

發表回覆
Close