程序猿的量化交易之路(26)--Cointrader之Listing挂牌实体(13)
转载须注明出处:http://blog.csdn.net/minimicall?
viewmode=contents,http://cloudtrade.top
Listing:挂牌。
比方某仅仅股票在某证券交易所挂牌交易。也就是上市交易。
老规矩,通过源代码学习:
package org.cryptocoinpartners.schema; import java.util.ArrayList;
import java.util.List; import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
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; /**
* Represents the possibility to trade one Asset for another
*/
@SuppressWarnings("UnusedDeclaration")
@Entity //在数据库创建Listing这个表
@Cacheable//可缓存
//命名查询
@NamedQueries({ @NamedQuery(name = "Listing.findByQuoteBase", query = "select a from Listing a where base=?1 and quote=?2 and prompt IS NULL"),
@NamedQuery(name = "Listing.findByQuoteBasePrompt", query = "select a from Listing a where base=?1 and quote=?2 and prompt=?3") })
@Table(indexes = { @Index(columnList = "base"), @Index(columnList = "quote"), @Index(columnList = "prompt") })
//@Table(name = "listing", uniqueConstraints = { @UniqueConstraint(columnNames = { "base", "quote", "prompt" }),
//@UniqueConstraint(columnNames = { "base", "quote" }) })
public class Listing extends EntityBase {
<pre name="code" class="java"> protected Asset base;
protected Asset quote;
private Prompt prompt;
@ManyToOne(optional = false)
//@Column(unique = true)
public Asset getBase() {
return base;
} @PostPersist
private void postPersist() {
// PersistUtil.clear();
// PersistUtil.refresh(this);
//PersistUtil.merge(this);
// PersistUtil.close();
//PersistUtil.evict(this); } @ManyToOne(optional = false)
//@Column(unique = true)
public Asset getQuote() {
return quote;
} @ManyToOne(optional = true)
public Prompt getPrompt() {
return prompt;
} /** will create the listing if it doesn't exist */
public static Listing forPair(Asset base, Asset quote) { try {
Listing listing = PersistUtil.namedQueryZeroOne(Listing.class, "Listing.findByQuoteBase", base, quote);
if (listing == null) {
listing = new Listing(base, quote);
PersistUtil.insert(listing);
}
return listing;
} catch (NoResultException e) {
final Listing listing = new Listing(base, quote);
PersistUtil.insert(listing);
return listing;
}
} public static Listing forPair(Asset base, Asset quote, Prompt prompt) {
try { Listing listing = PersistUtil.namedQueryZeroOne(Listing.class, "Listing.findByQuoteBasePrompt", base, quote, prompt);
if (listing == null) {
listing = new Listing(base, quote, prompt);
PersistUtil.insert(listing);
}
return listing;
} catch (NoResultException e) {
final Listing listing = new Listing(base, quote, prompt);
PersistUtil.insert(listing);
return listing;
}
} @Override
public String toString() {
return getSymbol();
} @Transient
public String getSymbol() {
if (prompt != null)
return base.getSymbol() + '.' + quote.getSymbol() + '.' + prompt;
return base.getSymbol() + '.' + quote.getSymbol();
} @Transient
protected double getMultiplier() {
if (prompt != null)
return prompt.getMultiplier();
return getContractSize() * getTickSize();
} @Transient
protected double getTickValue() {
if (prompt != null)
return prompt.getTickValue();
return 1;
} @Transient
protected double getContractSize() {
if (prompt != null)
return prompt.getContractSize();
return 1;
} @Transient
protected double getTickSize() {
if (prompt != null)
return prompt.getTickSize();
return getPriceBasis();
} @Transient
protected Amount getMultiplierAsAmount() { return new DiscreteAmount((long) getMultiplier(), getVolumeBasis());
} @Transient
protected double getVolumeBasis() {
double volumeBasis = 0;
if (prompt != null)
volumeBasis = prompt.getVolumeBasis();
return volumeBasis == 0 ? getBase().getBasis() : volumeBasis; } @Transient
public FeeMethod getMarginMethod() {
FeeMethod marginMethod = null;
if (prompt != null)
marginMethod = prompt.getMarginMethod();
return marginMethod == null ? null : marginMethod; } @Transient
public FeeMethod getMarginFeeMethod() {
FeeMethod marginFeeMethod = null;
if (prompt != null)
marginFeeMethod = prompt.getMarginFeeMethod();
return marginFeeMethod == null ? null : marginFeeMethod; } @Transient
protected double getPriceBasis() {
double priceBasis = 0;
if (prompt != null)
priceBasis = prompt.getPriceBasis();
return priceBasis == 0 ? getQuote().getBasis() : priceBasis; } @Transient
protected Asset getTradedCurrency() {
if (prompt != null && prompt.getTradedCurrency() != null)
return prompt.getTradedCurrency();
return getQuote();
} @Transient
public FeeMethod getFeeMethod() {
if (prompt != null && prompt.getFeeMethod() != null)
return prompt.getFeeMethod();
return null;
} @Transient
public double getFeeRate() {
if (prompt != null && prompt.getFeeRate() != 0)
return prompt.getFeeRate();
return 0;
} @Transient
protected int getMargin() {
if (prompt != null && prompt.getMargin() != 0)
return prompt.getMargin();
return 0;
} public static List<String> allSymbols() {
List<String> result = new ArrayList<>();
List<Listing> listings = PersistUtil.queryList(Listing.class, "select x from Listing x");
for (Listing listing : listings)
result.add((listing.getSymbol()));
return result;
} // JPA
protected Listing() {
} protected void setBase(Asset base) {
this.base = base;
} protected void setQuote(Asset quote) {
this.quote = quote;
} protected void setPrompt(Prompt prompt) {
this.prompt = prompt;
} public Listing(Asset base, Asset quote) {
this.base = base;
this.quote = quote;
} public Listing(Asset base, Asset quote, Prompt prompt) {
this.base = base;
this.quote = quote;
this.prompt = prompt;
} public static Listing forSymbol(String symbol) {
symbol = symbol.toUpperCase();
final int dot = symbol.indexOf('.');
if (dot == -1)
throw new IllegalArgumentException("Invalid Listing symbol: \"" + symbol + "\"");
final String baseSymbol = symbol.substring(0, dot);
Asset base = Asset.forSymbol(baseSymbol);
if (base == null)
throw new IllegalArgumentException("Invalid base symbol: \"" + baseSymbol + "\"");
int len = symbol.substring(dot + 1, symbol.length()).indexOf('.');
len = (len != -1) ? Math.min(symbol.length(), dot + 1 + symbol.substring(dot + 1, symbol.length()).indexOf('.')) : symbol.length();
final String quoteSymbol = symbol.substring(dot + 1, len);
final String promptSymbol = (symbol.length() > len) ? symbol.substring(len + 1, symbol.length()) : null;
Asset quote = Asset.forSymbol(quoteSymbol);
if (quote == null)
throw new IllegalArgumentException("Invalid quote symbol: \"" + quoteSymbol + "\"");
if (promptSymbol == null)
return Listing.forPair(base, quote);
Prompt prompt = Prompt.forSymbol(promptSymbol);
return Listing.forPair(base, quote, prompt);
} @Override
public boolean equals(Object obj) {
if (obj instanceof Listing) {
Listing listing = (Listing) obj; if (!listing.getBase().equals(getBase())) {
return false;
} if (!listing.getQuote().equals(getQuote())) {
return false;
}
if (listing.getPrompt() != null)
if (this.getPrompt() != null) {
if (!listing.getPrompt().equals(getPrompt()))
return false;
} else {
return false;
} return true;
} return false;
} @Override
public int hashCode() {
return getPrompt() != null ? getQuote().hashCode() + getBase().hashCode() + getPrompt().hashCode() : getQuote().hashCode() + getBase().hashCode(); } }
protected Asset base;
protected Asset quote;
private Prompt prompt;
程序猿的量化交易之路(26)--Cointrader之Listing挂牌实体(13)的更多相关文章
- 程序猿的量化交易之路(13)--Cointrader类图(1)
转载须注明出处:http://blog.csdn.net/minimicall? viewmode=contents, htpp://cloudtrader.top 今天開始正式切入到Cointrad ...
- 程序猿的量化交易之路(20)--Cointrader之Assert实体(8)
转载需说明出处:http://blog.csdn.net/minimicall, http://cloudtrade.top 不论什么可交易的都能够称之为Assert,资产.其类代码例如以下: pac ...
- 程序猿的量化交易之路(29)--Cointrader之Tick实体(16)
转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top Tick:什么是Tick,在交易平台中很常见,事实上就 单笔交易时某仅仅证券 ...
- 程序猿的量化交易之路(24)--Cointrader之RemoteEvent远程事件实体(11)
转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 在量化交易系统中.有些事件是远端传来的,比方股票的价格数据等.所以,在这 ...
- 程序猿的量化交易之路(30)--Cointrader之ConfigUtil(17)
转载须注明出处:viewmode=contents">http://blog.csdn.net/minimicall?viewmode=contents.http://cloudtra ...
- 程序猿的量化交易之路(32)--Cointrade之Portfolio组合(19)
转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ Portfolio:组合,代表的是多个 ...
- 程序猿的量化交易之路(27)--Cointrader之PriceData价格数据(14)
转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ PriceData:价格数据.价格数据 ...
- 程序猿的量化交易之路(18)--Cointrader之Event实体(6)
转载需注明: 事件,是Esper的重要概念. 这里我们定义个事件类.它是Temporal实体的派生类. 不过对Temporal简单的包装.其代码例如以下: package org.cryptocoin ...
- 程序猿的量化交易之路(21)--Cointrader之Currency货币实体(9)
转载须注明出自:http://blog.csdn.net/minimicall? viewmode=contents,http://cloudtrader.top 货币,Cointrader中基本实体 ...
随机推荐
- [转]apache下htaccess不起作用,linux,windows详解
可能出现下面这三种的错误可能性: 第一种:启用 rewrite 和 .htaccess 设置 rewrite设置:找到apache的配置文件httpd.conf文件,找到:#LoadModule re ...
- 一、Nginx配置文件详解
配置文件介绍 主要有两部分:分别是 main:主体部分 http{}:虚拟主机配置部分 配置指令主要以分号结尾:配置语法:directive value1 [value2 ....] 支持使用的变量 ...
- Google出品的自动Web安全扫描程序 Skipfish 下载及安装使用方法
Skipfish是由google出品的一款自动化的网络安全扫描工具,该工具可以安装在linux.freebsd.MacOS X系统和windows(cygwin). 谷歌工程师Michal Zalew ...
- MAMP:在 OSX 中搭建 Apache, MySQL, PHP 环境并本地安装、调试 WordPress
MAMP 这个名字来源于 Macintosh Apache MySQL PHP,显然专门用来在 Mac 环境下搭建 Apache.MySQL.PHP 平台. 虽然 OSX 中已经预装了 Apache ...
- gitflow 在windows下的安装方法
Git flow是git的一个扩展集,它基于Vincent Driessen的分支模型,可以用来简化代码的版本发布流程. 本文讲述如何为msysgit安装git flow. 下载getopt.exe ...
- Flexigrid的编辑功能
editCells:function(){ if(!isEditing){ isEditing = true; $('tbody tr',$(t)).each(function () { for(va ...
- PHP - 遍历文件夹下的所有文件名
/** * * 函数名:myreaddir($dir) * 作用:读取目录所有的文件名 * 参数:$dir 目录地址 * 返回值:文件名数组 * * */ function myreaddir($di ...
- perl use utf8
utf8 Perl编译 来启用/禁用 UTF-8(or UTF-EBCDIC) 在源代码里 简洁: use utf8; no utf8; # Convert the internal represen ...
- 基于visual Studio2013解决C语言竞赛题之1039移动
题目 解决代码及点评 /* 39. 有n个整数,编程序将前面的各个数依次向后移动k个位置, 最后k个数移到最前边的k个位置(见下图,其中n=8,k=3). */ # ...
- Apache服务器学习笔记
Apache服务器知识 首先我们要知道一共有那几个程序在监听网络端口,即与网络保持活跃连接,打开CMD命令窗口 输入: netstat –an 指令就能显示出所有与网络保持连接的程序,输入net s ...