转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/

前面一节我们说到了远端事件。其中,市场数据就属于远端事件。市场数据有什么?我们通过代码来回答这个问题:

package org.cryptocoinpartners.schema;import javax.annotation.Nullable;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;import org.joda.time.Instant;/*** @author Tim Olson*/
@Entity //实体,在数据库中会创建表格
public abstract class MarketData extends RemoteEvent {protected MarketData(Instant time, @Nullable String remoteKey, Market market) {this(time, Instant.now(), remoteKey, market);}protected MarketData(Instant time, Instant timeReceived, String remoteKey, Market market) {super(time, timeReceived, remoteKey);this.market = market;}@ManyToOne(optional = false)public Market getMarket() {return market;}// JPAprotected MarketData() {super();}protected void setMarket(Market market) {this.market = market;}private Market market;//市场
}

市场数据里面只有一个成员,市场。也即是说市场数据是某一时刻的市场。

我们接下来看看市场又有什么数据,Market。

我们通过注释代码来学习。

package org.cryptocoinpartners.schema;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;import javax.persistence.Basic;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.NoResultException;
import javax.persistence.PostPersist;
import javax.persistence.Table;
import javax.persistence.Transient;import org.cryptocoinpartners.enumeration.FeeMethod;
import org.cryptocoinpartners.util.PersistUtil;
import org.cryptocoinpartners.util.RemainderHandler;/*** Represents the possibility to trade one Asset for another at a specific Exchange.** @author Tim Olson*/
@Entity //表格
@Cacheable // 缓存
@NamedQuery(name = "Market.findByMarket", query = "select m from Market m where exchange=?1 and listing=?2") // 命名查询
@Table(indexes = { @Index(columnList = "exchange"), @Index(columnList = "listing"), @Index(columnList = "active") }) //编织索引
public class Market extends EntityBase {public static Collection<Market> findAll() {//查询所有市场数据return PersistUtil.queryList(Market.class, "select m from Market m");}/** adds the Market to the database if it does not already exist */public static Market findOrCreate(Exchange exchange, Listing listing) {return findOrCreate(exchange, listing, listing.getPriceBasis(), listing.getVolumeBasis());}@PostPersistprivate void postPersist() {//PersistUtil.detach(this);}
//查询或创建市场数据public static Market findOrCreate(Exchange exchange, Listing listing, double quoteBasis, double volumeBasis) {// final String queryStr = "select m from Market m where exchange=?1 and listing=?2";try {return PersistUtil.namedQueryOne(Market.class, "Market.findByMarket", exchange, listing);} catch (NoResultException e) {final Market ml = new Market(exchange, listing, quoteBasis, volumeBasis);PersistUtil.insert(ml);return ml;}}/**@return active Markets for the given exchange*/public static Collection<Market> find(Exchange exchange) {return PersistUtil.queryList(Market.class, "select s from Market s where exchange=?1 and active=?2", exchange, true);}/**@return active Markets for the given listing*/public static Collection<Market> find(Listing listing) {return PersistUtil.queryList(Market.class, "select s from Market s where listing=?1 and active=?2", listing, true);}@ManyToOne(optional = false)public Exchange getExchange() {return exchange;}@ManyToOne(optional = false)public Listing getListing() {return listing;}@Basic(optional = false)public double getPriceBasis() {return listing.getPriceBasis() == 0 ? priceBasis : listing.getPriceBasis();}@Transientpublic int getScale() {int length = (int) (Math.log10(getPriceBasis()));return length;}@Basic(optional = false)public double getVolumeBasis() {return listing.getVolumeBasis() == 0 ? volumeBasis : listing.getVolumeBasis();}/** @return true iff the Listing is currently traded at the Exchange.  The Market could have been retired. */public boolean isActive() {return active;}@Transientpublic Asset getBase() {return listing.getBase();}@Transientpublic Asset getQuote() {return listing.getQuote();}@Transientpublic int getMargin() {return listing.getMargin() == 0 ? exchange.getMargin() : listing.getMargin();}@Transientpublic double getFeeRate() {return listing.getFeeRate() == 0 ? exchange.getFeeRate() : listing.getFeeRate();}@Transientpublic FeeMethod getMarginFeeMethod() {return listing.getMarginFeeMethod() == null ? exchange.getMarginFeeMethod() : listing.getMarginFeeMethod();}@Transientpublic FeeMethod getFeeMethod() {return listing.getFeeMethod() == null ? exchange.getFeeMethod() : listing.getFeeMethod();}@Transientpublic double getMultiplier() {return listing.getMultiplier();}@Transientpublic double getTickValue() {return listing.getTickValue();}@Transientpublic double getContractSize() {return listing.getContractSize();}@Transientpublic double getTickSize() {return listing.getTickSize();}@Transientpublic Asset getTradedCurrency() {return listing.getTradedCurrency();}@Transientpublic String getSymbol() {return exchange.toString() + ':' + listing.toString();}@Overridepublic String toString() {return getSymbol();}public static Market forSymbol(String marketSymbol) {for (Market market : findAll()) {if (market.getSymbol().equalsIgnoreCase(marketSymbol))return market;}return null;}public static List<String> allSymbols() {List<String> result = new ArrayList<>();List<Market> markets = PersistUtil.queryList(Market.class, "select m from Market m");for (Market market : markets)result.add((market.getSymbol()));return result;}public static class MarketAmountBuilder {public DiscreteAmount fromPriceCount(long count) {return priceBuilder.fromCount(count);}public DiscreteAmount fromVolumeCount(long count) {return volumeBuilder.fromCount(count);}public DiscreteAmount fromPrice(BigDecimal amount, RemainderHandler remainderHandler) {return priceBuilder.fromValue(amount, remainderHandler);}public DiscreteAmount fromVolume(BigDecimal amount, RemainderHandler remainderHandler) {return volumeBuilder.fromValue(amount, remainderHandler);}public MarketAmountBuilder(double priceBasis, double volumeBasis) {this.priceBuilder = DiscreteAmount.withBasis(priceBasis);this.volumeBuilder = DiscreteAmount.withBasis(volumeBasis);}private final DiscreteAmount.DiscreteAmountBuilder priceBuilder;private final DiscreteAmount.DiscreteAmountBuilder volumeBuilder;}public MarketAmountBuilder buildAmount() {if (marketAmountBuilder == null)marketAmountBuilder = new MarketAmountBuilder(getPriceBasis(), getVolumeBasis());return marketAmountBuilder;}// JPAprotected Market() {}protected void setExchange(Exchange exchange) {this.exchange = exchange;}protected void setListing(Listing listing) {this.listing = listing;}protected void setActive(boolean active) {this.active = active;}protected void setPriceBasis(double quoteBasis) {this.priceBasis = quoteBasis;}protected void setVolumeBasis(double volumeBasis) {this.volumeBasis = volumeBasis;}private Market(Exchange exchange, Listing listing, double priceBasis, double volumeBasis) {this.exchange = exchange;this.listing = listing;this.priceBasis = priceBasis;this.volumeBasis = volumeBasis;this.active = true;}private Exchange exchange;//交易所private Listing listing;//挂牌清单private double priceBasis;//基准价格private double volumeBasis;//基准量private boolean active;//是否活跃private MarketAmountBuilder marketAmountBuilder;
}

程序员的量化交易之路(25)--Cointrader之MarketData市场数据实体(12)相关推荐

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

