道量化交易程序猿(25)--Cointrader之MarketData市场数据实体(12)
转载注明出处: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;
} // JPA
protected 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());
} @PostPersist
private 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(); } @Transient
public 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;
} @Transient
public Asset getBase() {
return listing.getBase();
} @Transient
public Asset getQuote() {
return listing.getQuote();
} @Transient
public int getMargin() {
return listing.getMargin() == 0 ? exchange.getMargin() : listing.getMargin(); } @Transient
public double getFeeRate() {
return listing.getFeeRate() == 0 ? exchange.getFeeRate() : listing.getFeeRate(); } @Transient
public FeeMethod getMarginFeeMethod() {
return listing.getMarginFeeMethod() == null ? exchange.getMarginFeeMethod() : listing.getMarginFeeMethod(); } @Transient
public FeeMethod getFeeMethod() {
return listing.getFeeMethod() == null ? exchange.getFeeMethod() : listing.getFeeMethod(); } @Transient
public double getMultiplier() {
return listing.getMultiplier(); } @Transient
public double getTickValue() {
return listing.getTickValue(); } @Transient
public double getContractSize() {
return listing.getContractSize(); } @Transient
public double getTickSize() {
return listing.getTickSize(); } @Transient
public Asset getTradedCurrency() {
return listing.getTradedCurrency(); } @Transient
public String getSymbol() {
return exchange.toString() + ':' + listing.toString();
} @Override
public 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;
} // JPA
protected 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)的更多相关文章
- 黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile
------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...
- 《零起点,python大数据与量化交易》
<零起点,python大数据与量化交易>,这应该是国内第一部,关于python量化交易的书籍. 有出版社约稿,写本量化交易与大数据的书籍,因为好几年没写书了,再加上近期"前海智库 ...
- 屌丝程序猿赚钱之道 之APP
假设你已经通过APP赚到了钱,那么本文对你而言没有意义.倒是希望你可以给我们诸多建议. 通过制作APP或者说手机应用赚钱,相信是非常多程序猿希望做的事情.也确实有一些人通过APP赚到了钱. 对于程序猿 ...
- 屌丝程序猿赚钱之道之taobao 2
续上篇,之前写的案例,都是比較0基础的. 案例4: 代写情书.软文.论文等等. 这是我一个同学的真实故事. 我隔壁寝室的小王平时没事就爱谢谢博客.逛逛论坛.大二的时候接触了威客网,開始在网上 ...
- Java程序猿修炼之道 之 Logging(3/3) - 怎么分析Log
1. 说明 作为一个程序猿我们常常要做一件事情:获取某个Log文件,从当中找出自己想要的信息. 本文总结了我在工作中使用了哪些工具来分析Log文件获取我想要的信息,我近期几年的工作环境都是server ...
- 程序猿接私活经验总结,来自csdn论坛语录
下面为网上摘录,以做笔记: 但是到网上看看,似乎接私活也有非常多不easy,技术问题本身是个因素,还有非常多有技术的人接私活时被骗,或者是合作到最后以失败告终,所以想请有经验的大侠们出来指点一下,接私 ...
- 程序猿最浪漫的表白,肯定会得到你的她——Jason niu 原文来自GitHub,本人已部分修改
程序猿最浪漫的表白,肯定会得到你的她——Jason niu 原文来自GitHub,主页本人已部分修改,感谢程序猿大神wuxia2001和hackerzhou的开源,感谢这两位大神! 视频结果展示 ...
- 程序猿职业生涯中的 Norris 常数
我的朋友Clift Norris发现了一个基本常数.我称之为Norris常数,一个未经培训的程序猿在他或她遇到瓶颈之前能写出的平均代码量.Clift预计这个值是1500行. 超过这个数以后,代码会变得 ...
- 漫谈程序猿系列:无BUG不生活
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
随机推荐
- 大话Spark(8)-源码之DAGScheduler
DAGScheduler的主要作用有2个: 一.把job划分成多个Stage(Stage内部并行运行,整个作业按照Stage的顺序依次执行) 二.提交任务 以下分别介绍下DAGScheduler是如何 ...
- [Angular2 Animation] Basic animation
@Component({ selector: 'app-courses', templateUrl: './courses.component.html', styleUrls: ['./course ...
- js进阶 12-5 jquery中表单事件如何使用
js进阶 12-5 jquery中表单事件如何使用 一.总结 一句话总结:表单事件如何使用:可元素添加事件监听,然后监听元素,和javase里面一样. 1.表单获取焦点和失去焦点事件有哪两组? 注意是 ...
- fatal error C1859的有效解决办法
作者:朱金灿来源:http://blog.csdn.net/clever101 在服务器(操作系统为Widows Server2008)上使用VS C++2008编译工程,总是出现这样一个错误:fat ...
- Java 线程第三版 第九章 Thread调度 读书笔记
一.Thread调度的概述 import java.util.*; import java.text.*; public class Task implements Runnable { long n ...
- Android——WebView方式开发web App
昨天接到个酬劳丰厚的任务.把java新生系统做成webApp,想想蛮简单的.所以当时就装作非常为难的样子答应了. 所谓Web App,用曾经我那个老PM的话来说.就是在壳里面套上页面.这里的壳相当于浏 ...
- 数学之路-python计算实战(7)-机器视觉-图像产生加性零均值高斯噪声
图像产生加性零均值高斯噪声.在灰度图上加上噪声,加上噪声的方式是每一个点的灰度值加上一个噪声值.噪声值的产生方式为Box-Muller算法生成高斯噪声. 在计算机模拟中,常常须要生成正态分布的数值.最 ...
- [内核编程] visual studio 2010配置驱动开发环境
visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 ** 配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...
- Redis tomcat
http://blog.csdn.net/fu9958/article/details/17325563 http://my.oschina.net/kolbe/blog/618167 http:// ...
- js进阶 10-9 -of-type型子元素伪类选择器
js进阶 10-9 -of-type型子元素伪类选择器 一.总结 一句话总结:三种和first.last等有关的选择器. 1.:first和:first-child和:first-of-type的区别 ...