转载须注明出处: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;}@PostPersistprivate 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;}}@Overridepublic String toString() {return getSymbol();}@Transientpublic String getSymbol() {if (prompt != null)return base.getSymbol() + '.' + quote.getSymbol() + '.' + prompt;return base.getSymbol() + '.' + quote.getSymbol();}@Transientprotected double getMultiplier() {if (prompt != null)return prompt.getMultiplier();return getContractSize() * getTickSize();}@Transientprotected double getTickValue() {if (prompt != null)return prompt.getTickValue();return 1;}@Transientprotected double getContractSize() {if (prompt != null)return prompt.getContractSize();return 1;}@Transientprotected double getTickSize() {if (prompt != null)return prompt.getTickSize();return getPriceBasis();}@Transientprotected Amount getMultiplierAsAmount() {return new DiscreteAmount((long) getMultiplier(), getVolumeBasis());}@Transientprotected double getVolumeBasis() {double volumeBasis = 0;if (prompt != null)volumeBasis = prompt.getVolumeBasis();return volumeBasis == 0 ? getBase().getBasis() : volumeBasis;}@Transientpublic FeeMethod getMarginMethod() {FeeMethod marginMethod = null;if (prompt != null)marginMethod = prompt.getMarginMethod();return marginMethod == null ? null : marginMethod;}@Transientpublic FeeMethod getMarginFeeMethod() {FeeMethod marginFeeMethod = null;if (prompt != null)marginFeeMethod = prompt.getMarginFeeMethod();return marginFeeMethod == null ? null : marginFeeMethod;}@Transientprotected double getPriceBasis() {double priceBasis = 0;if (prompt != null)priceBasis = prompt.getPriceBasis();return priceBasis == 0 ? getQuote().getBasis() : priceBasis;}@Transientprotected Asset getTradedCurrency() {if (prompt != null && prompt.getTradedCurrency() != null)return prompt.getTradedCurrency();return getQuote();}@Transientpublic FeeMethod getFeeMethod() {if (prompt != null && prompt.getFeeMethod() != null)return prompt.getFeeMethod();return null;}@Transientpublic double getFeeRate() {if (prompt != null && prompt.getFeeRate() != 0)return prompt.getFeeRate();return 0;}@Transientprotected 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;}// JPAprotected 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);}@Overridepublic 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;}@Overridepublic 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)相关推荐

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

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

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

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

  3. 程序员的量化交易之路(25)--Cointrader之MarketData市场数据实体(12)

    转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/ 前面一节我们说到了远端事件.其中,市场数据就属于远端事件.市场数据有什么? ...

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

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

  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. Nature:将光计算与AI推理整合,实现高速高带宽低功耗AI计算
  2. 性价比高出英特尔45%,亚马逊的云服务器芯片如何做到?| 解读
  3. winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行
  4. UA MATH524 复变函数13 补充:留数计算的例题
  5. 解决go包管理代理网址无法访问:proxy.golang.org 换成goproxy.cn
  6. 贷款审批时,会重点看征信报告哪些内容?
  7. 如何通过RFID开发来迎接第四次工业革命(转)
  8. java基础英语---第二十六天
  9. ios html5上架,iOS原生集成H5+详细流程
  10. 企业实战_21_MyCat_keepalived 安装配置验证
  11. 2021年中国移动游戏行业深度洞察报告
  12. uploadify 3.2 后台动态传参数
  13. 用C语言扩展lua模块(入门)
  14. 一位编辑人员给作者们的市场汇报——冰冰子组织的市场宣传活动介绍之交互设计篇
  15. 关于色域与BT.2020相关学习心得笔记
  16. 计算机组成原理教程,计算机组成原理教程(第6版)
  17. 如何用十步写一首原创歌曲
  18. 在线html5编辑器uedit,ueditor集成秀米编辑器 - HTML - php中文网博客
  19. 教你使用SQLite Autoincrement(自动递增)
  20. 学习笔记——FPGA芯片主要资源介绍

热门文章

  1. 第十四届蓝桥杯三月真题刷题训练——第 10 天
  2. paip 网站扫描安全工具hp WebInspect 使用指南
  3. PHP rsa私钥pkcs8加密,Openssl rsa私钥的PKCS#1和PKCS#8格式以及加密和转化
  4. 抖音小程序表情包生成器
  5. Set集合框架的概述及应用
  6. 章子怡汪峰深夜吃火锅
  7. 淘宝顶部导航——待解决的问题——已解决
  8. 矩阵动力-基于web控制的灌溉小车
  9. 工业机器人、工艺夹具、送料机械手、电火花镗磨机床、半自动钻床、机械手、套筒、铣床升降台、精密播种机、卧式组合钻床、六自由度微动机器人、花生收获机、山茶采摘平台、车载起重机、锤式破碎机、螺旋输送机……
  10. 2023计算机毕业设计SSM最新选题之javaJava青年志愿者信息管理系统15925