littlewind 發表於 13-2-4 18:19

[新手]想詢問顯示"目前口數"和幾個問題

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的語言不太友善....@@)

kilroy 發表於 13-2-6 02:13

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);


參考看看了

littlewind 發表於 13-2-11 23:42

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不知道為什麼到最後一定是變成負數....
希望有大大可教我怎麼計算現在的部位...感謝

kilroy 發表於 13-2-12 00:21

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:}

kilroy 發表於 13-2-12 09:21

*
如果是單純圖表上的顯示以及計算加碼口數的部分

小弟這邊提供一個簡單的範例好了~

---
基本單進場條件為收盤同時站上兩條均線

加碼單進場條件為基本單進場後之短均線向上 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。這樣訊號才不會跳動。

littlewind 發表於 13-2-12 11:11

Kilroy大大的解釋太棒了,
尤其是這個程式碼的範例,這樣我就完全明白了
原來多組"策略"同時進行在AmiBroker進行會干擾
所以基本回測時應該要只有單一組多空策略回測,否則就要使用Custom backtest

不過我覺得很有疑惑的是既然AmiBroker有SetPositionSize的函數
那為什麼會不給user去使用這函數直接偵測在場上的部位呢...
不過我也有寫mail去問AmiBroker.SUPPORT 他也有提到Custom Backtest...
看來需要更多的研究...也謝謝Kilroy大大的解釋

kilroy 發表於 13-2-12 11:46

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:34

本帖最後由 stock009 於 13-2-24 01:38 編輯

>>A 為基本單,B 和 C 為加碼單
>>*C 會進場的前提是 B 已經進場,而 B 會進場的前提是 A 已經進場

>>但如果是要跑 AB 的 automatic analyisis 的話
>>那加碼的部位要與策略上相同,會有技術上的困難 (比如說 custom backtest)
>>寫的難度就會很高了

請問如果在excel上面要回測很多部位不就很困難
要 基本單+ 加碼單B + 加碼單C+ ... + 加碼單N+...
假如一個波段有10次加碼算完後
還要加上其他波段的

那不就要花超多時間
沒有其他方法了??

還是說加減碼在回測中沒有那麼重要?
因為會賺錢的波段,不論中間有沒有多加幾碼,還是賺
同樣的賠錢的,還是賠

usana642 發表於 13-2-24 21:47

非常感謝Kilroy大大的熱心分享,受益良多,謝謝…

littlewind 發表於 13-2-25 11:10

本帖最後由 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   }

------------------------------------------------------------------------------------------------------------------
不過因為有點複雜所以還是還沒完全搞懂...
所以大家在真的自動下單時都是單一策略在執行嗎?(不然多策略就一定會亂掉的)
還是說大家都很會用進階模式了呢?@@



kilroy 發表於 13-2-25 12:56

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]
查看完整版本: [新手]想詢問顯示"目前口數"和幾個問題