【问题标题】:How to limit the input when using next iterator?使用下一个迭代器时如何限制输入?
【发布时间】:2021-11-27 16:06:32
【问题描述】:

我正在使用ta 库计算指数移动平均线。目前,我使用 next 迭代器添加每个 close 值。我想要做的是将 ema 的输入限制为 201 个值(当您在 201 个输入值或例如 500 个输入值上计算 ema200 时,输出是不同的)。这有可能吗?

use ta::indicators::ExponentialMovingAverage as EMA;
use ta::Next;

pub fn main() {
    let mut reader = csv::Reader::from_path("datafile.csv").unwrap();

    let mut ema = EMA::new(200).unwrap();
    
    for record in reader.deserialize() {
        let (timestamp, open, high, low, close, volume): (String, f64, f64, f64, f64, f64) = record.unwrap();

        let ema_val = ema.next(close);

        println!("{} - ema: {}", timestamp, ema_val);
    }
}

我的数据文件看起来像这样:

timestamp,open,high,low,close,volume
2017-01-03,757.919983,758.760010,747.700012,753.669983,3521100
2017-01-04,758.390015,759.679993,754.200012,757.179993,2510500
2017-01-05,761.549988,782.400024,760.260010,780.450012,5830100
2017-01-06,782.359985,799.440002,778.479980,795.989990,5986200
2017-01-09,798.000000,801.770020,791.770020,796.919983,3440100
2017-01-10,796.599976,798.000000,789.539978,795.900024,2558400
2017-01-11,793.659973,799.500000,789.510010,799.020020,2992800
2017-01-12,800.309998,814.130005,799.500000,813.640015,4873900
2017-01-13,814.320007,821.650024,811.400024,817.140015,3791900
2017-01-17,815.700012,816.000000,803.440002,809.719971,3659400
2017-01-18,809.500000,811.729980,804.270020,807.479980,2354200
2017-01-19,810.000000,813.510010,807.320007,809.039978,2540800
2017-01-20,815.280029,816.020020,806.260010,808.330017,3376200
2017-01-23,806.799988,818.500000,805.080017,817.880005,2797500
2017-01-24,822.000000,823.989990,814.500000,822.440002,2971700
2017-01-25,825.789978,837.419983,825.289978,836.520020,3922600
2017-01-26,835.530029,843.840027,833.000000,839.150024,3586300
2017-01-27,839.000000,839.700012,829.440002,835.770020,2998700
2017-01-30,833.000000,833.500000,816.380005,830.380005,3747300
2017-01-31,823.750000,826.989990,819.559998,823.479980,3137200

【问题讨论】:

    标签: rust technical-indicator


    【解决方案1】:

    EMA 的全部意义在于,旧输入值的权重永远不会恰好达到 0,而只会呈指数下降。它的定义和实现方式使得更新非常高效,因为在 EMA 对象上调用 next 实际上只涉及更新一个值。

    如果我正确理解您想要做什么,那就是计算一个 EMA,其中包括 200 个时间步的硬权重截止值。

    因此,您想要的并不是真正的指数移动平均线,而是权重呈指数衰减的移动平均线。有一个细微的差别,因为有了这个要求,您现在必须跟踪所有前面的 200 个权重。

    我看不出有一种简单的方法可以将其破解到 ta 板条箱的 EMA 结构中,因此您必须推出自己的指标。为此,我建议查看源代码,而不是指数移动平均线,而是简单移动平均线,因为它显示了您如何跟踪已经看到的权重:https://docs.rs/ta/0.5.0/src/ta/indicators/simple_moving_average.rs.html#44-50

    然后你只需要弄清楚如何正确计算权重并进行更新。

    但或者,您也可以停下来想想为什么要在您的 EMA 中添加这样一个“窗口”。

    【讨论】:

    • 很遗憾,我需要在我的 EMA 上使用“窗口”,因为我用它来比较实时(算法)交易,我一次只能通过 API 获得 x 数量的蜡烛。
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多