1

我想在回测报告中添加一个额外的列来指示波动性。

这是我的代码。额外的列volatility_recent出现,但列中没有值出现。但是,如果我要使用注释行trade.AddCustomMetric( "proceeds", trade.Shares*trade.ExitPrice );,列中会出现一些数值。

代码有什么问题?

if ( Status( "action" ) == actionPortfolio )
{
    bo = GetBacktesterObject();
    // run default backtest procedure without generating the trade list
    bo.Backtest( True );

    volatility_recent = ATR(30);

    // iterate through closed trades
    for ( trade = bo.GetFirstTrade( ); trade; trade = bo.GetNextTrade( ) )
    {
        trade.AddCustomMetric( "volatility_recent", volatility_recent );
        //trade.AddCustomMetric( "proceeds", trade.Shares*trade.ExitPrice );
    }

    // iterate through open positions
    for ( trade = bo.GetFirstOpenPos( ); trade; trade = bo.GetNextOpenPos( ) )
    {       

        trade.AddCustomMetric( "volatility_recent", volatility_recent );
        //trade.AddCustomMetric( "proceeds", trade.Shares*trade.ExitPrice );
    }

    // generate trade list
    bo.ListTrades( );
}
4

2 回答 2

1

自定义指标需要是标量(数字),而不是数组。ATR(30)是一个数组。因此,使用LastValue获取数组的最后一个值或查找来获取指定柱的值。通过静态变量将 ATR 符号数组从回测的第一阶段传递到第二阶段。然后在自定义指标行中使用查找在特定日期时间(trade.EntryDateTimetrade.ExitDateTime)提取数组元素。

StaticVarSet( "CBT_ATR_" + Name(), ATR(30) );

if ( Status( "action" ) == actionPortfolio )
{
    bo = GetBacktesterObject();
    // run default backtest procedure without generating the trade list
    bo.Backtest( True );    

    // iterate through closed trades
    for ( trade = bo.GetFirstTrade( ); trade; trade = bo.GetNextTrade( ) )
    {
        trade.AddCustomMetric( "volatility_recent", Lookup( StaticVarGet( "CBT_ATR_" + trade.Symbol ), trade.ExitDateTime ) );
        //trade.AddCustomMetric( "proceeds", trade.Shares*trade.EntryPrice );
    }

    // iterate through open positions
    for ( trade = bo.GetFirstOpenPos( ); trade; trade = bo.GetNextOpenPos( ) )
    {       

        trade.AddCustomMetric( "volatility_recent", Lookup( StaticVarGet( "CBT_ATR_" + trade.Symbol ), Trade.ExitDateTime ) );
        //trade.AddCustomMetric( "proceeds", trade.Shares*trade.EntryPrice );
    }

    // generate trade list
    bo.ListTrades( );
}

编辑:功劳归于 fxshrat,他在https://forum.amibroker.com/t/unable-to-add-this-custom-metric-to-backtest-report/7153/2上发布了答案 他的答案发布在这里并且在没有参考的情况下发帖是不礼貌的。向 fxshrat 和 Tomasz 道歉。

于 2018-07-31T12:49:35.247 回答
1

我发现您在不提供参考的情况下逐行复制其他人的文本和代码解决方案真的很有趣。

您在 stackoverflow 上的第二篇文章是Tomasz 和我在 forum.amibroker.com上对您的回复的逐行副本

https://forum.amibroker.com/t/unable-to-add-this-custom-metric-to-backtest-report/7153

于 2018-10-28T11:15:43.963 回答