tusa 發表於 10-9-7 11:54

歷史數據回測及真實即時一日數據之結果

小弟剛開始接觸及學習程式買賣, 但仍不明白以下情況:

情況1:
ma1=(Close,10);
ma2=(Close,20);
Buy = Ref ( Cross ( ma1,ma2 ) ,-1 );
Sell = Ref ( Cross ( ma2,ma1) ,-1 );
測試結果變成BUY即日的Close, SELL即日的Close.

若改為情況2:
ma1=Ref ( (Close,10) , -1 );
ma2=Ref ( (Close,20) , -1 );
Buy = Ref ( Cross ( ma1,ma2 ) ,-1 );
Sell = Ref ( Cross ( ma2,ma1) ,-1 );
測試結果變成BUY之後一天的Close, SELL之後一天的Close.

若改為情況3:
ma1=(Close,10);
ma2=(Close,20);
Buy = Ref ( Cross ( ma1,ma2 ) ,-1 );
BuyPrice = Ref ( L,-1 );
Sell = Ref ( Cross ( ma2,ma1) ,-1 );
SellPrice = Ref ( H,-1 );
測試結果則變成BUY即日的低, SELL即日的高.

因用歷史數據回測, 當然知道即日的高/低/收, 及後一天的Close.
如果用即時一日數據的話, 當日其間便Cross了, 那麼情況是如何? 又怎會知道即日的高/低/收, 及後一天的Close?

請問各位以上那種程式才是正確用於即時一日數據的呢?

懇求賜教!:-)

allen0925 發表於 10-9-8 11:22

你好!我也是剛轉進Amibroker的使用者...

首先你的

ma1 = ( Close, 10 );
ma2 = ( Close, 20 );

會產生程式錯誤的狀況 不過依你的變數的命名 我猜測應該是用ma10跟ma20 2條線做測試
也就是程式會變成

ma1 = ma( Close, 10 );
ma2 = ma( Close, 20 );

================================================================

1. 來談談下面的公式
ma1 = ma( Close, 10 );
ma2 = ma( Close, 20 );
Buy = Cross ( ma1, ma2 );
Sell = Cross ( ma2, ma1 );
這個公式在歷史資料測試沒有問題的 因為交叉的那根k棒收盤價已確定不會再改變
所以用產生交叉的收盤價做買進 回測的成果也算正確

2.
但是 這個公式用在即時盤上頭卻產生訊號一會出現一會消失也就是一會交叉一會又不交叉的狀況
原因是目前跳動的價位是被放在收盤價上 而要確定是否有交叉還是要等到這根收完 才能判定
也就是當下一根開出來的同時也就確認這根的收盤價確定不會再改變 那交叉的狀態也就確定

所以我們在交叉狀況一根k棒開出來時判斷 這個交差叉狀太是否產生 才能讓訊號不會消失
公式也變成
ma1 = Ref( ma( Close, 10 ), -1 ); //上一根k棒的ma10值
ma2 = Ref( ma( Close, 20 ), -1 );
Buy = Cross ( ma1, ma2 );
Sell = Cross ( ma2, ma1 );

3.再來就是買賣點的問題
依1. 的公式它的買賣價是當根k棒收盤價
而2. 的公式是要在下根k棒開出來才能做出交叉與否的判定

所以最好的辦法就是 用下根k棒的開盤價做進出點
這樣1.的公式用當根k棒的收盤價也改下根的開盤價做進出 點位上也很接近
即時盤也不再出現訊號消失的問題

公式就變成
ma1 = Ref( ma( Close, 10 ), -1 ); //上一根k棒的ma10值
ma2 = Ref( ma( Close, 20 ), -1 );
BuyPrice = Open;
SellPrice = Open;
Buy = Cross ( ma1, ma2 );
Sell = Cross ( ma2, ma1 );

ps:因為我接觸Amibroker時間很短,我的意見不是絕對好的 因為我沒看到AB有 next bar at market 的用法要是有更正統的寫法 也請各位有看文的大大不吝賜教 謝謝!!
頁: [1]
查看完整版本: 歷史數據回測及真實即時一日數據之結果