累積獲利為正後離場

  •   262 
  • 最後發表   華哥  2024 五月 14
華哥 發文於   2024/05/08

我想要每次程式執行時去計算過去的獲利

我會透過MACD與三分鐘線來計算我的訊號

因此我的程式執行頻率為三分鐘一次

但是由於我是做台指期,同時會作多與作空,當死亡交叉時做空,黃金交叉時做多,每 50 點就會進行停損停利

我想要在我首次獲利時就離場,也就是說,接下來都不會再進場

請問我該如何實現這樣的功能?

排序方式: 標準 | 最新
XS小編 發文於   2024/05/09

 Hello 華哥,

 

您可以在進場條件中加上 "獲利" 要小於或等於0時才可以進場。

而 "獲利" 可以使用交易函數來計算,像是 FilledRecordPrice, FilledRecordBSFilledRecordCount

華哥 發文於   2024/05/09

 我有看過這些函數

所以沒有內建比較快速的方式可以計算獲利對吧?

因為如果使用上述您說的函數來計算

我似乎就需要透過迴圈來判斷某次交易是做空還是做多

並且她下次交易是做多還是做空

我才知道這次交易是否為獲利或者是損失

並且還要將偶數次結果加總如果為正才是真正的獲利

除此之外,我想再追問一個問題

想要詢問,我是否可以將這些判斷塞進一個 function 裡面?

並且透過呼叫的方式來計算

華哥 發文於   2024/05/09

還有,不曉得是否可以請官方更新一下說明文件

程式的說明文件非常不齊全

例如明明有 else if 的語法,但實際上官方文件根本沒有寫

除此之外,printf 原本預期可以在回測時看到輸出

但實際上似乎只能輸出到檔案再慢慢看?

還有,每一種函數的回傳值在文檔上也沒有很詳細說明他的 type

XS小編 發文於   2024/05/10

Hello 華哥,

 

就小編所知沒有函數可以直接取得獲利的資訊。

您也不一定需要使用迴圈,舉例來說您可以撰寫一個函數:

value1 = filledRecordCount;

if value1 <> 0 and filled = 0 then begin

    if filledRecordBS(value1 - 1) = 1 then retval = FilledRecordPrice(value1) - FilledRecordPrice(value1-1)

    else if filledRecordBS(value1 - 1) = -1 then retval = FilledRecordPrice(value1-1) - FilledRecordPrice(value1);

    end

else retval = 0;

這樣的話此函數就會在出場後庫存為0的狀況下回傳最近一次進出場的價差。

當然這只是個簡單的範例,若您交易策略進出場複雜的話就會需要作相對應的調整。

 

print在回測的時候一定是輸出到檔案中沒錯,自動交易即時的情況下則會顯示在策略中的執行紀錄中。

函數的回傳值大部分都會是數值或是布林值,函數中的範例可以看到回傳值可以如何使用。

小編會將您的意見反映給相關人員作參考。

華哥 發文於   2024/05/10

我對於我沒有將問題定義清楚感到抱歉

首先您這邊所謂的函數跟我的認知不太一樣

我的定義一個函數的意思,他可能會有輸入或輸出

他可以接收我傳入的值計算出我想要的值

並且我可以透過名稱來呼叫他

但是您這邊所撰寫的程式碼,我這邊的理解是

他只是一段程式碼僅此而已,並不是我這邊需求的"函數"

除此之外,想順便詢問一下 <> 的語法在哪裡有文檔可以參考?

因為我沒有看到這個語法好奇想問一下

除此之外,您這邊所撰寫的程式我有幾個疑問

1. retval 我在使用時,他出現以下錯誤訊息

在「交易」腳本中無法使用「retval」。

2. 依照我的理解,您的程式碼只計算當前與前一次獲利或停損的狀況

但是實際上,這樣的作法並沒有符合我標題中的"累積獲利為正出場"

例如說,前5筆交易全都是停損出場,那麼後面三筆就算是連續停利出場的

也未必可以沖銷前面的虧損,所以與我這邊的需求也不太相同,

但可能是我沒有描述清楚,很抱歉

3. 我有提到說 我想要在我首次獲利時就離場,也就是說,接下來都不會再進場

但是似乎沒有看到類似的邏輯,假如我的程式碼執行頻率為三分鐘,那麼我希望假如累計獲利為正,接下來的所有三分鐘都不要再進場了,也就是說今天都不要在進場了

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

(1)函數一定會回傳值,但不一定需要提供參數讓使用者輸入。XS小編寫的程式就是沒有參數的函數,被呼叫時,它只會傳回前後筆成交價的差額。函數腳本的某些指令,例如retval,不能使用於交易腳本。

(2)若你的交易策略是當沖策略,則可跑迴圈,逐一抓取成交記錄,以計算累積損益或是於進出場時記錄成交價,以計算累積損益。若不是當沖策略,則由於無法抓取過去交易日的交易記錄。只能透過參數,手動輸入到目前為止的累積損益,讓策略判斷是否累積損益已為正數。

  • 按讚來自於
  • WANG51026
華哥 發文於   2024/05/11

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

我的程式是跑期貨當沖沒錯

我也有想過是不是應該寫成迴圈的型式

並且將執行頻率改成一天一次

只要收益為正結束程式就可以完全離場沒錯

不過我想說,可以多看看有沒有其他方式

不過很好奇 retval 無法用於交易腳本,那麼想請教

有什麼函數是可以讓我在回測時進行輸出來 debug 的?

目前我觀察似乎只有 printf 到檔案這條路可以走

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

用Print列印累積損益即可。請記得,代表累積損益的變數,每天都要先歸零。

  • 按讚來自於
  • WANG51026
XS小編 發文於   2024/05/14

Hello 華哥,

 

小編補充:

1.retval是函數中使用的語法,主要是用來顯示函數腳本執行結果。

除了使用 retval 以外,用函數的名稱也可以回傳函數腳本的執行結果 (可參考內建的average函數)。

 

2.此函數只會計算最近一次進出場的獲利虧損沒錯。

但您可以在交易腳本中用變數在每次出場後呼叫此函數來作累加,就可以得到累積的獲利 (需注意該範例沒有將手續費納入計算)。

 

3.同上,可以在進場條件中加上 累加的變數需要小於等於0 當作條件即可。

或是只要累加變數大於0就執行 RaiseRunTimeError 中斷策略執行。

 

要確認腳本運作是否符合所需,目前都是使用 print 函數來確認沒錯。

 

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

發表回覆
Close