COCO研究院

 找回密碼
 註冊
搜索
查看: 3804|回復: 10

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

[複製鏈接]
發表於 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的語言不太友善....@@)
發表於 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);


參考看看了
 樓主| 發表於 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不知道為什麼到最後一定是變成負數....
希望有大大可教我怎麼計算現在的部位...感謝
發表於 13-2-12 00:21 | 顯示全部樓層
littlewind 發表於 13-2-11 23:42
Kilory大大的意思我研究了許久還是想不太明白,
所謂的多策略的意思是指要開多個afl檔來寫嗎?
例如有兩個多 ...

*
  Hi,

  如果你只是單純要輸出 "目前部位" 比如說像是文字檔,或是顯示在圖表上的話

  那很簡單

---
  但如果是要跑 AB 的 automatic analyisis 的話

  那加碼的部位要與策略上相同,會有技術上的困難 (比如說 custom backtest)

  寫的難度就會很高了

---
  所以建議如果是要在 AB 寫加碼的話

  你可以把他們拆成不同個體(獨立出來)

  再分別回測分析

---
  可是如果只是要在圖表顯示,或是輸出倉位文字檔

  簡單的方法就是

   buy = 買進條件
   short = 賣出條件

   buy1 = 加碼多單調件
   short1 = 加碼空單條件
    .
    .
    .

   其他取得倉位方式就跟原本的一樣

   只是把它們加起來而已

---
   而回測也可以輸出 csv 檔來做分析~

參考看看了
發表於 13-2-12 09:21 | 顯示全部樓層
*
  如果是單純圖表上的顯示以及計算加碼口數的部分

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

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

  加碼單進場條件為基本單進場後之短均線向上 100點進場

  空單反之亦然

---
  圖中 ① 為基本單進場 ② 為加碼單
    example.png

  *右下角顯示目前倉位
---
  範例程式 for 30min

  1. _SECTION_BEGIN("Background_Setting");
  2. SetChartBkColor(1);
  3. SetChartOptions(2,chartShowArrows|chartShowDates|chartWrapTitle);
  4. SetChartBkGradientFill(1, 1, 1);
  5. GraphXSpace = Param("Zoom/In Out",100,-50,150,1);
  6. _SECTION_END();

  7. _SECTION_BEGIN("Backtest Setting");
  8. SetPositionSize(1, spsShares);
  9. SetOption("InitialEquity", 1000000);
  10. SetOption("CommissionMode", 3);
  11. SetOption("CommissionAmount", 1000);
  12. RoundLotSize = 1;
  13. PointValue = 200;
  14. _SECTION_END();

  15. _SECTION_BEGIN("Trading Rules");
  16. barcomplete = BarIndex() < LastValue(BarIndex());
  17. Length1 = 30;
  18. Length2 = 300;

  19. Mae1 = AMA( C, 2 / (length1 + 1 ) );
  20. Mae2 = AMA( C, 2 / (length2 + 1 ) );

  21. Plot(Mae1, "", 7, 1);
  22. Plot(Mae2, "", 6, 1);

  23. Buy = C>MAe1 AND C>MAe2 AND barcomplete;
  24. Short = C<MAe1 AND C<MAe2 AND barcomplete;

  25. BuyPrice = CoverPrice = C;
  26. ShortPrice = SellPrice = C;

  27. Buy = Cover = ExRem(Buy, Short);
  28. Short = Sell = ExRem(Short, Buy);

  29. P1 = IIf(Buy, 1, IIf(Short, -1, 0));
  30. P1 = ValueWhen(P1!=0, P1, 1);

  31. SEntry = ValueWhen(Buy OR Short, MAe1, 1);

  32. addBuy = C>SEntry+100;
  33. addShort = C<SEntry-100;

  34. addBuy =  ExRem(addBuy , Short);
  35. addShort = ExRem(addShort , addBuy );

  36. P2 = IIf(addBuy , 1, IIf(addShort , -1, 0));
  37. P2 = ValueWhen(P2!=0, P2, 1);

  38. CP =
  39. IIf(Buy AND Ref(P1+P2, -1) == -2, 1,
  40. IIf(Short AND Ref(P1+P2, -1) == 2, -1,
  41. IIf(Short AND Ref(P1, -1) == 1, -1,
  42. IIf(Buy AND Ref(P1, -1) == -1, 1,
  43. IIf(addBuy AND P1 == P2, 2,
  44. IIf(addShort AND P1 == P2, -2, 0))))));

  45. CurrentPosition = ValueWhen(CP !=0, CP, 1);
  46. _SECTION_END();

  47. _SECTION_BEGIN("Charts");
  48. SetBarFillColor(IIf(O>C,19,24));
  49. PlotOHLC(O,H,L,C,"",IIf(O>C,34,32),64+4096);
  50. PlotShapes(IIf(Buy, shapeDigit1, shapeNone), 9, 0, WMA(O,10)-2*ATR(15), 6);  
  51. PlotShapes(IIf(Short, shapeDigit1, shapeNone), 10, 0, WMA(O,10)+2*ATR(15), 0);
  52. PlotShapes(IIf(addBuy , shapeDigit2, shapeNone), 9, 0, WMA(O,10)-2*ATR(15), 6);  
  53. PlotShapes(IIf(addShort , shapeDigit2, shapeNone), 10, 0, WMA(O,10)+2*ATR(15), 0);
  54. _SECTION_END();

  55. _SECTION_BEGIN("Position");
  56. GfxSelectFont("Tahoma", Status("pxheight")/7*0.5 );
  57. GfxSetTextAlign( 6 );
  58. GfxSetBkMode(0);
  59. GfxSelectFont("Tahoma", Status("pxheight")/7*0.2 );
  60. GfxSetTextColor( 3 );
  61. GfxTextOut( "  Position: "+CurrentPosition, Status("pxwidth")/1.35, Status("pxheight")/(55*0.02));
  62. _SECTION_END();
