You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MQL5中编写函数判断SMA是否低于RSI的10水平?

MQL5 判断SMA与RSI 10水平的函数实现

首先需要明确:SMA是价格类指标,数值对应品种的当前价格(比如EURUSD可能在1.0-1.2区间),而RSI的10是0-100范围内的信号阈值,两者直接数值对比没有实际交易意义。推测你可能的真实需求是当RSI触及或低于10(超卖区间)时,判断SMA的价格相关状态,或者是将SMA归一化到0-100区间后判断是否≤10,以下分别给出实现方案:

方案1:判断RSI≤10且当前价格触及/低于SMA

这是常见的超卖+价格弱势信号,函数实现如下:

bool IsSmaBelowRsi10Level()
{
    // 获取指标句柄(建议在 OnInit 中初始化,避免重复创建)
    int rsiInstance = iRSI(_Symbol, _Period, 14, PRICE_CLOSE);
    int maInstance = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);
    
    // 检查句柄是否有效
    if(rsiInstance == INVALID_HANDLE || maInstance == INVALID_HANDLE)
    {
        Print("Failed to create indicator handles");
        return false;
    }
    
    // 定义变量存储最新指标值
    double rsiValue, smaValue;
    // 获取最新的RSI值(索引0对应最新K线)
    if(CopyBuffer(rsiInstance, 0, 0, 1, &rsiValue) != 1)
    {
        Print("Failed to copy RSI buffer");
        return false;
    }
    // 获取最新的SMA值
    if(CopyBuffer(maInstance, 0, 0, 1, &smaValue) != 1)
    {
        Print("Failed to copy SMA buffer");
        return false;
    }
    
    // 获取当前最新收盘价
    double currentPrice = Close[0];
    
    // 判断条件:RSI≤10,且当前价格触及或低于SMA
    return (rsiValue <= 10.0) && (currentPrice <= smaValue);
}

方案2:将SMA归一化到0-100区间后判断是否≤10

如果确实需要将SMA和RSI的0-100区间对比,可通过最近N期的SMA极值进行归一化,函数实现如下:

bool IsNormalizedSmaBelow10()
{
    int rsiInstance = iRSI(_Symbol, _Period, 14, PRICE_CLOSE);
    int maInstance = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);
    
    if(rsiInstance == INVALID_HANDLE || maInstance == INVALID_HANDLE)
    {
        Print("Invalid indicator handles");
        return false;
    }
    
    // 取最近50期的SMA数据用于归一化,可根据品种调整周期
    const int lookbackPeriod = 50;
    double smaBuffer[];
    ArraySetAsSeries(smaBuffer, true);
    
    if(CopyBuffer(maInstance, 0, 0, lookbackPeriod, smaBuffer) != lookbackPeriod)
    {
        Print("Failed to copy SMA buffer for normalization");
        return false;
    }
    
    // 计算最近N期SMA的最高和最低值
    double smaHigh = MathMaxArray(smaBuffer);
    double smaLow = MathMinArray(smaBuffer);
    
    // 避免除以0的情况
    if(smaHigh == smaLow)
    {
        return false;
    }
    
    // 获取最新SMA值并归一化到0-100区间
    double latestSma = smaBuffer[0];
    double normalizedSma = ((latestSma - smaLow) / (smaHigh - smaLow)) * 100;
    
    // 判断归一化后的SMA是否≤10
    return normalizedSma <= 10.0;
}

注意事项

  • 指标句柄建议在OnInit()函数中初始化,避免在循环或函数内重复创建,提升运行效率。
  • 使用CopyBuffer时必须检查返回值,确保数据获取成功,避免后续逻辑出错。
  • 方案2中的归一化回溯周期可根据交易品种和时间周期灵活调整。

内容的提问来源于stack exchange,提问作者silverhash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:58:25