部位加碼

  •   191 
  • 最後發表   小韭菜  2022 六月 01
小韭菜 發文於   2022/05/29

Hi 小幫手,

我正在撰寫自動交易,我的邏輯如下,請幫忙看一下我的程式是否能達到我的需求,謝謝。

我想要達成的邏輯如下:

我想要達成的邏輯跟code如下:

var: isRealTime(1); //1:開盤期間, 0:回測期間。

{

1.

09:00:00 ~ 09:30:00

開盤時,一律將昨天買的賣在開盤價。

2.

09:30:01 ~ 13:22:00

滿足條件就買,一次買足。

3.

13:22:01 ~ 13:25:00

快收盤時,價格低於成本就攤平。

}

var: trigger(False);

var: _buy_qty(0); 

SetBarBack(160, "D"); 

SetTotalBar(270); 

 if GetField("Date") <> GetField("Date")[1] 

then begin 

condition1 = False;

condition2 = False;

end;

 

trigger = condition1 and condition2;

 

if GetField("Time") < 092900 then begin

{1. 昨天買的,今天一律賣在開盤價}

if Position <> 0 and FilledRecordCount <> 0 and FilledRecordDate(FilledRecordCount) <> getfield("Date")then begin

Setposition(0, Market, label:="出清"); 

end;

end

else if GetField("Time") >= 093000 and GetField("Time") < 132200 and getinfo("isRealtime") = isRealTime then begin

{2. 滿足條件就買,一次買足。不可重復委托,以免要重新排隊。}

if Position = 0 and trigger = True then begin 

_buy_qty = 5

setposition( _buy_qty, Market, label:="1st買");

end;

end

else if GetField("Time") >= 132200 and getinfo("isRealtime") = isRealTime then begin

{3. 快收盤時,若價錢低於成本,則攤平。攤平的張數以庫存為依據。}

if Filled > 0 and Close <= FilledAvgPrice * 0.7 then begin

if Close > FilledAvgPrice * 0.5 then begin 

{若價錢在成本的(0.7~0.5間,則攤平(持有張數*1)。}

_buy_qty = Filled * 1;

end

else begin 

{若價錢在成本的(小於0.5,則攤平(持有張數*2。}

_buy_qty = Filled * 2;

end;

 

setposition(_buy_qty + Position, Market, label:="2st買"); 

end;

end;

 

 

我想要達成的邏輯跟code如下:

1. 就是隔天開盤時,把昨天買的全部在開盤時用市價賣掉。

if GetField("Time") < 092900 then begin

{1. 昨天買的,今天一律賣在開盤價}

if Position <> 0 and FilledRecordCount <> 0 and FilledRecordDate(FilledRecordCount) <> getfield("Date")then begin

Setposition(0, Market, label:="出清"); 

end;

end

 

2. 在09:30:01 ~ 13:22:00開始執行交易本體,這段期間滿足條件就執行買入的動作,例如委托市價買5張,那希望做到,在13:22:00可以買滿5張,除非委托失敗,否則不要重復送委托單,因為這樣就會重新排隊。

   

if GetField("Time") >= 093000 and GetField("Time") < 132200 and getinfo("isRealtime") = isRealTime then begin

{2. 滿足條件就買,一次買足。不可重復委托,以免要重新排隊。}

if Position = 0 and trigger = True then begin 

_buy_qty = 5

setposition( _buy_qty, Market, label:="1st買");

end;

end

 

這裡用"已成交的張數" x2,我是這樣寫的 Filled * 2 , 用Filled對嗎?

3. 

尾盤如果: 1. 現價低於成本價就做攤平,然後攤平的張數是用"已成交的張數" x 2 (or x 1)。 因為之前的委托不見得買的到,所以有買到才做攤平。

if GetField("Time") >= 132200 and getinfo("isRealtime") = isRealTime then begin

{3. 快收盤時,若價錢低於成本,則攤平。攤平的張數以庫存為依據。}

if Filled > 0 and Close <= FilledAvgPrice * 0.7 then begin

if Close > FilledAvgPrice * 0.5 then begin 

{若現價在成本的(0.7~0.5間,則攤平(持有張數*1)。}

_buy_qty = Filled * 1;

end

else begin 

{若現價比成本(小於0.5,則攤平(持有張數*2)。}

_buy_qty = Filled * 2;

end;

 

setposition(_buy_qty + Position, Market, label:="2st買");  //這裡要用Position or Filled??

end;

end;

 

另外,getinfo("isRealtime") = isRealTime這個的目的就要讓我方便在盤中即時交易跟盤後回測做切換,

不知有沒有更方便的寫法,希望能做到code在不更動的情況下可以同時滿足盤中交易跟盤後回測,謝謝。

 

 

 

 

 

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

Hello 小韭菜,

 

1. 如果您收盤後有關掉自動交易,然後開盤前再使用依庫存打開的話,部位的進場時間會被設定為當天。

這樣 FilledRecordDate(FilledRecordCount) <> getfield("Date") 就不會符合,須注意這點。

最簡單的應對方法是如果開盤第一根Bar的庫存不為0的話就視為有昨日庫存。

 

2. getinfo("isRealtime") = isRealTime 小幫手會建議您將 isRealTime設為input,而不是變數,使用上會比較方便,也不需一直修改腳本。

只要沒有另外或重複觸發 SetPosition 的話,就不會重複送委託單。

 

3. 您所謂的攤平應該是指加碼是嗎?如果是的話,裡面的 setposition(_buy_qty + Position, Market, label:="2st買"); 將會是 _buy_qty + position 的數量。

您的position沒動過,所以會是 5。

filled則是隨您之前成交的張數而變化,假設是有 3 張成交的狀況。

在 收盤價低於成本的7成的時候 _buy_qty 會是 3,小於成本5成的時候會是6。

所以若有發生收盤價低於成本7成以下的話,最後部位會變成 setposition(8, market) 或 setposition(11, market)。

如果將position改為filled的話,則會是 setposition(6, market) 或 setposition(9, market)。

 

需注意的是,台股漲跌幅是有限制的(10%),所以您所謂低於成交價7成的狀況應該是不會發生。

 

小幫手建議您在開發時可以搭配print印出相關數值,這樣就可以即時確認策略運作狀況。

發表回覆
Close