操作运算
操作 C++ 序列符方法接受各种序列参数,并生成相应结果序列。
以下是可用的方法:
reverse
Sequence<T> reverse() const
反转输入序列中的元素。
concat 或 ,
Sequence<T> concat(Sequence<T> const& other) const
或
,(Sequence<T> const& other) const
将任意类型的两个序列连接起来,将右序列追加到序列左序列后面。结果序列的类型将与左序列和右序列的类型相同。
limit 或 ()
Sequence<T> limit(mco_seq_no_t from, mco_seq_no_t till) const
或
Sequence<T> ()(mco_seq_no_t from, mco_seq_no_t till) const
将从输入序列中从位置 from 到位置 till 的子序列复制到结果序列中。
get
void get(std::vector<T>& result)
从输入序列中提取数据到缓冲区结果中。
unique
Sequence<T> unique() const
将有序序列输入中的唯一元素通过“合并重复项”复制到结果序列中。
norm
Sequence<double> norm() const
在结果中返回归一化的输入序列;即,将每个序列元素除以所有元素平方和的平方根。
thin
Sequence<T> thin(mco_size_t origin, mco_size_t step) const
将输入序列复制到结果中,选择具有指定的 origin 和 step 的元素。
diff
Sequence<T> diff() const
在结果中返回输入中序列元素对之间的差异。
combine
Sequence<T> combine(Sequence<T> const& other, mco_seq_order_t order) const
在结果中返回两个有序序列左序列和右序列的并集,使用指定的 order。请注意,结果将包含来自两个输入序列的不同元素。
map 或 []
Sequence<T> map(Sequence<mco_seq_no_t> const& positions) const
或
Sequence<T> [](Sequence<mco_seq_no_t> const& positions) const
在结果中返回从输入序列中根据 positions 序列中指定的位置提取的元素。positions 中的位置应按升序提供。
repeat
Sequence<T> repeat(int nTimes) const
在结果中返回输入序列中每个元素重复 n_times 次的结果。
stretch
Sequence<T> stretch(Sequence<TS> const& ts1, Sequence<TS> const& ts2, T filler) const
在结果中返回 values 序列的元素,将其拉伸至与 ts1 序列相同的长度。具体做法是:当 ts2 序列中对应的时刻大于 ts1 序列中的时刻时,重复 values 序列中的元素;当 ts2 序列中对应的时刻小于 ts1 序列中的时刻时,则使用 filler 值填充。例如,假设 ts1 = {1,2,3,4,5},ts2 = {2,4},values = {1.1,2.2},filler = 1.0。对于这些输入序列,*结果将为 {1.1,2.2,2.2,1.0,1.0}。(此方法可用于计算 拆股调整价格,在这种情况下,需要反转拆股的时间序列,计算累积乘积并乘以价格。)
stretch0
Sequence<T> stretch0(Sequence<TS> const& ts1, Sequence<TS> const& ts2, T filler) const
在结果中返回 values 和 filler 序列的元素,方法是在序列 ts2 中对应的时间戳与 ts1 中的时间戳匹配时,将 values 中的元素插入其中。对于序列 ts2 中没有在 ts1 中找到匹配时间戳的元素,则使用 filler 值。例如,假设 ts1 = {1,2,3,5},ts2 = {2,3,4},values = {1.1,1.2,1.3} 以及 filler = 0.0。对于这些输入序列,*结果将为 {0.0,1.1,1.2,1.3,0.0}。
asofJoin
Sequence<T> asofJoin(Sequence<TS> const& ts1, Sequence<TS> const& ts2) const
在结果中返回与 ts1 时间戳最接近的 ts2 时间戳对应的 values 序列中的元素。例如,假设 ts1 = {4,9},ts2 = {1,3,6,10},values = {0.1,0.3,0.6,1.0}。对于这些输入序列,*结果将为 {0.3,1.0}。
cross
Sequence<mco_seq_no_t> cross(int first_cross_direction) const
在结果中返回输入序列中穿过零的位置。如果整数参数 first_cross_direction 为正,则结果序列以首次在零上方穿过的位置开始;如果为负,则以首次在零下方穿过的位置开始;如果 first_cross_direction 为零,则无关紧要,即首次穿过的位置可以在零上方或零下方。
extrema
Sequence<mco_seq_no_t> extrema(int first_extremum) const
在结果中返回输入序列中极值(局部最小值和最大值)的位置。如果整数参数 first_extremum 为正,则结果序列以第一个局部最大值开始;如果为负,则以局部最小值开始;如果 first_extremum 为零,则顺序无关紧要。
示例
下面是演示序列操作运算的示例代码片段:
{
mco_trans_h trans;
mco_cursor_t quote_cursor;
Quote quote;
MCO_RET rc;
...
rc = mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &trans);
if ( MCO_S_OK == rc )
{
for (rc = mco_cursor_first(trans, "e_cursor);
rc != MCO_S_CURSOR_END;
rc = mco_cursor_next(trans, "e_cursor))
{
quote.from.cursor(trans, "e_cursor);
// 计算窗口(移动)聚合。
// 找出 20 日移动平均线越过 5 日移动平均线的日期。
print_sequence(quote, quote.day_map(
(quote.close_iterator().windowAggAvg(20) -
quote.close_iterator().windowAggAvg(5)).cross(1)));
}
mco_trans_rollback(trans);
}
}