yanhai257 發表於 16-1-22 17:04

每次根据buy规则只买一只股票,请问code怎么写?

本帖最後由 yanhai257 於 16-1-22 17:11 編輯

SetOption("MaxOpenPositions", number)可以设置最大持仓。但每次触发buy信号的时候,amibroker会根据资金量买入最大仓位。我想根据我自己的条件设置,每次只增加一个仓位。例如,
触发buy信号时,我建立第一个仓位。如果该仓位亏损10%,退出,再根据buy规则建仓;如果该仓位盈利10%的时候,再根据buy规则建立第二个仓位,以此类推。

请问这样的code要怎么写,希望能得到指点,谢谢!
忘了说一句,只做backtest用。

keymaker 發表於 16-2-2 19:09

本帖最後由 keymaker 於 16-2-2 19:12 編輯

yanhai257 發表於 16-2-2 18:53
professional edition 64bit version6.00.2
了解..小提醒..加入 AmiBroker 要有心理準備.. 比較起來 ..

AmiBroker 服務是工程師性格..有話直說 (不會 "很客氣") .. 不過真的非常專業 ..( I like it)

Multicharts 服務是銷售員性格..會轉彎 (基本上 "比較客氣") .. 但是 .. (oh my god)

還有..看您的學習與英文能力..多數人..會有一段時間可能雞同鴨講 ..
但學會之後 .. 會覺得 AmiBroker 真的太神奇了




yanhai257 發表於 16-2-2 09:52

代码我已经想出来了,如下:
SetCustomBacktestProc("");
if(Status("action") == actionPortfolio)
{
   bo = GetBacktesterObject();
   bo.PreProcess();         
   for (i= 0; i < BarCount; i++)
   {
      MinPctProfit = 100; //open position中某个position的最小浮盈,初始值
      HaveOpenPos = 0; //是否持有position,初始值
      for (trade = bo.GetFirstOpenPos(); trade; trade = bo.GetNextOpenPos())
      {
         MinPctProfit = Min(trade.GetPercentProfit, MinPctProfit);//求最小浮盈
         HaveOpenPos = Max(trade.GetEntryValue, HaveOpenPos);//求某个position的最大成本值,以此判断是否持有position。本来打算用bo.GetOpenPosQty()来判断持仓情况的,但发现好像不行
      }
                  
      MaxPosScore = 0;//取所有buy signal的positionScore中的最大值,初始值                     
      for (sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i))
      {                                                      
         MaxPosScore = Max(sig.PosScore, MaxPosScore);//求positionScore的最大值                                                      
      }
         
      for (sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i))
      {                                       
         if (sig.PosScore == MaxPosScore)//只买入positionScore最大的那一只股票
         {         
            if (HaveOpenPos > 0 AND MinPctProfit >= 10)         
               sig.PosSize = -10;//如果持仓,且所有仓位中浮盈最少的股票>=10%,则买入                                             
            if (HaveOpenPos == 0)
               sig.PosSize = -10;//如果没有持仓,买入      
         }                  
      }   
      bo.ProcessTradeSignals(i);      
   }
   bo.PostProcess();
}

PositionSize = 0; //对所有的position的数量大小设置为0,只有满足以上条件的,才有买入动作
PositionScore = ... //你自己设定的排序方式

//以下是你的主代码部分...

以上已经测试过了,符合我的要求。

yanhai257 發表於 16-1-23 23:43

好像要调用custom backtest,越来越发现AB backtest的功能如此强大,学习ing...

lwhuang 發表於 16-1-26 12:02

SetPositionSize( 1, spsShares );

yanhai257 發表於 16-1-26 22:19

lwhuang 發表於 16-1-26 12:02
首先谢谢你的回复!
你可能只看了标题,没有看我帖子的内容。我不是要买 1 share,而是 1 open position,但max open position可能是10也可能是20,但不是1(这不是重点),重点是每次建仓我只建 1 open position,但是这个position的shares会根据positionSize来确定。

keymaker 發表於 16-1-26 22:59

本帖最後由 keymaker 於 16-1-26 23:29 編輯

要不要把相關的碼貼出來..大家一起改一改 (看您已經說到這麼深入了..或許有碼可貼)

lwhuang 發表於 16-1-27 08:46

本帖最後由 lwhuang 於 16-1-27 08:49 編輯

yanhai257 發表於 16-1-26 22:19
首先谢谢你的回复!
你可能只看了标题,没有看我帖子的内容。我不是要买 1 share,而是 1 open position, ...
如果你是要一路加碼上去,我的回覆還是這樣,後面用sigScaleIn加碼指令

1 open position代表的是第一碼單(不一定是1 share),後面有第2碼第3碼,對嗎?

yanhai257 發表於 16-1-27 09:27

lwhuang 發表於 16-1-27 08:46
如果你是要一路加碼上去,我的回覆還是這樣,後面用sigScaleIn加碼指令

1 open position代表的是第一碼單 ...

如果是针对某1个头寸(或者按照AB的说法,1个open position)一路加码,sigScaleIn可以满足要求。
但我的要求不是这样,而是对open position依次递增。即在空仓的情况下,buy signal发生时,建立第一个open position,这个position的shares会根据positionSize的设定买入相应的shares;然后在第一个open position盈利10%的情况下,才会在buy signal出现时建立第2个open position。而第一个open position的盈利未到达10%时,系统会忽略所有的buy signal。

lwhuang 發表於 16-1-27 09:33

yanhai257 發表於 16-1-27 09:27
如果是针对某1个头寸(或者按照AB的说法,1个open position)一路加码,sigScaleIn可以满足要求。
但我的 ...

你要做的是設定 sigScaleIn 的條件

yanhai257 發表於 16-1-27 10:02

keymaker 發表於 16-1-26 22:59
要不要把相關的碼貼出來..大家一起改一改 (看您已經說到這麼深入了..或許有碼可貼) ...

我最近一直在想如何写这个代码,也写信到amibroker问了他们,他们的回复是,需要用custom backtest来解决这个问题,但具体怎么做,他们没说,只发了一些链接让我自己看。我现在还一直在学习和调试,相关的代码还真没有合适的。
现阶段困扰我的是,在开新仓的条件不满足的情况下,应该用object的哪一个property来忽略buy signal。我开始以为用Signal object下的PosScore=0来设定,但发现这种情况不奏效;然后又用Trade object下的IsOpen=false来设定,但发现这个property只可读而不可写。我现在想到一点,是否可以用Signal object下的PosSize=0来忽略buy signal,但还没有测试。等我测试成功了,我一定会把相应的代码贴上来和大家分享。


如果有高手已经知道这个问题的解决方法,希望能指点一二,谢谢!

yanhai257 發表於 16-1-27 10:09

lwhuang 發表於 16-1-27 09:33
你要做的是設定 sigScaleIn 的條件

不好意思,我不太明白你的意思。sigScaleIn不是只能对某一个open position进行加码吗?它能对整个投资组合里的股票,来增加open position的数量吗?(不知道你是否明白我的意思)

lwhuang 發表於 16-1-27 10:57

我懂了,你是要不同的股票?1st position 買ABC股,2nd position買的是DEFG股?
如果是這樣的話就不是 sigScaleIn

yanhai257 發表於 16-1-27 11:31

lwhuang 發表於 16-1-27 10:57
我懂了,你是要不同的股票?1st position 買ABC股,2nd position買的是DEFG股?
如果是這樣的話就不是 sigS ...

是的,借你的例子,我的投资组合里有ABCDEFG这些股票,1st position我买入这些股票中positionScore最高的一只,比如是A,然后2nd position再买入其中positionScore最高的一只,比如是F,直至满仓。

lwhuang 發表於 16-1-27 19:51

你先把官方回覆貼上吧

yanhai257 發表於 16-1-28 00:03

lwhuang 發表於 16-1-27 19:51
你先把官方回覆貼上吧

不能发链接,见截图。

keymaker 發表於 16-1-31 15:29

回信內容是希望您先付費..然後才會給準確的線索..

您要的功能用 custom backtester 做也可以..但是進入障礙會提高 (有幾十頁原文資料)

如果您不怕寫簡單英文信問答的話..購買 AmiBroker 技術支援很划算的 (個人認為)..
頁: [1] 2
查看完整版本: 每次根据buy规则只买一只股票,请问code怎么写?