程序员的量化交易之路(4)--Esper之事件(3)

欢迎转载学习,但转载须注明出处:http://blog.csdn.net/minimicall,尊重劳动成果,版权归我。

这一节中我们继续学习Esper的事件部分内容。

对应官方的文档为2.4-2.5

2.4 碎片及碎片类型(Fragment and Fragment Type)

有些情况,一个事件的某个属性本身又是一个事件。Esper对这种称作为fragment(碎片)和碎片类型。一个示例就是,两个或者更多的事件可以组成和一个新的事件作为输出,而这个输出事件在将来可能又作为其他事件的一个碎片属性。

碎片及类型属性使得你可以组合事件,而无需使用Java 反射API,这减少了事件底层操作处理。相关API见15.6,“Event and Event Type”

2.5 POJO事件(Plain-Old Java Object)

POJO是指类对象通过像JavaBean风格的方法提供getter方法向外界开放内部属性。这种事件类,也不是完全需要严格遵循JavaBean的约定,但一定要提供getter方法,或者是通过某种配置达到目的。

Esper支持JavaBean风格的事件类,它可以是某个基类的扩展,或者是一个或者多个接口的实现。Esper的时间模式和EPL语句也支持指向Java接口类和抽象类。

代表事件的类应该是不可变的。因为事件代表的是过去发生的动作或者状态的改变,所以应该是不能改变的。但这也不是严格要求,Esper引擎也接受可变的事件。

事件类的hashCode和equals方法无需实现。其实现也不会影响Esper引擎的工作表现。

2.5.1 Java Object Event Properties(Java对象事件属性)

前面我们提到,我们支持遵循标准JavaBean约定的属性类型,斌企鹅有一些是Esper特定支持的:

1)  Simple 简单属性仅仅包含一个单一的可检索的值。属性的底层实现可能是Java语言的内置类型(例如int,简单对象java.lang.String)或更为复杂的对象,它可能是由Java语言定义的、或者是应用定义的,或是第三方库定义的。

2)  Indexed 索引属性存储的是同一类型的有序对象容器,容器内的对象可以通过索引单独访问。

3)  Mapped JavaBean API的扩展,Esper考虑任何由以String类型作为key的映射属性。

4)  Nested 嵌套属性是指该属性所在的对象是一个事件的一个属性。即它是事件属性的属性。

假如这里有个NewEmployeeEvent事件类。这里的索引和映射属性返回的是Java对象,但也可以返回Java的内置类型(例如int和String)。Address对象和Employee对象都可以嵌套它们自己的属性,例如Address里面可以有街道名称,Employee中可以有雇员姓名。

public classNewEmployeeEvent {

public StringgetFirstName();

public AddressgetAddress(String type);

public EmployeegetSubordinate(int index);

public Employee[]getAllSubordinates();

}

简单事件属性需要一个getter方法,用于返回属性值。在这个例子中,getFirstName方法返回firstName事件属性,它为String类型。

索引事件属性需要如下的两种getter方法的至少一种。第一种,以整形为参数返回一个属性值,例如getSuborinate方法;另一种方法是返回整个数组对象,例如getAllSubordinates方法。在EPL或者事件模式语句中,索引属性通过property[index]来访问。

映射事件属性需要一个getter方法,它以String类型的关键字作为参数,返回属性值,例如getAddress方法。在EPL或者事件模式语句中,映射属性通过property(‘key’)来访问。

嵌套事件属性需要一个getter方法用于返回嵌套对象。getAddress和getSubordinate是映射和索引属性,它们返回的是一个嵌套对象。在EPL和事件模式语句中,嵌套属性通过property.nestedProperty来访问。

上述的这些属性可以任意的进行复合。例如下面就是这些属性的一些复合示例:

everyNewEmployeeEvent(firstName=‘myName‘)

everyNewEmployeeEvent(address(‘home‘).streetName=‘Park Avenue‘)

everyNewEmployeeEvent(subordinate[0].name=‘anotherName‘)

everyNewEmployeeEvent(allSubordinates[1].name=‘thatName‘)

everyNewEmployeeEvent(subordinate[0].address(‘home‘).streetName=‘Water Street‘)

类似的,这些语法可以应用在EPL语句任何事件属性名可以出现的地方,例如select列表,where语句,jion语句等。

select firstName,address(‘work‘), subordinate[0].name, subordinate[1].name

from NewEmployeeEvent

whereaddress(‘work‘).streetName = ‘Park Ave‘

2.5.2 属性名

属性名遵循Java标准:java.beans.Introspector类和getBeanInfo方法返回属性名。此外,Esper还可以通过配置一个标识来关闭大小写敏感,表2.4是属性名和相应getter方法的示例。

方法 属性名 示例

getPrice()

Price Select pricefrom myEvent

getNAME()

NAME Select NAME frommyEvent

getItemDesc()

itemDesc

Select itemDesc frommyEvent

getQ() Q Select qfrom myEvent

getQN() QN Select QNfrom myEvent

getqn() qn Select qnfrom myEvent

gets() s Select sfrom myEvent

2.5.3 参数化类型

当你的getter方法的到的是一个参数化的类型,例如索引属性,Iterable<MyEventData>,映射属性Map<String,MyEventData>,那么这个参数化类型就是指向属性的属性表达式,它可以获得属性值。

public classNewEmployeeEvent {

public StringgetName();

public Iterable<EducationHistory>getEducation();

publicMap<String, Address> getAddresses();

}

一个获得属性的表达式如下:

select name,education, education[0].date, addresses(‘home‘).street

