可否每根K棒單獨設定ositionSize
假設有10根k棒,第0、1、2根產生買進訊號,單獨對這三根k棒設定positionsize參數為0%、10%、20%可用資金做投資,這樣一來我應該預期輸出交易應該有3筆交易,但是AB的backtest結果無任何成交,為何會這樣呢?buy = 0;
buy = 1;
buy = 1;
buy = 1;
positionsize = 0;
positionsize = -10;
positionsize = -20;
sell = 0; 這應該要用到Custom Backtester
Custom Backtester才是AB強大的地方
可是不是那麼容易
我隨便寫寫的 不一定會動
你參考看看
SetCustomBacktestProc("");
SetTradeDelays(0, 0, 0, 0);
// Money Management
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.PreProcess();
for (bar = 0; bar < BarCount; bar++) {
CurrentEquity = bo.Equity;
for (sig = bo.GetFirstSignal(bar); sig; sig = bo.GetNextSignal(bar)) {
SetForeign(sig.Symbol);
if (bar == 2) {
sig.PosSize = CurrentEquity * 0.2;
}
RestorePriceArrays();
}
bo.ProcessTradeSignals(bar);
}
bo.PostProcess();
}
Buy = ..........; 推推!
好文! {:4_120:} 本帖最後由 michael-knight 於 09-11-9 09:45 AM 編輯
非常感謝ezbentley大大的解惑
花點時間把AB回測執行框架說明一下,像蓋房子一樣,基礎要打好。跑回測寫回測若能對內部發生的故事情節有所了解,一切都會變得簡單許多,有助於判斷執行結果合理與否,客制化回測更讓使用者不會只把回測器當黑盒子來用。底下是AB文件backteste簡略的重點整理
1.使用預設回測:使用者無法變更其回測執行框架
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
指定交易信號/buy/sell/short/cover
}
2.使用客制化回測,高階層
SetCustomBacktestProc("");//進入2-pass的客制化回測
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
//pass1指定交易信號/buy/sell/short/cover
}
else
if (status("action")==actionPortfolio){
// pass2客制化回測
bo = GetBacktesterObject();
bo.backtest(false);
}
3.使用客制化回測,中階層客制化框架實際就是把backtest()進一步拆解preprocess()/postprocess()/ProcessTradeSignals(bar)
SetCustomBacktestProc("");//進入2-pass的客制化回測
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
//pass1指定交易信號/buy/sell/short/cover
}
else
if (status("action")==actionPortfolio){
// pass2客制化回測
bo = GetBacktesterObject();
preprocess();
for (bar =0; bar < barcount; bar++) {
for( sig = bo.GetFirstSignal(); sig; sig = bo.GetNextSignal() )
{
//使用者可以在這裡變更sig物件的成員變數
}
ProcessTradeSignals(bar);
}
postprocess();
}
4.使用客制化回測,低層客制化框架進一步把ProcessTradeSignals(bar)拆解成EnterTrade()/ExitTrade()/ScaleTrade()/UpdateStats()/HandleStops()
SetCustomBacktestProc("");//進入2-pass的客制化回測
SetBacktestMode(mode);//mode代換成六種內部定義的交易信號處理方式
if (status("action")==actionBacktest) {
//pass1指定交易信號/buy/sell/short/cover
}
else
if (status("action")==actionPortfolio){
// pass2客制化回測
bo = GetBacktesterObject();
preprocess();
for (bar =0; bar < barcount; bar++) {
for( sig = bo.GetFirstSignal(); sig; sig = bo.GetNextSignal() )
{
//使用者可以在這裡變更signal物件的成員變數,直接以EnterTrade()/ExitTrade()操作trade物件
}
//不管有沒有交易信號物件在這能用客制化新增進出場機制或條件EnterTrade()/ExitTrade()
//trade物件分別放在已開倉或平倉兩個spool,可透過bo成員函式操作它
}
postprocess();
} 回復 5# michael-knight
謝謝分享!好專業啊!幫忙推一下。 Michael 才是真正高手啊
我都看不懂了{:4_144:} 原作者都看不懂,那我們不就......{:9_606:} 只能幫忙推文。
希望能有更多熟悉AB的人來討論。
頁:
[1]