对于当前点 A, B,要判断前面的线段是否发生 A > B 穿越,可以综合三个指标:
* 前一个点 A < 前一个点 B
* 当前点 A > 当前点 B
* A 所在线段斜率 > B 所在线段斜率
对应脚本如下:
share streamTable(1000:0, `time`sym`qty1`qty2, [TIMESTAMP, SYMBOL, INT, INT]) as trades outputTable = table(1000:0, `time`sym`type`metric, [TIMESTAMP, SYMBOL, INT, STRING]) engine = createAnomalyDetectionEngine(name="anomalyDetection1", metrics=<[prev(qty1) <= prev(qty2) && qty1 >= qty2 && (qty1 - prev(qty1)) > (qty2-prev(qty2))]>, dummyTable=trades, outputTable=outputTable, timeColumn=`time, keyColumn=`sym) subscribeTable(tableName="trades", actionName="anomalyDetectionSub1", offset=0, handler=append!{engine}, msgAsTable=true) def writeData(n){ timev = 2018.10.08T01:01:01.001 + 1..n symv =take(`A`B, n) qtyv1 = rand(1..10, n) qtyv2 = rand(4..14, n) trades.append!(table(timev, symv, qtyv1, qtyv2)) } writeData(40); select * from trades; select * from outputTable
(1)验证 sym=`A,qty1 > qty2 的点:
t = select * from trades where sym = `A plot(data=[t.qty1, t.qty2], labels=t.time)
根据 sym=`A,qty1 和 qty2 的显示结果,可以看出警示点分别在 2018.10.08T01:01:01.014,2018.10.08T01:01:01.020,2018.10.08T01:01:01.030 位置。
select * from outputTable where sym=`A
结果满足预期。
(2)验证 sym=`B,qty1 > qty2 的点:
t = select * from trades where sym = `B plot(data=[t.qty1, t.qty2], labels=t.time)
select * from outputTable where sym=`B
结果满足预期。