複製代碼

---
不過如果是跑 AB 裡的 automatic analyisis

只能跑 buy 和 short 這一組(基本單)進場的回測

如果也要回測加碼單的部分,建議還是分開來寫會比較恰當囉

在 AB 裡是頗麻煩的

參考看看了


補充內容 (13-2-12 11:53):
對了,範例中 C>MAe1+100 這裡,如果要自動下單,請改為H>MAe1+100,另一個為L<MAe1-100。這樣訊號才不會跳動。

評分

參與人數 2金錢 +4 收起 理由
陳小花 + 2 太強了
littlewind + 2

查看全部評分

 樓主| 發表於 13-2-12 11:11 | 顯示全部樓層
Kilroy大大的解釋太棒了,
尤其是這個程式碼的範例,這樣我就完全明白了
原來多組"策略"同時進行在AmiBroker進行會干擾
所以基本回測時應該要只有單一組多空策略回測,否則就要使用Custom backtest

不過我覺得很有疑惑的是既然AmiBroker有SetPositionSize的函數
那為什麼會不給user去使用這函數直接偵測在場上的部位呢...
不過我也有寫mail去問AmiBroker.SUPPORT 他也有提到Custom Backtest...
看來需要更多的研究...也謝謝Kilroy大大的解釋
發表於 13-2-12 11:46 | 顯示全部樓層
littlewind 發表於 13-2-12 11:11
Kilroy大大的解釋太棒了,
尤其是這個程式碼的範例,這樣我就完全明白了
原來多組"策略"同時進行在AmiBroker ...

*
  AB 裡的 setpositionsize 可以用

  不過... 只限於一組 buy and short 用

  所以我會把 setpositionsize 用在部位調整的地方


  不會用再加碼
---

  有幫助到就好~
  如果有大大有寫出其他方式也希望能分享囉
發表於 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次加碼算完後
還要加上其他波段的

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

還是說加減碼在回測中沒有那麼重要?
因為會賺錢的波段,不論中間有沒有多加幾碼,還是賺
同樣的賠錢的,還是賠
發表於 13-2-24 21:47 | 顯示全部樓層
非常感謝Kilroy大大的熱心分享,受益良多,謝謝…
 樓主| 發表於 13-2-25 11:10 | 顯示全部樓層
本帖最後由 littlewind 於 13-2-25 11:11 編輯
stock009 發表於 13-2-24 01:34
>>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     }

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



發表於 13-2-25 12:56 | 顯示全部樓層
littlewind 發表於 13-2-25 11:10
Stock009大大倒也是問了我心中的疑問...
這幾週研究了Custom-backtest,發現似乎可以計算出部位
---------- ...

*  AB 麻煩是麻煩在回測

  不然如果只是要取得倉位,上次提到的方式就可以得到倉位了

---
  可是如果是想要像 MC 那樣的 portfolio backtest

  AB 不容易辦到,要搞一堆 custom backtest (講真的,這個我也不太會)

  不過因為用不到,也不想去花時間精通它 XD

---
  原因很簡單,你用文字檔的方式輸出倉位給下單機就可以了

  加碼模組和基本單的策略可以分開測

  送文字倉位的可以寫在一起

---
  我覺得你要不要考慮

  以單一策略(不調參數不改週期)跑各個市場能有相同結果為方向來建立你的交易策略

  當然,如果你喜歡當教練,牛棚裡有一堆在熱身的投手任你調度

  那你可能就要搞懂 custome backtest 或是改用 MC 了  XD

---
  不然,AB裡的 portfoilo backtest 通常是一個策略跑多個 symbol 哩~~

  參考看看啦~
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-11-23 09:15

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |