COCO研究院

 找回密碼
 註冊
搜索
查看: 6559|回復: 25

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

[複製鏈接]
發表於 16-1-22 17:04 | 顯示全部樓層 |閱讀模式
本帖最後由 yanhai257 於 16-1-22 17:11 編輯

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

请问这样的code要怎么写,希望能得到指点,谢谢!
忘了说一句,只做backtest用。
發表於 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 真的太神奇了




回復 支持 1 反對 0

使用道具 舉報

 樓主| 發表於 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 = ... //你自己设定的排序方式

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

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

評分

參與人數 1金錢 +2 收起 理由
lwhuang + 2 太強了新手就會custombacktest

查看全部評分

回復 支持 1 反對 0

使用道具 舉報

 樓主| 發表於 16-1-23 23:43 | 顯示全部樓層
好像要调用custom backtest,越来越发现AB backtest的功能如此强大,学习ing...
發表於 16-1-26 12:02 | 顯示全部樓層
  1. SetPositionSize( 1, spsShares );
複製代碼


 樓主| 發表於 16-1-26 22:19 | 顯示全部樓層
首先谢谢你的回复!
你可能只看了标题,没有看我帖子的内容。我不是要买 1 share,而是 1 open position,但max open position可能是10也可能是20,但不是1(这不是重点),重点是每次建仓我只建 1 open position,但是这个position的shares会根据positionSize来确定。
發表於 16-1-26 22:59 | 顯示全部樓層
本帖最後由 keymaker 於 16-1-26 23:29 編輯

要不要把相關的碼貼出來..大家一起改一改 (看您已經說到這麼深入了..或許有碼可貼)
發表於 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碼,對嗎?

 樓主| 發表於 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。

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

你要做的是設定 sigScaleIn 的條件

 樓主| 發表於 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,但还没有测试。等我测试成功了,我一定会把相应的代码贴上来和大家分享。


如果有高手已经知道这个问题的解决方法,希望能指点一二,谢谢!
 樓主| 發表於 16-1-27 10:09 | 顯示全部樓層
lwhuang 發表於 16-1-27 09:33
你要做的是設定 sigScaleIn 的條件

不好意思,我不太明白你的意思。sigScaleIn不是只能对某一个open position进行加码吗?它能对整个投资组合里的股票,来增加open position的数量吗?(不知道你是否明白我的意思)
發表於 16-1-27 10:57 | 顯示全部樓層
我懂了,你是要不同的股票?1st position 買ABC股,2nd position買的是DEFG股?
如果是這樣的話就不是 sigScaleIn
 樓主| 發表於 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,直至满仓。
發表於 16-1-27 19:51 | 顯示全部樓層
你先把官方回覆貼上吧
 樓主| 發表於 16-1-28 00:03 | 顯示全部樓層
lwhuang 發表於 16-1-27 19:51
你先把官方回覆貼上吧

不能发链接,见截图。
amibroker.PNG
發表於 16-1-31 15:29 | 顯示全部樓層
回信內容是希望您先付費..然後才會給準確的線索..

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

如果您不怕寫簡單英文信問答的話..購買 AmiBroker 技術支援很划算的 (個人認為)..
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-11-22 11:31

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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