R语言构建MACD交易信号遇阻:信号未按MACD值生成求助
问题分析与解决
你的核心问题是自定义的macd_indicator函数只能处理单个数值,无法适配macd这种xts格式的时间序列向量。R中if语句要求条件是长度为1的逻辑值,直接传入整个macd向量时,只会返回一个全局判断结果,而非每个时间点对应的信号。
修正步骤
1. 重写向量化的信号判断函数
用ifelse替代if-else,ifelse是向量化操作,可以对向量中的每个元素逐一判断:
macd_indicator <- function(macd) { ifelse(macd > 0, "buy", "sell") }
(注:原函数缺少大括号,这是语法不规范的地方,必须用大括号包裹函数体代码块)
2. 生成时间序列格式的信号并合并数据
将函数应用到macd序列后,保留时间索引,再和原数据、MACD、ADX指标合并,得到完整的交易信号数据集:
# 生成每个时间点的信号 signal_vec <- macd_indicator(macd) # 转换为xts格式,保持时间对齐 signal_xts <- xts(signal_vec, order.by = index(macd)) # 合并所有数据 full_data <- cbind(QQQ, macd_QQQ, adx_QQQ, trade_signal = signal_xts) # 查看前几行结果 head(full_data)
3. 可选:加入ADX过滤条件(如果需要)
如果想结合ADX指标过滤信号(比如ADX>25时才生效),可以修改函数:
macd_adx_indicator <- function(macd, adx) { ifelse(macd > 0 & adx > 25, "buy", ifelse(macd < 0 & adx > 25, "sell", "hold")) } # 生成带ADX过滤的信号 filtered_signal <- macd_adx_indicator(macd, adx) filtered_signal_xts <- xts(filtered_signal, order.by = index(macd)) # 合并数据 full_data_with_filter <- cbind(QQQ, macd_QQQ, adx_QQQ, filtered_signal = filtered_signal_xts)
内容的提问来源于stack exchange,提问作者Nile
相关产品推荐
相关产品推荐

