3

抱歉,如果问题措辞不佳,我会尽力而为。

如果我有一个以时间为单位的值序列,Observable[(U,T)]其中 U 是一个值,T 是类时间类型(或者我想的任何差异),我怎么能编写一个操作符,它是一个自动重置的一键式屏障,它在 时是无声的abs(u_n - u_reset) < barrier,但如果碰到屏障就会吐出t_n - t_reset,此时它也会重置u_reset = u_n

也就是说,该运算符接收到的第一个值成为基线,它什么也不发出。此后,它会监视流的值,一旦其中一个值超出基线值(高于或低于),它就会发出经过的时间(由事件的时间戳测量),并重置基线。然后将处理这些时间以形成对波动率的高频估计。

作为参考,我正在尝试编写http://www.amazon.com/Volatility-Trading-CD-ROM-Wiley/dp/0470181990中概述的波动率估计器,而不是测量标准偏差(在常规均匀时间的偏差),您重复测量突破某个固定障碍量的障碍所需的时间。

具体来说,这可以使用现有的运算符编写吗?我对如何重置状态有点困惑,尽管也许我需要创建两个嵌套运算符,一个是一次性的,另一个是不断创建一次性的...我知道可以通过编写来完成一个手,但是我需要写我自己的出版商等等。

谢谢!

4

1 回答 1

5

我不完全理解示例中的算法和变量,但您可以使用flatMap一些堆状态并返回empty()just()根据需要:

int[] var1 = { 0 };
source.flatMap(v -> {
    var1[0] += v;
    if ((var1[0] & 1) == 0) {
       return Observable.just(v);
    }
    return Observable.empty();
});

如果由于多个消费者而需要按序列状态,则可以defer

Observable.defer(() -> {
    int[] var1 = { 0 };
    return source.flatMap(v -> {
        var1[0] += v;
        if ((var1[0] & 1) == 0) {
           return Observable.just(v);
        }
        return Observable.empty();
    });
}).subscribe(...);
于 2015-09-01T20:50:01.367 回答