如何为多货币对编写EMA趋势信号脚本?现有代码遇问题求助
问题分析与解决方案
你的代码问题出在request.security的用法和趋势对比逻辑上,导致无法为每个货币对单独计算趋势信号。以下是具体修正方案:
核心问题说明
request.security语法错误:该函数的第二个参数必须是时间框架字符串(比如""代表当前图表时间框架,"D"代表日线),而非直接写入EMA计算式。正确用法是通过它获取目标货币对的K线数据,再在其专属上下文内计算EMA。- 对比逻辑错误:你用当前图表的收盘价和目标货币对的EMA做对比,这不符合需求——应该用目标货币对自身的收盘价和它的EMA进行比较。
修正后的单货币对代码
EMA_LEN = input(200, title="EMA周期") // 输入目标货币对 ticker01 = input.symbol("AUDUSD", title="货币对1") // 通过request.security获取目标货币对的收盘价和对应EMA [ticker01Close, ticker01EMA] = request.security(ticker01, "", [close, ta.ema(close, EMA_LEN)]) // 计算该货币对的趋势 ticker01TREND = ticker01Close > ticker01EMA ? "Bullish(看涨)" : ticker01Close < ticker01EMA ? "Bearish(看跌)" : "Neutral(中性)" // 将结果输出到图表 label.new(bar_index, high, ticker01 + ": " + ticker01TREND, color=color.blue, textcolor=color.white)
扩展到14个货币对的优化方案
为避免重复编写14次相同逻辑,可通过函数封装简化代码:
EMA_LEN = input(200, title="EMA周期") // 定义获取单货币对趋势的函数 getTrend(sym) => [symClose, symEMA] = request.security(sym, "", [close, ta.ema(close, EMA_LEN)]) symClose > symEMA ? "Bullish(看涨)" : symClose < symEMA ? "Bearish(看跌)" : "Neutral(中性)" // 定义14个货币对的输入列表 tickerList = [ input.symbol("AUDUSD", "货币对1"), input.symbol("USDJPY", "货币对2"), input.symbol("EURUSD", "货币对3"), input.symbol("GBPUSD", "货币对4"), // 继续添加剩余10个货币对... ] // 循环输出所有货币对的趋势信号 var labels = array.new_label() if barstate.islast // 清空旧标签避免重叠 array.clear(labels) // 遍历每个货币对生成标签 for i = 0 to array.size(tickerList)-1 sym = array.get(tickerList, i) trend = getTrend(sym) // 调整标签垂直位置防止重叠 labelPos = high + (i * ta.atr(14) * 0.5) lbl = label.new(bar_index, labelPos, sym + ": " + trend, color=color.green, textcolor=color.white) array.push(labels, lbl)
关键细节说明
request.security(ticker, "", [close, ta.ema(close, EMA_LEN)]):在目标货币对的K线上下文内,同时获取它的收盘价和200周期EMA,确保每个货币对的计算完全独立。- 函数封装后,新增或修改货币对只需调整
tickerList,代码更简洁易维护。 - 用
barstate.islast和数组存储标签,仅在最后一根K线显示最新趋势,避免图表上生成大量重复标签。
内容的提问来源于stack exchange,提问作者user21637228
相关产品推荐
相关产品推荐

