jacklcl
發表於 14-8-3 22:24
orangelam 發表於 14-8-3 17:20 static/image/common/back.gif
thanks for below link.
amibroker.com/kb/2007/03/24/how-to-plot-a-trailing-stop-in-the-price-chart/
( ...
我開頭有用applystop這個function
但之後發覺要plot出來就很複雜
所以轉用loop了
而且比較容易理解及更改
手續費我設了30元單邊, 不過IB好像不用這麼貴
orangelam
發表於 14-8-4 01:12
amibroker.com/kb/2007/03/24/how-to-plot-a-trailing-stop-in-the-price-chart/
這個example 只是illustrate 了buy and sell.
但如果buy=cover, sell=short 時, buy/sell and short/cover 兩邊都做custom trailing stop 的話便很難做, 今天做了整天也做不來, 知道那裡有類似的code 嗎?
osdak
發表於 14-8-4 09:07
本帖最後由 osdak 於 14-8-4 09:09 編輯
Hi, 我用這個loop移動止損做了一些backtest, 我突然想到了一個問題, 因為於loop中會把"理論"成交價寫回去, 但於測試過程中, 其實是一根一根的測, 舉例如設15分鐘, 那其實是於那根bar符合了入場條件, 再把理論成交價寫回去, 這本來沒什麼問題, 但如果加任何指標做filter, 如要同時符合rsi>50, 那backtest的結果其實是不真實, 因為只有那些在當根bar跑完, 而rsi還是大於50, 而又同時符合進場條件的, 才會得到回測, 而如果, 那些於在bar開始時, rsi還是處於大於50的位置, 而又剛好有了進場signal, 那於實時中會進場, 但如果之後當根bar的rsi是會跌穿50, 那於實際時我們進了場, 但於回測中卻會跳過了這些交易, 那就會做成回測結果不可靠, 而且這情況會出現於所有指標. 再進一步, 就算用applystop, 都一樣會有這個問題, 不知樓主有沒有這種看法? 我還不確定.....
jacklcl
發表於 14-8-4 09:34
orangelam 發表於 14-8-4 01:12 static/image/common/back.gif
amibroker.com/kb/2007/03/24/how-to-plot-a-trailing-stop-in-the-price-chart/
這個example 只是illustra ...
我沒寫這個經驗
不過我相信只要花時間多研究就能寫出
像我之前把範例改寫成跌破/升破幾多根BAR出場
都花了近1星期
如果你本身懂寫程式語言, 相信會更快
osdak
發表於 14-8-4 09:48
本帖最後由 osdak 於 14-8-4 09:50 編輯
osdak 發表於 14-8-4 09:07
Hi, 我用這個loop移動止損做了一些backtest, 我突然想到了一個問題, 因為於loop中會把"理論"成交價寫回去,...
我再想了一下,這跟applystop還是loop的止損沒關係,是如果要如樓主於bar中進場,就應該會遇到,不知對不對....
jacklcl
發表於 14-8-4 09:49
osdak 發表於 14-8-4 09:07 static/image/common/back.gif
Hi, 我用這個loop移動止損做了一些backtest, 我突然想到了一個問題, 因為於loop中會把"理論"成交價寫回去,...
是的, 如果你指標用close price去計算
必須當根BAR跑完才入場 (好像之前K大有提及這個問題)
我自己如用這類指標
會用Ref -1這樣寫
例如我突破策略加RSI做Filter的話
Upper = HHV(Ref(H, -1), 5);
MyRSI = RSI (5);
Buy1 = Ref(H, -1) > Ref(Upper, -1);
Buy2 = Ref(MyRSI, -1) > 70;
Buy = Buy1 and Buy2;
Buyprice = Open;
發生signal後用Open價買入
這樣做感覺較真實及安全
如各大大有其他做法, 請指點
jacklcl
發表於 14-8-4 09:52
osdak 發表於 14-8-4 09:48 static/image/common/back.gif
我再想了一下,這跟applystop還是loop的止損沒關係,是如果要如樓主於bar中進場,就應該會遇到,不知對不 ...
如果只是純突破策略是沒問題的
H >= Upper 即以市價入市
設Buyprice = Upper + 3點滑價
但如要加filter就會有問題了
因為要同時符合條件後入市價未必是Upper那個價位的
osdak
發表於 14-8-4 09:54
jacklcl 發表於 14-8-4 09:52
如果只是純突破策略是沒問題的
H >= Upper 即以市價入市
設Buyprice = Upper + 3點滑價
對!我就是怕樓主沒看到這點,但看來已經考慮了. 因為我之前都是研究跑完bar才進場,所以第一次試盤中進場的碼
jacklcl
發表於 14-8-4 10:01
osdak 發表於 14-8-4 09:54 static/image/common/back.gif
對!我就是怕樓主沒看到這點,但看來已經考慮了. 因為我之前都是研究跑完bar才進場,所以第一次試盤中進 ...
設計策略時常犯的錯誤
可看看這個
http://www.amibroker.org/userkb/2007/07/21/system-design-pitfalls/
jacklcl
發表於 14-8-4 13:37
osdak 發表於 14-8-4 09:54 static/image/common/back.gif
對!我就是怕樓主沒看到這點,但看來已經考慮了. 因為我之前都是研究跑完bar才進場,所以第一次試盤中進 ...
這種陷阱的確要回測過才察覺的
我自己在初期就發現了
而用C去計算的filter但盤中是用H/L去入市
這是不可能做到的
因為這2個Price出現的時間不一致
如真的要加filter, 只可用H/L去計算
那2個Price才能同步的
osdak
發表於 14-8-4 14:49
jacklcl 發表於 14-8-4 13:37
這種陷阱的確要回測過才察覺的
我自己在初期就發現了
而用C去計算的filter但盤中是用H/L去入市
是,我也是想了想才發現。但如果你用當根bar的H/L去做filter,H/L也會隨時改變吧?
jacklcl
發表於 14-8-4 15:09
osdak 發表於 14-8-4 14:49 static/image/common/back.gif
是,我也是想了想才發現。但如果你用當根bar的H/L去做filter,H/L也會隨時改變吧? ...
盤中交易的話
用H/L是可以的
只要你另一邊的條件都是用H/L來出signal
它的價位就會同步
而其中問題會是另一邊條件符合, 但filter 用H/L所計算的指標未到
解決方法我想過是先計算這2個條件的H/L要多少
如要2個條件符合
那個PRICE必定是2個之中較高/低的
然後Buy/Short Price可以用Max/Min這個function來模擬
不過我未測試過
orangelam
發表於 14-8-5 18:28
amibroker.com/kb/2007/03/24/how-to-plot-a-trailing-stop-in-the-price-chart/
if( trailstop > 0 AND Low[ i ] < trailstop )
{
Sell[ i ] = 1;
SellPrice[ i ] = trailstop;
trailstop = 0;
}
假設在做backtest 時(以下簡單一點假設滑價是0), 做的是1mins data, 又假設某一刻buy at 22320, trailing stop level 是22350. 如果現在loop到下面這支bar
high22360
open22355
close22348
low22345
因為trailstop > 0 AND Low[ i ] < trailstop, 所以符合了exit rule, 所以sellprice=22350
但在real time data時(假設現在是交易時間, 每一刻都有價格進入amibroker), 如果未來這一分鍾是上述這條bar, 假設在這一分鍾內, 有六個交易價格進入amibroker, 例如下面:
when
Time=n, price=22355 (open)
Time=n+0.2, price=22349
Time=n+0.4, price=22345 (low)
Time=n+0.6, price=22353
Time=n+0.8, price=22360 (high)
Time=n+1, price=22348 (close)
如果amibroker一分鍾才refresh 一次, 當然一分鍾後low(n+1)=22345, 符合了exit rule and sellprice=22350, 但在t=n+1 時, 以22350 sell 出是不實際的. 所以我估計amibroker 是不是在這一分鍾內, 每收到價格時便refresh and loop 一次? 例如下面:
when Time=n+0.2, 現在有兩支價格, 分別是
Time=n, price=22355 (open)
Time=n+0.2, price=22349
所以 在這刻, amibroker 如果loop 一次的話, low(n to n+0.2)=22349, 符合exit rule, 所以sellprice=22350 (當然現實中會滑一點點價, 例如2點, 所以sellprice=22348, 便可以成交了)
Furthermore, if generalise this idea, 是不是每當有data 進入amibroker 時, amibroker 便會造出對應的open high low close 然後再loop 一次?
例如現在是t=n+0.2而且有一個data 進入amibroker, amibroker便根據t=n to t=n+0.2 內的數據做一set open high low close, then loop once.
例如現在是t=n+0.4而且有一個data 進入amibroker, amibroker便根據t=n to t=n+0.4 內的數據做一set open high low close, then loop once.
小弟未試過real time data, 不知道以上想法合不合理, 及在real time 時amibroker會怎樣處理連續的data.
j 大及o大有空解答一下吧:) 感謝
jacklcl
發表於 14-8-5 22:52
orangelam 發表於 14-8-5 18:28 static/image/common/back.gif
amibroker.com/kb/2007/03/24/how-to-plot-a-trailing-stop-in-the-price-chart/
if( trailstop > 0 AN ...
其實那個sellprice我自己不會這樣寫的
建議這樣寫比較好
SellPrice[ i ] = Min (Open , trailstopB);
因為如果有一支BAR一開時已跌破trailstopB
但你回測用trailstopB做sellprice, 你的結果會高估了
而real time時, 我是每秒refresh的
O是會固定在那裡的, 只有H/L/C這3個會變動直至當根BAR跑完
而以H/L作trigger的話, 它是可以在盤中就trigger個condition的
但C則要待那根BAR真正跑完才會有signal
你的case來說, 它會在Time=n+0.2, price=22349這裡trigger個sell
這時IB會掉市價單出去, 如沒有滑價的話則在22349成交
另外, Low[ i ] < trailstop這裡我會加=的
Low[ i ] <= trailstop
如果不加的話, 那麼它會待跌穿trailstopB才會trigger sell
你的sellprice就不會完全一樣的, 那你要在trailstopB減1,2點去模擬了
orangelam
發表於 14-8-7 11:38
Thanks for telling me this! I am much more cleared now!
但想想下, 以下兩個情況又感到混亂
Assume my signal is based on 1min data.
Case1:
Buy=(buy signal is solely generated by open and close)
buyprice is set at close (設定在settings-->trades)
但由於close 只會在每分鍾跑完後才生成
所以 In real time, If now time is n+0.2 and now loop below code,
if( trailstop == 0 AND Buy[ i ] )
what will this buy (buy) be? And also the corresponding buyprice?
Case2:
Buy=(buy signal generated by High and Low).
buyprice is set at close (同樣設定在 settings-->trades)
When doing backtest, it is ok because Buy signal is generated based on the high and low in every MINUTE and buy at close price, then calculate profit/loss,
But in real time, at time=n+0.2, 如果Buy=1, what is the value of corresponding buyprice?