自動交易_當天一直重複進出場

  •   451 
  • 最後發表   Nestor  2024 五月 06
Nestor 發文於   2024/04/22

小幫手您好,我在設定自動交易時腳本如下,指定選股是選股法,策略部位依庫存,開啟庫存異動時自動加入執行,在安控上也有勾選每日最多進場一次,但在啟動自動交易後,他還是會一直重複進出場,再請協助解惑,謝謝。

input:

    maxprice(300,"股價不可超過"),

    lostex(10,"虧損多少出場%"),

    dayexit(3, "多少天出場");

var:

    intraBarPersist dayentry(0); // 控制當天出場後,不會當天又再進場

if date <> date[1] and currenttime = 090000 then

    dayentry = 0;

if date <> date[1] and position = 0 and dayentry = 0 and close <= maxprice then

    setposition(1);

if position > 0 and filled > 0 and (

    currenttime >= 090200 and date[dayexit - 3] > FilledRecordDate(FilledRecordCount) or

    close <= filledAvgPrice * (1 - lostex * 0.01)

) then

    setposition(0);

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

有兩個問題:

(1)看起來你使用的頻率是日頻率。在日頻率之下,date一定不等於date[1]。

(2)currenttime是電腦的系統時間,你要在090000讓dayentry=0,這個條件應該不會符合,因為一開盤,你洗到價時,應該已經超過090000。不過,這個不是大問題,因為你的程式並沒有更動dayentry的數值,所以它一直都是0。也就是說,你出場後,只要價格小於等於300,又會再進場。

Nestor 發文於   2024/04/22

許教授您好:

我是要用在日頻率沒有錯,我的策略是若有出現在選股清單(昨日盤後)上,今天開盤就進場,後續就不再進場,直到進場3天後或虧損10%出場。

(1)如你所說若我直接把9點成9點01分,加入dayentry = 1; // 進場後設置 dayentry 為 1,防止再次進場。

(2)其實我還是不太知道為何當天會重複出場再進場,因為也沒有達到出場要求,再麻煩許教授指導,謝謝。

目前策略修正如下:

 input:

    maxprice(300,"股價不可超過"),

    lostex(10,"虧損多少出場%"),

    dayexit(3, "多少天出場");

var:

    intraBarPersist dayentry(0); // 控制當天出場後,不會當天再進場

if date <> date[1] then

    dayentry = 0;

if position = 0 and dayentry = 0 and currenttime >= 090100 and close <= maxprice then

begin

    setposition(1);

    dayentry = 1; // 進場後設置 dayentry 為 1,防止再次進場

end;

if position > 0 and filled > 0 and (

    date[dayexit] > FilledRecordDate(FilledRecordCount) or

    close <= filledAvgPrice * (1 - lostex * 0.01)

) then

    setposition(0);

 

 

 

虎科大許教授 發文於   2024/04/23

你出場之後會再進場,是因為dayentry一直為零。在日頻率之下,date<>date[1]的判斷式是可以省略的,因為它永遠成立。會符合出場條件,應該與你抓庫存最後一筆的日期有關。你可以print看看FilledRecordDate(FilledRecordCount)的數值是多少。

XS小編 發文於   2024/04/23

 Hello Nestor,

 

小幫手補充,如果您在日頻率下想讓變數可以在換日的時候重置的話,可以使用intrabarpersist的變數來判斷。

舉例來說:

var: intrabarpersist _lastDate(0);

 

if date <> _lastDate then begin

    _lastDate = date;

    dayentry = 0;

    end;

 

這樣在每次換日的第一次洗價時, _lastDate 會被更新成該日的日期 (同一日不會觸發第二次),且 dayentry 會被歸0。

Nestor 發文於   2024/04/24

小幫手您好:

我將您提供的程式碼加入後,這樣不知道是否正確?   需確認當天不重複進場,謝謝。

input:

    maxprice(300,"股價不可超過"),

    lostex(10,"虧損多少出場%"),

    dayexit(3, "多少天出場");

 

var: intraBarPersist dayentry(0);

var: intrabarpersist _lastDate(0); // 控制當天出場後,不會當天又再進場

if date <> _lastDate then begin

    _lastDate = date;

    dayentry = 0;

    end;

if date <> date[1] and position = 0 and dayentry = 0 and close <= maxprice then

    setposition(1);

if position > 0 and filled > 0 and (

    currenttime >= 090200 and date[dayexit - 3] > FilledRecordDate(FilledRecordCount) or

    close <= filledAvgPrice * (1 - lostex * 0.01)

) then

    setposition(0);

虎科大許教授 發文於   2024/04/24

程式可以寫得更有效率些:

input: maxprice(300,"股價不可超過"), lostex(10,"虧損多少出場%"), dayexit(3, "多少天出場");

var: intraBarPersist hasOrdered(false); // 控制當天出場後,不會當天再進場

if getinfo("IsRealTime")=0 then return;

//進場

if position = 0 and hasOrdered = false and close <= maxprice then

begin

setposition(1);

hasOrdered = true; // 進場後設置 hasOrdered為True,防止再次進場

end;

//出場

if position > 0 and filled > 0 and (

    date[dayexit] > FilledRecordDate(FilledRecordCount) or

    close <= filledAvgPrice * (1 - lostex * 0.01)) then setposition(0);

Nestor 發文於   2024/04/25

感謝許教授,我還不太熟悉寫程式,

另還想請問許教授,若是選股法連續兩天出現同一支股票,但由於我庫存中已經有該支股票(昨日進場),如何避免今天啟動自動交易又再次進場呢?

目前策略如下:

//多單停損(%)

input: profit_percent(10, "停利(%)");

input: loss_percent(10, "停損(%)");

var:

    intraBarPersist dayentry(0);

 

// 控制當天出場後,不會當天又再進場

if date <> date[1] and currenttime = 090000 then

    dayentry = 0;

 

if date <> date[1] and position = 0 and dayentry = 0 then

    setposition(1);

 

if Filled > 0 then begin

 

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

 if profit_percent > 0 and 

 Close >= FilledAvgPrice*(1+0.01*profit_percent) then begin

 { 停利 }

 SetPosition(0, label:="停利出場");

 end else if loss_percent > 0 and 

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

 { 停損 }

 SetPosition(0, label:="停損出場");

 end;

 

end;

虎科大許教授 發文於   2024/04/25

策略部位選擇依庫存,然後在進場策略中加入以下程式碼:

once(true)

begin

if filled<>0 then raiseRunTimeError("舊庫存,不監控");

end;

Nestor 發文於   2024/04/25

許教授好:

整合您之前幫我修正之進場策略,現階段進場策略如下,不知是否正確。

var: intraBarPersist hasOrdered(false); // 控制當天出場後,不會當天再進場

if getinfo("IsRealTime")=0 then return;

if position = 0 and hasOrdered = false then

begin

    setposition(1);

    hasOrdered = true; // 進場後設置 hasOrdered為True,防止再次進場

 

once(true)

begin

if filled<>0 then raiseRunTimeError("舊庫存,不監控");

end;

 

end;

虎科大許教授 發文於   2024/04/25

我會把Once結構寫在前面。

var: intraBarPersist hasOrdered(false); // 控制當天出場後,不會當天再進場

if getinfo("IsRealTime")=0 then return;

once(true)

begin

if filled<>0 then raiseRunTimeError("舊庫存,不監控");

end;

if position = 0 and hasOrdered = false then

begin

setposition(1);

hasOrdered = true; // 進場後設置 hasOrdered為True,防止再次進場

end;

顯示更多回應 發表回覆
Close