    其实,一直对量化交易有一定的理解和情节.早在中大读研究生的时候实验室师兄,已经去了中国平安核心投资团队,做高频交易研究的国源师兄的影响,就开始对金融世界产生了浓厚的兴趣.看了丁磊编著的<量化投资 ...

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

    转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/ Lean引擎的模块划分非常的规范.其中DataFeed是数据槽,就是供应数 ...

  3. 程序员的量化交易之路(17)--Cointrader之Temporal实体(5)

    转载需要注明:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 这一小节说明一个时间实体Temporal实体,它的代码很简单. packa ...

  4. 程序员的量化交易之路(26)--Cointrader之Listing挂牌实体(13)

    转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top Listing:挂牌.比如某只股票在某证 ...

  5. 程序员转行量化交易可行吗?

    程序员转量化交易,其实是一件挺顺理成章的事,有一位网友他想向我佐证一下,职业量化交易这一条路,他可以做下去吗,以及其它一些细枝末节的问题. 他以前是某日系合资企业的程序工程师,程序背景是C++与pyt ...

  6. 热议:程序员转行量化交易可行吗?

    程序员转量化交易,其实是一件挺顺理成章的事,就在上周,有一位网友来我的店里拜访我,其实他来的目的也特别简单,他想向我佐证一下,职业量化交易这一条路,他可以做下去吗,以及其它一些细枝末节的问题. 他以前 ...

