天天看點

程式員的量化交易之路(6)-Esper之處理模型(5)

3 處理模型(Processing Model)

Esper的處理模型是持續的:更新監聽器listener和訂閱者subscriber,當事件到來時,根據聲明對事件流、視圖、過濾和輸出等。

監聽器的接口是com.espertech.esper.client.UpdateListener,必須實作update方法,這個函數會在結果到來時觸發。

3.2 插入流(Insert Stream)

我們來看一個非常簡單的EPL語句:

Select * from Withdrawal

這條語句沒有附加任何過濾、視圖等條件。這條語句會當Withdrawal或者其子類對象到來時觸發。

下面是是一個例子。

程式員的量化交易之路(6)-Esper之處理模型(5)

圖3.1 Output example for a simple statement

上面這個簡單的例子中隻有new events被送出到語句的監聽器中,oldevents沒有。

3.3 插入和删除流

一個長度視窗是讓引擎隻保留最近的N個事件。下面的語句給Withdrawal事件流一個長度視窗。這條語句用于說明資料視窗,一個事件有進就有出的資料視窗。

select * from Withdrawal.win:length(5)

下面這幅圖就是資料視窗的一個例子:

程式員的量化交易之路(6)-Esper之處理模型(5)

它保有5個時間,是以當視窗滿了後,最先的w1事件就會被删除,做old events送給監聽器。

和長度視窗類似的還有事件視窗。

3.4 過濾和where語句

過濾器會過濾掉那些不符合條件的事件,這些事件就不會被投遞到語句的監聽器中。例如:

select * fromWithdrawal(amount>=200).win:length(5)

任何amount值小于200的Withdrawal對象都不會被投到監聽器的回調函數裡面。下圖是說明。

程式員的量化交易之路(6)-Esper之處理模型(5)

上述圖可以看到,事件還沒有進入到視窗就被過濾了。

Where和having語句則不一樣,它是在事件進入到視窗之後再過濾。

select * from Withdrawal.win:length(5)where amount >= 200

3.5 時間視窗(Time Window)

這一節我們說明時間視窗以及時間批處理視窗

3.5.1 時間視窗

時間視窗就是保留特定事件間隔内的事件。

下面是一個示例:

select account, avg(amount)

from Withdrawal.win:time(4 sec)

group by account

having amount > 1000

下面是一個更為簡單的例子:

select * from Withdrawal.win:time(4 sec)

下面圖示是解釋其原理:

程式員的量化交易之路(6)-Esper之處理模型(5)

3.5.2 Time Batch 事件批處理

就是每隔設定的時間才會去觸發一次監聽器。

例如如下語句:

select * from Withdrawal.win:time_batch(4sec)

其運作原理如圖:

程式員的量化交易之路(6)-Esper之處理模型(5)

繼續閱讀