from NewEmployeeEvent

2.5.4 索引和映射属性的setter方法

EPL语句可以更新事件的索引和映射属性,提供了设置属性的setter方法。

索引属性的setter方法必须形如setPropertyName,并且有两个参数,整形的索引参数和Object类型的属性新值。

映射属性的setter方法,必须是形如setPropertyName,并且接受两个参数,String类型的关键字和Object类型的属性值。

下面就是设置事件索引和映射属性的一个示例:

public class MyEvent{

private Mapprops = new HashMap();

privateObject[] array = new Object[10];

public voidsetProps(String name, Object value) {

props.put(name, value);

}

public voidsetArray(int index, Object value) {

array[index] = value;

}

// ... alsoprovide regular JavaBean getters and setters for all properties

下面语句是设置索引和映射属性:

update istreamMyEventStream set props(‘key‘) = ‘abc‘, array[2] = 100

2.5.5 已知的局限性

Esper是获得事件属性的字节码,当字节码获取失败时,这时候引擎会记录一个警告并使用java反射机制去获得属性值。

一个已知的局限性是,当想获得一个属性值,但真实获得的却是属性值子类的对象,引擎就会告警。

时间: 2024-08-29 11:53:28

程序员的量化交易之路(4)--Esper之事件(3)的相关文章

程序员的量化交易之路(2)----Esper文档学习之技术概览(1)

转载请注明出处:http://blog.csdn.net/minimicall/ 在接下来的20个工作日中,我将坚持翻译或者略翻译Esper的官方文档. 为什么需要学习Esper,因为我们需要理解复合事件处理 Complex Event Processing (CEP).在量化交易系统中,CEP是必不可少的.它负责处理海量的实时事件. 关于CEP更多知识,大家可以翻阅网络相关资料.我这里集中在学习开源的CEP系统,Esper.. 今天开始第一篇:技术概览. 1. CEP和事件序列分析 Esper

程序员的量化交易之路(1)----规划开篇

其实,一直对量化交易有一定的理解和情节.早在中大读研究生的时候实验室师兄,已经去了中国平安核心投资团队,做高频交易研究的国源师兄的影响,就开始对金融世界产生了浓厚的兴趣.看了丁磊编著的<量化投资--策略与技术>和艾琳.奥尔德里奇的<高频交易>,反复的看,但是都入不了味,现在回过头来想,一个连股都不炒的人怎么可能入味呢.对一些金融的基本概念都不懂. 2013年7月出社会工作后,在10月份确立目标.需要炒股,而且需要一个深入的理解金融的世界.所以确定去考一个证券从业考试,选了证券基础和

程序员的量化交易之路(13)--Cointrader类图(1)

转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents, htpp://cloudtrader.top 今天开始正式切入到Cointrader的源码分析学习中,其主页为:https://github.com/timolson/cointrader. 它是基于Esper的一个比特币云交易托管平台.和我想做的事情比较相近.而且虽然现在没什么功能,但代码量相对少,对于学习非常好. 下面是它的一个类图.: 后面我们会根据这个类图一步步的剖析整个

程序员的量化交易之路(19)--Cointrader之Bar实体(7)

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrader.top 1. 代码 package org.cryptocoinpartners.schema; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class Bar extends Event { private long times

程序员的量化交易之路(20)--Cointrader之Assert实体(8)

转载需说明出处:http://blog.csdn.net/minimicall, http://cloudtrade.top 任何可交易的都可以称之为Assert,资产.其类代码如下: package org.cryptocoinpartners.schema; import javax.persistence.Basic; import javax.persistence.Cacheable; import javax.persistence.Entity; import javax.pers

程序员的量化交易之路(24)--Cointrader之RemoteEvent远程事件实体(11)

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 在量化交易系统中,有些事件是远端传来的,比如股票的价格数据等.所以,在这一节我们定义了一个远端事件实体. 它是一个基类,并不单独生成数据表.具体代码如下: package org.cryptocoinpartners.schema; import javax.annotation.Nullable; import javax.persistence.Basic; imp

程序员的量化交易之路(38)--Lean之实时事件处理接口IRealTimeHandler和RealTimeEvent6

转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ 这节开始我们要开始说明另外一个模块:实时事件处理模块. 这个模块的工作是什么呢.它就是用来设置一些在特定时间需要执行的任务.比如,每天开盘的时候,你可以做一个什么动作,比如每天收盘的时候你也可以做一个动作.当然还有更为广泛的运用. 在Lean中,是开启一个单独的线程来处理这种定时任务的. 实时事件:RealTimeEvent 实时事件处

程序员的量化交易之路(36)--Lean之数据读取SubscriptionDataReader4

转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top 数据读取需要定义一个读者.直接见下面代码: namespace QuantConnect.Lean.Engine.DataFeeds { /******************************************************** * CLASS DEFINITIONS ***********************

程序员的量化交易之路(29)--Cointrader之Tick实体(16)

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top Tick:什么是Tick,在交易平台中非常常见,其实就 单笔交易时某只证券的基本数据. 我们通过代码来学习吧: package org.cryptocoinpartners.schema; import javax.annotation.Nullable; import javax.persistence.Entity; import javax.persistence.M

程序员的量化交易之路(35)--Lean之DataFeed数据槽3

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/ Lean引擎的模块划分非常的规范.其中DataFeed是数据槽,就是供应数据的模块. 1. IDataFeed 接口 模块的接口为: namespace QuantConnect.Lean.Engine.DataFeeds { /// <summary> /// Datafeed interface for creating custom datafeed source