From 8541a1592afd4138c09d4ab0671348d8d8f672b2 Mon Sep 17 00:00:00 2001 From: awb99 Date: Thu, 10 Oct 2024 10:47:04 -0500 Subject: [PATCH] trailing stop long/short working --- dev/src/dev/backtest/backtest.clj | 30 ++++++++++--------- src/quanta/trade/entry_signal/exit/config.clj | 2 +- .../trade/entry_signal/exit/position.clj | 18 ++++++----- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/dev/src/dev/backtest/backtest.clj b/dev/src/dev/backtest/backtest.clj index 2f6f860..e0716cc 100644 --- a/dev/src/dev/backtest/backtest.clj +++ b/dev/src/dev/backtest/backtest.clj @@ -16,25 +16,29 @@ (t/instant "2024-09-08T00:00:00Z") (t/instant "2024-09-09T00:00:00Z") (t/instant "2024-09-10T00:00:00Z") - (t/instant "2024-09-11T00:00:00Z")] + (t/instant "2024-09-11T00:00:00Z") + (t/instant "2024-09-12T00:00:00Z") + (t/instant "2024-09-13T00:00:00Z") + ] :open [100 100 120 120 100 100 120 - 100 90 100 100] + 100 90 100 100 110 110] :high [100 100 120 120 100 100 120 - 100 90 100 100] + 100 90 100 100 110 110] :low [100 100 120 120 100 100 120 - 100 90 100 100] + 100 90 100 100 110 110] :close [100 100 120 120 100 100 120 - 100 90 100 100] + 100 90 100 100 110 110] :atr [ 5 5 5 5 5 5 5 - 5 5 5 5] + 5 5 5 5 5 5] :entry [nil :long nil nil :long nil nil - :short nil nil nil]})) + :short nil nil nil nil]})) + bar-ds @@ -70,9 +74,6 @@ bar-ds :exit [{:type :trailing-stop-offset :col :atr } ]} bar-ds) - ;; => Evaluation was interrupted - - (print-table [; :id ; :asset :side @@ -86,7 +87,8 @@ bar-ds ; :exit-idx ])) -; | :side | :qty | :entry-price | :exit-price | :entry-date | :exit-date | :reason | -; |-------+------+--------------+-------------+----------------------+----------------------+----------------| -; | :long | 1.0 | 100 | 115 | 2024-09-02T00:00:00Z | 2024-09-05T00:00:00Z | :trailing-stop | -; | :long | 1.0 | 100 | 115 | 2024-09-05T00:00:00Z | 2024-09-08T00:00:00Z | :trailing-stop | +; | :side | :qty | :entry-price | :exit-price | :entry-date | :exit-date | :reason | +; |--------+------+--------------+-------------+----------------------+----------------------+----------------| +; | :long | 1.0 | 100 | 115 | 2024-09-02T00:00:00Z | 2024-09-05T00:00:00Z | :trailing-stop | +; | :long | 1.0 | 100 | 115 | 2024-09-05T00:00:00Z | 2024-09-08T00:00:00Z | :trailing-stop | +; | :short | 1.0 | 100 | 105 | 2024-09-08T00:00:00Z | 2024-09-12T00:00:00Z | :trailing-stop | diff --git a/src/quanta/trade/entry_signal/exit/config.clj b/src/quanta/trade/entry_signal/exit/config.clj index 7d3b65e..507e434 100644 --- a/src/quanta/trade/entry_signal/exit/config.clj +++ b/src/quanta/trade/entry_signal/exit/config.clj @@ -34,7 +34,7 @@ (let [{:keys [entry-price side]} position close (:close row) offset (get row col)] - (println "new-level offset: " offset) + (println "trailing offset: " offset " close: " close " level: " level "entry: " entry-price) (if level (case side :long (- close offset) diff --git a/src/quanta/trade/entry_signal/exit/position.clj b/src/quanta/trade/entry_signal/exit/position.clj index 9dbf6a2..fed69dc 100644 --- a/src/quanta/trade/entry_signal/exit/position.clj +++ b/src/quanta/trade/entry_signal/exit/position.clj @@ -78,8 +78,7 @@ (defrecord TrailingStopLoss [position level-a new-level-fn label] IExit (check-exit [_ {:keys [high low] :as row}] - (let [; first check if there is an exit at curent level - _ (println "chekcintg TrailingStopLoss...") + (let [; first check if there is an exit at current level r (when (not (nil? @level-a)) (case (:side position) :short @@ -89,19 +88,24 @@ (when (<= low @level-a) [label @level-a]))) ; second calculate new level, and possibly move level - new-level (new-level-fn position @level-a row) + unchecked-level (new-level-fn position @level-a row) + _ (println "trailing unchecked-level: " unchecked-level) new-level (case (:side position) :short (when (or (nil? @level-a) - (< new-level @level-a)) - new-level) + (< unchecked-level @level-a)) + unchecked-level) :long (when (or (nil? @level-a) - (> new-level @level-a)) - new-level))] + (> unchecked-level @level-a)) + unchecked-level))] (when new-level (println "TrailingStopLoss changes from " @level-a " to: " new-level) (reset! level-a new-level)) + (when (not new-level) + (println "TrailingStopLoss unchanged level: " @level-a + " side: " (:side position) " unchecked level: " unchecked-level) + ) r)))