如何突破request.security()调用40次上限?
解决Pine Script中request.security()调用次数超限问题
问题描述
在Pine Script中使用request.security()时触发了40次调用上限,我仅需用这些数据给表格上色,尝试过自定义函数和元组的方式,但最终只能实现4行效果,现有代码如下:
// data(sym,timeframee,variablee) => // ind=0.0 // emaData=0.0 // wmaData=0.0 // hmaData=0.0 // rmaData=0.0 // sma_short_Data=0.0 // sma_long_Data=0.0 // if variablee==emaData // emaData := request.security(sym, input_timeframe,ema_for_table) // if variablee==wmaData // wmaData := request.security(sym, input_timeframe,wma_for_table) // if variablee==hmaData // hmaData:=request.security(sym,input_timeframe,hma_for_table) // if variablee==rmaData // rmaData:=request.security(sym,input_timeframe,rma_for_table) // if variablee==sma_short_Data // sma_short_Data:=request.security(sym,input_timeframe,sma_short_term) // if variablee==sma_long_Data // sma_long_Data:=request.security(sym,input_timeframe,sma_long_term) [sma_s_if,sma_l_if,e_if,h_if,r_if,w_if] = request.security(symbol1,input_timeframe,[sma_short_if,sma_long_if,ema_if,hma_if,rma_if,wma_if]) [sma_s2_if,sma_l2_if,e2_if,h2_if,r2_if,w2_if] = request.security(symbol2,input_timeframe,[sma_short_if,sma_long_if,ema_if,hma_if,rma_if,wma_if]) [sma_s3_if,sma_l3_if,e3_if,h3_if,r3_if,w3_if] = request.security(symbol3,input_timeframe,[sma_short_if,sma_long_if,ema_if,hma_if,rma_if,wma_if]) [sma_s4_if,sma_l4_if,e4_if,h4_if,r4_if,w4_if] = request.security(symbol4,input_timeframe,[sma_short_if,sma_long_if,ema_if,hma_if,rma_if,wma_if]) [sma_s5_if,sma_l5_if,e5_if,h5_if,r5_if,w5_if] = request.security(symbol5,input_timeframe,[sma_short_if,sma_long_if,ema_if,hma_if,rma_if,wma_if]) [sma_s6_if,sma_l6_if,e6_if,h6_if,r6_if,w6_if] = request.security(symbol6,input_timeframe,[sma_short_if,sma_long_if,ema_if,hma_if,rma_if,wma_if]) [sma_short_term1,sma_long_term1,ema_for_table_1,hma_for_table_1,rma_for_table_1,wma_for_table_1] = request.security(symbol1,input_timeframe,[sma_short_term,sma_long_term,ema_for_table,hma_for_table,rma_for_table,wma_for_table]) [sma_short_term2,sma_long_term2,ema_for_table_2,hma_for_table_2,rma_for_table_2,wma_for_table_2] = request.security(symbol2,input_timeframe,[sma_short_term,sma_long_term,ema_for_table,hma_for_table,rma_for_table,wma_for_table]) [sma_short_term3,sma_long_term3,ema_for_table_3,hma_for_table_3,rma_for_table_3,wma_for_table_3] = request.security(symbol3,input_timeframe,[sma_short_term,sma_long_term,ema_for_table,hma_for_table,rma_for_table,wma_for_table]) [sma_short_term4,sma_long_term4,ema_for_table_4,hma_for_table_4,rma_for_table_4,wma_for_table_4] = request.security(symbol4,input_timeframe,[sma_short_term,sma_long_term,ema_for_table,hma_for_table,rma_for_table,wma_for_table]) [sma_short_term5,sma_long_term5,ema_for_table_5,hma_for_table_5,rma_for_table_5,wma_for_table_5] = request.security(symbol5,input_timeframe,[sma_short_term,sma_long_term,ema_for_table,hma_for_table,rma_for_table,wma_for_table]) [sma_short_term6,sma_long_term6,ema_for_table_6,hma_for_table_6,rma_for_table_6,wma_for_table_6] = request.security(symbol6,input_timeframe,[sma_short_term,sma_long_term,ema_for_table,hma_for_table,rma_for_table,wma_for_table])
解决方案
合并同标的请求:当前每个标的(symbol1~symbol6)都调用了2次
request.security,可将两次请求合并为一次,在同一个调用中返回所有需要的指标,直接把单标的调用次数从2次降到1次,减少一半调用量。
示例代码:// 封装单标的所有指标请求 getSymbolData(sym, tf) => [sma_short_if_val, sma_long_if_val, ema_if_val, hma_if_val, rma_if_val, wma_if_val, sma_short_term_val, sma_long_term_val, ema_for_table_val, hma_for_table_val, rma_for_table_val, wma_for_table_val] = request.security(sym, tf, [ sma_short_if, sma_long_if, ema_if, hma_if, rma_if, wma_if, sma_short_term, sma_long_term, ema_for_table, hma_for_table, rma_for_table, wma_for_table ]) [sma_short_if_val, sma_long_if_val, ema_if_val, hma_if_val, rma_if_val, wma_if_val, sma_short_term_val, sma_long_term_val, ema_for_table_val, hma_for_table_val, rma_for_table_val, wma_for_table_val] // 调用函数获取各标的数据 [sma_s_if, sma_l_if, e_if, h_if, r_if, w_if, sma_short_term1, sma_long_term1, ema_for_table_1, hma_for_table_1, rma_for_table_1, wma_for_table_1] = getSymbolData(symbol1, input_timeframe) [sma_s2_if, sma_l2_if, e2_if, h2_if, r2_if, w2_if, sma_short_term2, sma_long_term2, ema_for_table_2, hma_for_table_2, rma_for_table_2, wma_for_table_2] = getSymbolData(symbol2, input_timeframe) // 依此类推处理symbol3~symbol6数组批量处理标的:如果标的数量较多,可将标的存入数组,通过循环批量调用
request.security,优化代码结构的同时避免重复代码。
示例代码:// 存储标的列表 symbols = array.new_string([symbol1, symbol2, symbol3, symbol4, symbol5, symbol6]) // 存储所有指标数据 allData = array.new_matrix() // 循环获取每个标的数据 for i = 0 to array.size(symbols) - 1 sym = array.get(symbols, i) data = request.security(sym, input_timeframe, [ sma_short_if, sma_long_if, ema_if, hma_if, rma_if, wma_if, sma_short_term, sma_long_term, ema_for_table, hma_for_table, rma_for_table, wma_for_table ]) array.push(allData, data) // 按需提取数据,比如取第一个标的的sma_short_if值 sma_s_if = array.get(array.get(allData, 0), 0)移除非必要指标:如果部分指标在表格上色逻辑中用不到,直接删除对应的请求项,减少单次调用返回的指标数量,降低整体调用压力。
通过以上优化,可大幅减少request.security的调用次数,突破40次限制,实现更多行的表格上色需求。
内容的提问来源于stack exchange,提问作者omersabriklc
相关产品推荐
相关产品推荐

