如何在MQL5中实现类似TradingView的RSI指标叠加MA?
在MQL5中实现RSI叠加MA均线的方案
核心实现思路
要复刻TradingView里RSI加MA的配置,本质是先计算RSI指标值,再对RSI结果计算对应的移动平均线,以下是具体实现步骤和代码示例:
1. 基础框架搭建
先创建自定义指标的基础结构,定义两个缓冲区分别存储RSI值和MA值:
// 全局缓冲区定义 double RSI_Buffer[]; double RSI_MA_Buffer[]; int OnInit() { // 绑定缓冲区到指标输出 SetIndexBuffer(0, RSI_Buffer, INDICATOR_DATA); SetIndexBuffer(1, RSI_MA_Buffer, INDICATOR_DATA); // 设置指标显示属性 IndicatorSetString(INDICATOR_SHORTNAME, "RSI with MA"); PlotIndexSetString(0, PLOT_LABEL, "RSI"); PlotIndexSetString(1, PLOT_LABEL, "RSI MA"); PlotIndexSetInteger(0, PLOT_COLOR, clrSteelBlue); PlotIndexSetInteger(1, PLOT_COLOR, clrCrimson); return(INIT_SUCCEEDED); }
2. 计算RSI值
利用MQL5内置的iRSI函数直接获取RSI结果,参数对应TradingView里的设置(比如RSI长度14,收盘价计算):
// 在OnCalculate函数中计算RSI for(int i = 0; i < limit; i++) { int pos = rates_total - limit + i; // 这里的14是RSI长度,PRICE_CLOSE对应收盘价,可根据截图调整 RSI_Buffer[pos] = iRSI(_Symbol, _Period, 14, PRICE_CLOSE, pos); }
3. 计算RSI的MA均线
根据截图里的MA类型(比如SMA/EMA),选择对应的计算方式:
- 如果是简单移动平均(SMA),可以手动计算或用
iMAOnArray:
// 手动计算SMA(示例长度9) for(int i = 0; i < limit; i++) { int pos = rates_total - limit + i; double sum = 0; int valid_count = 0; for(int j = 0; j < 9; j++) { if(pos - j >= 0) { sum += RSI_Buffer[pos - j]; valid_count++; } } RSI_MA_Buffer[pos] = sum / valid_count; }
- 如果是指数移动平均(EMA),用
iMAOnArray更简洁:
// 计算EMA(示例长度9) for(int i = 0; i < limit; i++) { int pos = rates_total - limit + i; RSI_MA_Buffer[pos] = iMAOnArray(RSI_Buffer, 0, 9, 0, MODE_EMA, pos); }
关键调整点
- 对照你的TradingView截图,修改代码里的RSI长度、MA类型、MA长度这三个核心参数;
- 如果需要调整MA的计算数据源(比如不是收盘价),修改
iRSI里的价格类型参数即可; - 指标周期自动匹配当前图表周期,无需额外设置。
内容的提问来源于stack exchange,提问作者lancegoh
相关产品推荐
相关产品推荐