  7. 程序员的量化交易(34)--QuantConnect_Lean如何定义Indicator指标2

    转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/ 指标(Indicator)由三大关键组件组成: 1. 实现你指标的类 2. ...

  8. Android从程序员到架构师之路3

    本文学习自高焕堂老师的Android从程序员到架构师之路系列教学视频 40 - 认识线程(Thread)模式a 1. 线程(Thread)概念 所谓线程(Thread) 是指一串连续的执行动作,以达成 ...

  9. 剖析Android移动开发程序员的职业发展之路

    剖析Android移动开发程序员的职业发展之路 做Android移动开发已经有三年时间,其中甘苦自知,对Android开发和对Android程序员的职业发展有一些自己的感悟,在这里愿与大家分享和讨论. ...

最新文章

  1. 人工智能正在引领全球企业的创新
  2. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
  3. Thinkphp 关联模型和试图模型区别
  4. ansys流固耦合分析与工程实例_ansys workbench 流固耦合教程
  5. MySQL的SQL 语句:根据从表记录个数对主表排序
  6. php 打包下载网络图片,php多张图片打包下载
  7. mysql隐式锁_innodB的隐式锁
  8. maven配置smartupload_用jspsmartupload实现Jsp多文件上传下载,并解...
  9. 信息学奥赛 java C 选_信息学奥赛(NOIP)入门指南(新家长必读)
  10. k8s部署-43-带你深入学习ingress-nginx(下)
  11. cdr怎么做文字路径_CorelDRAW如何制作环绕圆形的路径文字
  12. Html论坛提问页面,技术分享 - 制作论坛发帖页面(采用html()方式、操作节点的方式)...
  13. 升级鸿蒙的具体时间,华为鸿蒙系统升级时间表
  14. GIT 命令学习:获取与创建项目
  15. 智能扫描王 v1.0.0
  16. Nikon Capture NX2.2.6下载及破解方法
  17. SAP FICO CBS接口-银企直连联盟收款功能开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)
  18. POI - Excel 打印配置
  19. java计算机毕业设计商场VIP管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  20. Cytoskeleton——SiR-肌动蛋白相关工具推荐

热门文章

  1. 《虚拟化与云计算》读书感(四)数据中心的设计和构造
  2. grep 正则表达式
  3. 探索 Swift 中的 MVC-N 模式
  4. SoJpt Boot 2.3-3.8 发布,Spring Boot 使用 Jfinal 特性极速开发
  5. MySql练习题参考答案
  6. 《微信公众平台应用开发实战(第2版)》一导读
  7. [翻译] DSL和模型驱动开发的最佳实践(3/4)
  8. Win7下用VS2010编译QGIS2.9.0
  9. android 初始化语言,3.4.1 Android初始化语言(1)
  10. 静茹docker容器的几种方法_Docker介绍及使用