PDH/PDL筛选器脚本多窗口打开时标签不显示标的名称求助
问题分析与解决方案
问题根源
你的脚本中,MAScanner()函数使用的High1和Low1是当前图表标的的昨日高低(PDH/PDL),而非被扫描标的自身的PDH/PDL。当你在其他标的图表上运行脚本时,AFFLE、NAZARA等标的的信号判断会错误地使用当前标的的PDH/PDL,导致符合条件的信号无法被正确识别,标签也就不会显示这些标的名称。
修正方案
修改MAScanner()函数,使其在每个被扫描标的的上下文里计算自身的PDH/PDL和信号,确保每个标的都用自己的日线数据判断信号,而非依赖当前图表标的的数据。
修正后的代码
//@version=5 indicator('PDH/PDL SCREENER', overlay=true, max_lines_count=500) showscr = input(true, title='Show Screener Label') posX_scr = input(20, title='Pos. Label x-axis') posY_scr = input(1, title='Pos. Size Label y-axis') t1 = input.symbol('NSE:ACE') t2 = input.symbol('NSE:AEGISCHEM') t3 = input.symbol('NSE:AFFLE') t4 = input.symbol('NSE:AGI') t5 = input.symbol('NSE:NAZARA') // 仅在当前图表显示自身的PDH/PDL线(可按需删除) current_High1 = request.security(syminfo.ticker, 'D', high[1], barmerge.gaps_off, barmerge.lookahead_on) current_Low1 = request.security(syminfo.ticker, 'D', low[1], barmerge.gaps_off, barmerge.lookahead_on) plot(current_High1, color=color.orange, title="PDH") plot(current_Low1, color=color.lime, title="PDL") MAScanner() => // 函数内部获取当前被扫描标的的昨日高低 pdh = request.security(syminfo.ticker, 'D', high[1], barmerge.gaps_off, barmerge.lookahead_on) pdl = request.security(syminfo.ticker, 'D', low[1], barmerge.gaps_off, barmerge.lookahead_on) buysignal = (low <= pdh and close > pdh) or (low[1] <= pdh and close[1] > pdh) sellsignal = (high >= pdl and close < pdl) or (high[1] >= pdl and close[1] < pdl) [buysignal, sellsignal] // 对每个标的独立请求信号,每个标的用自身数据计算 [t01, s01] = request.security(t1, timeframe.period, MAScanner()) [t02, s02] = request.security(t2, timeframe.period, MAScanner()) [t03, s03] = request.security(t3, timeframe.period, MAScanner()) [t04, s04] = request.security(t4, timeframe.period, MAScanner()) [t05, s05] = request.security(t5, timeframe.period, MAScanner()) pot_label = 'BUY:- \n' pot_label := t01 ? pot_label + t1 + '\n' : pot_label pot_label := t02 ? pot_label + t2 + '\n' : pot_label pot_label := t03 ? pot_label + t3 + '\n' : pot_label pot_label := t04 ? pot_label + t4 + '\n' : pot_label pot_label := t05 ? pot_label + t5 + '\n' : pot_label scr_label = 'SELL:- \n' scr_label := s01 ? scr_label + t1 + '\n' : scr_label scr_label := s02 ? scr_label + t2 + '\n' : scr_label scr_label := s03 ? scr_label + t3 + '\n' : scr_label scr_label := s04 ? scr_label + t4 + '\n' : scr_label scr_label := s05 ? scr_label + t5 + '\n' : scr_label f_colorscr(_valscr) => _valscr ? #00000000 : na f_printscr(_txtscr) => var _lblscr = label(na) label.delete(_lblscr) _lblscr := label.new(time + (time - time[1]) * posX_scr, ohlc4[posY_scr], _txtscr, xloc.bar_time, yloc.price, f_colorscr(showscr), textcolor=showscr ? color.yellow : na, size=size.large , style=label.style_label_lower_left) _lblscr f_printscr(pot_label + '\n' + scr_label)
关键修改说明
- 将PDH/PDL的计算逻辑移到
MAScanner()函数内部,通过syminfo.ticker获取当前被扫描标的的代码,确保每个标的都用自己的日线昨日高低计算信号。 - 保留了当前图表标的的PDH/PDL绘制(不需要可直接删除该部分代码),不影响跨标的扫描逻辑。
- 每个
request.security调用时,MAScanner()都会在对应标的的上下文里执行,信号判断完全基于该标的自身的数据。
内容的提问来源于stack exchange,提问作者chaitanya
相关产品推荐
相关产品推荐

