軟性的交易程式寫法,是把一個單真正的 SL/TP 放在一個更遠位置,等待價格超過 SL/TP 的位置時,才把單平倉。最常見的是兩倍法:
所以當價格超過真正的 TP 時,你會偵測到然後把單關掉,這邊請留意,如果是買單(long)你是要等 Bid 超過才平倉,而非 Ask,而且當你平倉的時候,你可能:
1. 平在 Trigger TP 的上面,多賺一點
2. 平在 Trigger TP 的下面,少賺一點
軟性寫法的最大優勢,是對於 SL/TP 過度擬合的交易策略,會很容易表現不穩定而爆掉。因為你並不會嚴格的 SL/TP 在你要的位置,而是在 SL/TP 的下一個 Tick 的位置。
Pending 也是一樣,在軟性寫法中,回測就不會遇到跳多、跳空還會當作有開的情況,因為一個 tick 直接超過 SL/TP,你的 order 要開會 invalid SL 或 invalid TP。
兩倍法的好處,是你不用存 狀態變數(state variables)因為你可以直接從現有的單的 SL/TP 直接除以 2 得到 Trigger Price,但是一直反覆去和 Server 拿 SL TP 價格也是會變慢,所以通常軟性寫法會盡量存狀態變數。
也就是你可以不放 SL/TP ,而是在 Order 傳出去的時候,直接把他原先應該放的 SL/TP 存起來,你可以寫在檔案備份,如果 EA 重新啟動就去讀取檔案還原狀態變數。
Soft Pending 一定要搭配 Soft SL/TP 嗎?
不一定,如果你是要避免價格跳多、跳空,Soft Pending 搭配 Hard SL/TP 會比較好,因為範圍較小,價格跳多/跳空之後,較容易沒開到(代表回測、模擬交易的結果會更嚴格,因為你的加減碼可能沒開到)。
我通常都是 Hard Pending 搭配 Soft SL/TP ,較少使用 Soft Pending。
請特別留意,如果你使用 Soft Pending,你的 Order 並沒有正式 Pending 出去,所以你無法從市場上取得 Order 的資訊來計算,程式邏輯可能會有極大差異!
高階補充:兩倍法在不儲存狀態變數的情況下,程式中 ×2 與 ÷2 可透過位運算(bitwise operation)完成,速度有時候比乘法略快。
為了減低計算量,也有人不是算 SL 到 Entry 的範圍、TP 到 Entry 的範圍再乘以 2,而是對例如 long entry 直接把 SL 除以 2,把 TP 乘以 2。
『軟性寫法的最大優勢,是對於 SL/TP 過度擬合的交易策略,會很容易表現不穩定而爆掉。因為你並不會嚴格的 SL/TP 在你要的位置,而是在 SL/TP 的下一個 Tick 的位置。』
回覆刪除關於這段話,如果用Hard Pending而回測時如果選擇 Every tick based on real ticks,是不是一樣會SL/TP再下一個Tick的位置 ?
我發現有些程式用 Every Tick 回測跟用Every tick based on real ticks 回測得到的結果會差異很大。在上線前會一定要用real ticks做衡量嗎? 還是Every Tick 的結果也有參考性?
sorry 這幾天忙, 今天才看到:
刪除1. 如果用 Hard Pending 而回測時如果選擇 Every tick based on real ticks,是不是一樣會SL/TP再下一個Tick的位置 ?
在 MT 回測中原則上是, 但是如果隔夜跳多/跳空, 在 MT 回測設計中還是會 SL/TP 在 Hard Pending 而非 Real Ticks 上唷~~
2. 上線前會一定要用real ticks做衡量嗎? 還是Every Tick 的結果也有參考性?
基本上 80% 一定會, 甚至在上 demo 前就會,
但是也可能只是嘗試性質, 上 demo 前還沒跑 real tick, 上 demo 一段時間才跑 real tick
如果你跑 real tick 真的要太久, 那可以上 demo 5-10 組, 然後有好的你再用 real tick 稍微擾動參數看穩不穩定
還是要跑 real tick 的原因有 3 個:
1. Model 部分如果過擬合, 現實因素, 例如變動的 spreads, slippage, lag 等等...
2. 基本上學過資金管理, 就不太容易 Model 過擬合, 但是 Real Ticks 通常包含 Real Spread
每一家券商的 spread offering 的習慣不一樣, 所以這時候還是得再看看券商的適配情況
3. 在 MetaTrader 的系統限制下, MT4 的 spread 是 const, MT5 的公用 data 的 spread 有時候很詭異
在 MT5 中 tick 和 real tick 在跑的時候會可能有秒差, 例如 real tick 都能跑在整點 00:00:00
但是 every tick 可能會跑在 00:00:02, 00:13:01, 這累積起來的誤差也可能很大