[新手]想詢問顯示"目前口數"和幾個問題
1.爬了好多文還是一直無法做出如何顯示目前口數的做法,我有參考了Kilroy大大的辦法-----------------------------------------------------------------------------------------------------Position = IIf(Buy, 1, IIf(Short, -1, 0));
CurrentPosition = ValueWhen(Position!=0, Position, 1);
IsCPNull = IsNull(CurrentPosition);
MarketPosition = IIf(IsCPNull!=1, IIf(CurrentPosition==1, 1, -1), 0);
-----------------------------------------------------------------------------------------------------
但是kilroy大大這個辦法如果要加碼到第二口的時候,並不會累加上去...最多就是1口和-1口
怎麼辦才可以變成會累加的呢?變成現在場上有1口,2口,3口
我自己的想法是
_curPosition = 0;
_curPosition = iif(buy, _curPosition = _curPosition+1 , _curPosition = _curPosition -1);
但是這樣的寫法就是每次起始部位都變成0,想了好久還是不知道怎麼做....
2.假設現在我已經有記算口數的話(假設現在場上有3口),我現在啟用APPLYSTOP有一口達到停損,
那顯示會自己變成2口嗎?(好像不會@@?)
3.關於Sell 和 Cover的不同在哪呢?我知道Sell是Buy的出場,而Cover是Short的出場...但是如果今天我是用Short來當做Buy的出場,對系統來說會有影響嗎?(因為amibroker系統沒顯示部位,所以似乎沒差?)
感謝高手替我解惑~
(之前雖然寫了一段時間的TS,但是還是覺得Amibroker的語言不太友善....@@)
Hi,
在 AB 裡要寫加碼策略的方式...
建議使用 "兩個(或多個)策略" 來做
因為 AB 會以 portfolio 的方式來回測
小弟舉例~
A 為基本單,B 和 C 為加碼單
*C 會進場的前提是 B 已經進場,而 B 會進場的前提是 A 已經進場
跟多策略比較不一樣的地方在於,必須基本單先進場才會有後續的加碼單
而多策略是以該策略多空倉位,與其他策略相互增減
---
若只是要單純在圖表上顯示 基本單 和 加碼單 的進場箭頭,這很簡單
但要做如此策略的回測,那必須要拆開來寫
這樣不知道大大能懂我的意思嗎
我再說明一下
每組都只有一個 buy, short, cover, sell
A 策略的 buy 和 short 各為基本單進場條件
B 策略的 buy 和 short 為基本單已經進場後的買賣條件
而 cover 和 sell 的條件與 A 相同
C 策略的 buy 和 short 為 B策略已經進場後的買賣條件
而 cover 和 sell 的條件與 A 相同
也就是 基本單 + 加碼一次 + 加碼兩次 -> 全數出場(翻單)
---
在 AB 裡要做到 "面進點出" 的確是比較麻煩的囉~~
有關於 sell 和 cover 的不同
除非有特別的出場方式
不然一個多空對翻的策略只需指定 buy 和 short 的條件
要在 AB 上回測的話,再加入下面兩行就可以了
Buy = Cover = ExRem(Buy, Short);
Short = Sell = ExRem(Short, Buy);
參考看看了
Kilory大大的意思我研究了許久還是想不太明白,
所謂的多策略的意思是指要開多個afl檔來寫嗎?
例如有兩個多單策略就是long_1.afl 和long_2.afl...是這樣的意思嗎?
因為我在同一個afl檔來寫的時候還是做不到依不同marketPosition來做下單,
搞到都快要放棄了...><
但是,如果是要分多個afl檔,又該怎麼計算現在手上有多少部位呢?
怎樣才可以算出現在有2口空單或是3口多單呢?實在搞不懂...@@
我目前的做法是
---------------------------------------------------------------
Buy = BuyPrice = Buy1 OR Buy2 OR Buy3 ;
//-----------------------------------------------------------------------------//
//evaluate Current BuyPosition
//------------------------------------------------------------------------------------//
BuySizeA = IIf ( Buy, 1 , 0 ); // 1 1
_LongSize = BuySizeA; // 1 1
Sell= BuyPrice - 100 AND _LongSize >=1;
for ( i=0 ; i< BarCount ; i++)
{
if ( ( Sell[ i ] == 1 ) AND ( _LongSize[ i ] >=1 ) )
{
BuySizeB = IIf (Sell , -1 ,0);
_LongSize = BuySizeA + BuySizeB ;
printf ("_LongSizeA+B="+_LongSize[ i ] +"\n");
}
}
Short1 = Cross(C , Ref( LLV (C, 100) , -1 ) ) AND MArketPosition <= 0;
Short = Short1;
ShortSizeA=IIf(Short,-1 , 0 ); //0
_SellSize = ShortSizeA; //0
Cover = Cross(C , MAe1 ) AND Cross( C , MAe2 ) AND barcomplete AND _SellSize <= -1; // clearing condition
for ( i=0 ; i< BarCount ; i++)
{
if ( ( Cover[ i ] == 1 )AND ( _SellSize[ i ] <= -1 ) )
{
ShortSizeB = IIf (Cover , 1 ,0);
_ShortSize = ShortSizeA + ShortSizeB ;
printf ("_ShortSizeA+B="+_ShortSize[ i ] +"\n");
}
}
MarketPosition = Cum ( _LongSize + _SellSize);
dist = 1.5*ATR(10);
for( i = 0; i < BarCount; i++ )
{
if( Buy ) PlotText( "BUY @" + C[ i ] +"\n MS @" + MArketPosition , i, L[ i ]-dist, colorGreen, colorWhite );
if( Sell ) PlotText( "SELL @" + C[ i ]+ "\n MS @" +MArketPosition , i, H[ i ]+dist, colorRed, colorYellow );
if( Short ) PlotText( "SHORT @" + C[ i ]+ "\n MS @" + MarketPosition , i, H[ i ]+dist+30, colorRed, colorYellow );
if( Cover ) PlotText( "COVER @" + C[ i ] + "\n MS @" + MarketPosition , i, L[ i ]-dist-30, colorGreen, colorWhite );
}
------------------------------------------------------------------------------
但是這樣子的做法完全沒有作用......
MarketPosition不知道為什麼到最後一定是變成負數....
希望有大大可教我怎麼計算現在的部位...感謝
littlewind 發表於 13-2-11 23:42 static/image/common/back.gif
Kilory大大的意思我研究了許久還是想不太明白,
所謂的多策略的意思是指要開多個afl檔來寫嗎?
例如有兩個多 ...
*
Hi,
如果你只是單純要輸出 "目前部位" 比如說像是文字檔,或是顯示在圖表上的話
那很簡單
---
但如果是要跑 AB 的 automatic analyisis 的話
那加碼的部位要與策略上相同,會有技術上的困難 (比如說 custom backtest)
寫的難度就會很高了
---
所以建議如果是要在 AB 寫加碼的話
你可以把他們拆成不同個體(獨立出來)
再分別回測分析
---
可是如果只是要在圖表顯示,或是輸出倉位文字檔
簡單的方法就是
buy = 買進條件
short = 賣出條件
buy1 = 加碼多單調件
short1 = 加碼空單條件
.
.
.
其他取得倉位方式就跟原本的一樣
只是把它們加起來而已
---
而回測也可以輸出 csv 檔來做分析~
參考看看了 {:4_132:}
*
如果是單純圖表上的顯示以及計算加碼口數的部分
小弟這邊提供一個簡單的範例好了~
---
基本單進場條件為收盤同時站上兩條均線
加碼單進場條件為基本單進場後之短均線向上 100點進場
空單反之亦然
---
圖中 ① 為基本單進場 ② 為加碼單
*右下角顯示目前倉位
---
範例程式 for 30min
_SECTION_BEGIN("Background_Setting");
SetChartBkColor(1);
SetChartOptions(2,chartShowArrows|chartShowDates|chartWrapTitle);
SetChartBkGradientFill(1, 1, 1);
GraphXSpace = Param("Zoom/In Out",100,-50,150,1);
_SECTION_END();
_SECTION_BEGIN("Backtest Setting");
SetPositionSize(1, spsShares);
SetOption("InitialEquity", 1000000);
SetOption("CommissionMode", 3);
SetOption("CommissionAmount", 1000);
RoundLotSize = 1;
PointValue = 200;
_SECTION_END();
_SECTION_BEGIN("Trading Rules");
barcomplete = BarIndex() < LastValue(BarIndex());
Length1 = 30;
Length2 = 300;
Mae1 = AMA( C, 2 / (length1 + 1 ) );
Mae2 = AMA( C, 2 / (length2 + 1 ) );
Plot(Mae1, "", 7, 1);
Plot(Mae2, "", 6, 1);
Buy = C>MAe1 AND C>MAe2 AND barcomplete;
Short = C<MAe1 AND C<MAe2 AND barcomplete;
BuyPrice = CoverPrice = C;
ShortPrice = SellPrice = C;
Buy = Cover = ExRem(Buy, Short);
Short = Sell = ExRem(Short, Buy);
P1 = IIf(Buy, 1, IIf(Short, -1, 0));
P1 = ValueWhen(P1!=0, P1, 1);
SEntry = ValueWhen(Buy OR Short, MAe1, 1);
addBuy = C>SEntry+100;
addShort = C<SEntry-100;
addBuy =ExRem(addBuy , Short);
addShort = ExRem(addShort , addBuy );
P2 = IIf(addBuy , 1, IIf(addShort , -1, 0));
P2 = ValueWhen(P2!=0, P2, 1);
CP =
IIf(Buy AND Ref(P1+P2, -1) == -2, 1,
IIf(Short AND Ref(P1+P2, -1) == 2, -1,
IIf(Short AND Ref(P1, -1) == 1, -1,
IIf(Buy AND Ref(P1, -1) == -1, 1,
IIf(addBuy AND P1 == P2, 2,
IIf(addShort AND P1 == P2, -2, 0))))));
CurrentPosition = ValueWhen(CP !=0, CP, 1);
_SECTION_END();
_SECTION_BEGIN("Charts");
SetBarFillColor(IIf(O>C,19,24));
PlotOHLC(O,H,L,C,"",IIf(O>C,34,32),64+4096);
PlotShapes(IIf(Buy, shapeDigit1, shapeNone), 9, 0, WMA(O,10)-2*ATR(15), 6);
PlotShapes(IIf(Short, shapeDigit1, shapeNone), 10, 0, WMA(O,10)+2*ATR(15), 0);
PlotShapes(IIf(addBuy , shapeDigit2, shapeNone), 9, 0, WMA(O,10)-2*ATR(15), 6);
PlotShapes(IIf(addShort , shapeDigit2, shapeNone), 10, 0, WMA(O,10)+2*ATR(15), 0);
_SECTION_END();
_SECTION_BEGIN("Position");
GfxSelectFont("Tahoma", Status("pxheight")/7*0.5 );
GfxSetTextAlign( 6 );
GfxSetBkMode(0);
GfxSelectFont("Tahoma", Status("pxheight")/7*0.2 );
GfxSetTextColor( 3 );
GfxTextOut( "Position: "+CurrentPosition, Status("pxwidth")/1.35, Status("pxheight")/(55*0.02));
_SECTION_END();
---
不過如果是跑 AB 裡的 automatic analyisis
只能跑 buy 和 short 這一組(基本單)進場的回測
如果也要回測加碼單的部分,建議還是分開來寫會比較恰當囉
在 AB 裡是頗麻煩的
參考看看了 {:4_132:}
補充內容 (13-2-12 11:53):
對了,範例中 C>MAe1+100 這裡,如果要自動下單,請改為H>MAe1+100,另一個為L<MAe1-100。這樣訊號才不會跳動。 Kilroy大大的解釋太棒了,
尤其是這個程式碼的範例,這樣我就完全明白了
原來多組"策略"同時進行在AmiBroker進行會干擾
所以基本回測時應該要只有單一組多空策略回測,否則就要使用Custom backtest
不過我覺得很有疑惑的是既然AmiBroker有SetPositionSize的函數
那為什麼會不給user去使用這函數直接偵測在場上的部位呢...
不過我也有寫mail去問AmiBroker.SUPPORT 他也有提到Custom Backtest...
看來需要更多的研究...也謝謝Kilroy大大的解釋 littlewind 發表於 13-2-12 11:11 static/image/common/back.gif
Kilroy大大的解釋太棒了,
尤其是這個程式碼的範例,這樣我就完全明白了
原來多組"策略"同時進行在AmiBroker ...
*
AB 裡的 setpositionsize 可以用
不過... 只限於一組 buy and short 用
所以我會把 setpositionsize 用在部位調整的地方
不會用再加碼
---
有幫助到就好~
如果有大大有寫出其他方式也希望能分享囉 {:4_132:}
本帖最後由 stock009 於 13-2-24 01:38 編輯
>>A 為基本單,B 和 C 為加碼單
>>*C 會進場的前提是 B 已經進場,而 B 會進場的前提是 A 已經進場
>>但如果是要跑 AB 的 automatic analyisis 的話
>>那加碼的部位要與策略上相同,會有技術上的困難 (比如說 custom backtest)
>>寫的難度就會很高了
請問如果在excel上面要回測很多部位不就很困難
要 基本單+ 加碼單B + 加碼單C+ ... + 加碼單N+...
假如一個波段有10次加碼算完後
還要加上其他波段的
那不就要花超多時間
沒有其他方法了??
還是說加減碼在回測中沒有那麼重要?
因為會賺錢的波段,不論中間有沒有多加幾碼,還是賺
同樣的賠錢的,還是賠
非常感謝Kilroy大大的熱心分享,受益良多,謝謝… 本帖最後由 littlewind 於 13-2-25 11:11 編輯
stock009 發表於 13-2-24 01:34 static/image/common/back.gif
>>A 為基本單,B 和 C 為加碼單
>>*C 會進場的前提是 B 已經進場,而 B 會進場的前提是 A 已經進場
Stock009大大倒也是問了我心中的疑問...
這幾週研究了Custom-backtest,發現似乎可以計算出部位
-----------------------------------------------------------------------------------------------------------------
好像是用這模板在計算
for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())
{ . . . . //Use Trade object here } for (trade = bo.GetFirstOpenPos(); trade; trade = bo.GetNextOpenPos())
{ . . . . //Use Trade object here }
------------------------------------------------------------------------------------------------------------------
不過因為有點複雜所以還是還沒完全搞懂...
所以大家在真的自動下單時都是單一策略在執行嗎?(不然多策略就一定會亂掉的)
還是說大家都很會用進階模式了呢?@@
littlewind 發表於 13-2-25 11:10 static/image/common/back.gif
Stock009大大倒也是問了我心中的疑問...
這幾週研究了Custom-backtest,發現似乎可以計算出部位
---------- ...
*AB 麻煩是麻煩在回測
不然如果只是要取得倉位,上次提到的方式就可以得到倉位了
---
可是如果是想要像 MC 那樣的 portfolio backtest
AB 不容易辦到,要搞一堆 custom backtest (講真的,這個我也不太會)
不過因為用不到,也不想去花時間精通它 XD
---
原因很簡單,你用文字檔的方式輸出倉位給下單機就可以了
加碼模組和基本單的策略可以分開測
送文字倉位的可以寫在一起
---
我覺得你要不要考慮
以單一策略(不調參數不改週期)跑各個市場能有相同結果為方向來建立你的交易策略
當然,如果你喜歡當教練,牛棚裡有一堆在熱身的投手任你調度
那你可能就要搞懂 custome backtest 或是改用 MC 了XD
---
不然,AB裡的 portfoilo backtest 通常是一個策略跑多個 symbol 哩~~
參考看看啦~
頁:
[1]