微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用 C# 中的 2 条线指标计算 MACD 的 EMA

如何解决用 C# 中的 2 条线指标计算 MACD 的 EMA

我正在尝试编写一个指标脚本,该脚本将在练习交易工具中用 2 条线绘制 MACD。

目前,我遵循的公式是 using the EMA formula to calculate it.

我可以绘制图表。但不知何故,我的指标结果与元交易者 4 或交易视图上的结果并不完全相同。这些应用上的指标结果完全一样。

当我尝试从公式转换为实际代码时,我想我错过了一些东西。请帮我修复它。谢谢。

这是计算 EMA 的部分。

/// ==================================================================
/// ======================== calculations ============================
/// ==================================================================
public void Calculate()
{
    for (int i = 0; i < Bars.Length; i++){
        if (i >= SlowEMA) {
            MACD[i] = CalculateEMA(FastemA,i) - CalculateEMA(SlowEMA,i);
            Signal[i] = CalculateEMA_MACD(MACD,SignalEMA,i);
            Histogram[i] = MACD[i] - Signal[i];
        }
    }
}

private double CalculateEMA(int Period,int index)
{
    var currentValue = 0d;
    var currentEMA = 0d;
    var yesterdayEMA = 0d;
    var smooth = 2d;
    var multiplier = smooth / (1 + Period);
    
    for (int i = 0; i < Period; i++){
        currentValue = GetPrice(index + i - Period);
        currentEMA = (currentValue * multiplier) + (yesterdayEMA * (1 - multiplier));
        yesterdayEMA = currentEMA;
    };
    return yesterdayEMA;
}

private double CalculateEMA_MACD(double[] MACD,int Period,int index)
{
    var currentValue = 0d;
    var currentEMA = 0d;
    var yesterdayEMA = 0d;
    var smooth = 2d;
    var multiplier = smooth / (1 + Period);
    for (int i = 0; i < Period; i++){
        currentValue = MACD[index + i - Period];
        currentEMA = (currentValue * multiplier) + (yesterdayEMA * (1 - multiplier));
        yesterdayEMA = currentEMA;
    };
    return yesterdayEMA;
}

private double GetPrice(int index)
{
    Bar bar = Bars[index];
    switch (Source)
    {
        case Sources.Close:
            return bar.Close;
        case Sources.Open:
            return bar.Open;
        case Sources.High:
            return bar.High;
        case Sources.Low:
            return bar.Low;
        case Sources.MedianPrice:
            return (bar.High + bar.Low) / 2;
        case Sources.TypicalPrice:
            return (bar.High + bar.Low + bar.Close) / 3;
        case Sources.WeightedClose:
            return (bar.High + bar.Low + bar.Close + bar.Close) / 4;
    }
    throw new NotSupportedException("Unsupported price source type: " + Source);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。