ashell 發表於 11-8-27 00:13

請問AB如何才能處理多倉位

小弟之前有用AB來做自動交易,
但當時都只下一口單,後來因績效不佳就停掉了,
心灰意冷之餘也停止交易一陣子,
不過最近有個想法,想說如果可以同時交易多口,
也就是部位可以伸縮的話,也許會比較有勝算。

但部位如何處理是一個問題,
小弟想達到的目標是如果滿足某條件,譬如均線金叉,
則進一口,並紀錄進場價位,供停損用或停利用
若再滿足某條件,例如進場後又漲了100點,則進第二口(順勢加碼),
並紀錄進場價位,供停損用或停利用,以此類推,若一直擴張到幾十口,
甚至更多(如果用其它的進場條件時),
那麼該如何分別的紀錄這些倉位的進場價位,
才能針對每個個別的一口做停損或停利的動作?

不知各位大大有沒有什麼想法,如果有的話,還請告知,小弟在此先謝過各位大大。

GnuHomot 發表於 11-8-27 06:09

http://www.amibroker.com/guide/afl/afl_view.php?id=272
這裡有分批出場的範例
不過要注意的是在Amibroker中,backtest跟實際下單是兩回事XD

我也還在研究加碼的問題,之後有進度會上來報告的。

GnuHomot 發表於 11-8-27 06:15

順帶一提
據我所知看別人測試的結果,所有加碼的動作都有可能讓該策略的勝率下降,但是對某些策略來說是有可能提高期望值。

所以我也看過有某些說法是不要分批加碼,而是一次下。

試想一個問題,如果你加碼的點是勝率比較高的點,那麼為什麼不等到這個點的訊號出現再壓大注呢?

這個問題我也還沒想到答案,供參考。

ashell 發表於 11-8-27 09:37

回復 2# GnuHomot


    謝謝你的回應,能夠用來回測至少就可以比較快的知道績效如何,
有沒有繼續發展的必要,至於實際下單的寫法,等到績效可以接受再來煩惱吧。

如果你加碼的點是勝率比較高的點,那麼為什麼不等到這個點的訊號出現再壓大注呢?
這個問題我沒想過,但你說的壓大注也是可行的,譬如第一口是試單,之後行情往預期的方向走,
這時再下大注,這樣也符合該點的訊號出現再壓大注的條件。

ashell 發表於 11-8-27 18:58

回復 5# joey0415

joey大,謝謝回覆,這個方法看起來好像是用來同時執行兩個不同的策略,
而不是只用一策略,能夠在加碼時分別紀錄每一筆的進場價。

GnuHomot 發表於 11-8-27 20:44

其實把加碼想成是兩個策略(或以上)同時運作也未嚐不可啊

ashell 發表於 11-8-27 23:04

這樣也是一個解決的方法,
不過好像只能做少數幾口,
畢竟不太可能把一個chart分成很多個圖,
這樣就很難看清楚了。

GnuHomot 發表於 11-8-31 22:49

不佔用版面,就直接回在這篇討論串了。
實際試了發現其實也不難做到
利用sigScaleIn跟sigScaleOut做加減碼

我測試的策略很簡單
收盤高於30MA買進
收盤低於30MA賣出

持倉時間在第四天收盤加碼一口



實做出來的圖大概會像這樣,進場和加碼的點位如圖。

這是單純一口進出的回測結果



可以看到紅色圈起來是7034買進1 share

而這是有加碼機制的回測結果


可以看到紅色圈起來的是7467 買進 2 share
7467是這兩口進場的平均價

GnuHomot 發表於 11-8-31 22:51

記得在Settings => Initial equity要設足夠的金額才可以加碼第二口
SetPositionSize(1, spsShares);
Buy=Sell=Short=Cover=0;

//here is original strategy
Length=30;
MAValue=MA(C,Length);
for(i=1; i<BarCount; i++)
{
if(C<MAValue AND C>MAValue)
Buy=Cover=1;

if(C>MAValue AND C<MAValue)
Short=Sell=1;

}


//here is Position Scale In
Buyindex=0;
Shortindex=0;

for(i=0; i<BarCount; i++)
{
if(Buy>0)
{
Buyindex=i;
Shortindex=0;
}

if(Buyindex>0 AND i-Buyindex>3)
{
Buy=sigScaleIn;
Buyindex=0;
}

if(Short>0)
{
Buyindex=0;
Shortindex=i;
}

if(Shortindex>0 AND i-Shortindex>3)
{
Short=sigScaleIn;
Shortindex=0;
}

}





PlotShapes(Buy * shapeSmallUpTriangle ,colorRed, 0,Low,-50);
//PlotShapes(Sell * shapeHollowSmallDownTriangle ,colorDarkRed, 0,High,-45);
PlotShapes(Short * shapeSmallDownTriangle ,colorGreen, 0,Low,-50);
//PlotShapes(Cover * shapeHollowSmallUpTriangle ,colorDarkGreen, 0,High,-45);


dist=1.5*ATR(10);
for( i = 1; i < BarCount; i++ )
{
if( Buy ) PlotText( "Buy\n@" + BuyPrice[ i-1 ], i, Low[ i ]-dist, colorRed );

if(NOT Short)
if( Sell ) PlotText( "Sell\n@" + SellPrice[ i-1 ], i, High[ i ]+dist, colorDarkRed );

if(NOT Buy)
if( Cover ) PlotText( "Cover\n@" + CoverPrice[ i-1 ], i, Low[ i ]-dist, colorDarkGreen );

if( Short ) PlotText( "Short\n@" + ShortPrice[ i-1 ], i, High[ i ]+dist, colorGreen );

}


_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

_SECTION_BEGIN("MA1");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1, 10 );
Plot( MA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") );
_SECTION_END();

GnuHomot 發表於 11-8-31 23:37

現在才看到這篇官方說明{:4_623:}
http://www.amibroker.com/guide/h_pyramid.html

ashell 發表於 11-9-1 23:53

Gnu大,謝謝您這麼詳盡的回覆,
雖然官方的guide已有說明,
但您舉的例子也很有參考價值,
因為是用很簡單的策略寫的,
所以能更容易的看懂,
小弟再來研究看看這些函式要怎麼用,謝謝。

GnuHomot 發表於 11-9-2 06:23

回復 12# ashell


呵,不用謝,因為是我自己本來就想做的。參考comewish大的這篇文
http://coco-in.net/thread-9899-1-1.html
我可以做類似的測試   
用1-2-3加碼實作的結果圖



不等比例的加碼測試還需要一點點小技巧,關鍵都在我上一篇回文裡面,就留給看倌們自己動一下腦了{:4_661:}

sunnyhu 發表於 11-9-4 09:42

一個很有用的問題.. 謝謝 !
頁: [1]
查看完整版本: 請問AB如何才能處理多倉位