/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product;
import com.google.common.collect.ImmutableSet;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.currency.Currency;
/**
* A security that can be traded.
* <p>
* A security is one of the building blocks of finance, representing a fungible instrument that can be traded.
* This is intended to cover instruments such as listed equities, bonds and exchange traded derivatives (ETD).
* Within Strata, a financial instrument is a security if it is a standardized
* exchange-based contract that can be referenced by a {@link SecurityId}.
* The security can be looked up in {@link ReferenceData} using the identifier.
* <p>
* It is intended that Over-The-Counter (OTC) instruments, such as an interest rate swap,
* are embedded directly within the trade, rather than handled as one-off securities.
* <p>
* Implementations of this interface must be immutable beans.
*/
public interface Security {
/**
* Gets the standard security information.
* <p>
* All securities contain this standard set of information.
* It includes the identifier, information about the price and an extensible data map.
*
* @return the security information
*/
public abstract SecurityInfo getInfo();
/**
* Gets the security identifier.
* <p>
* This identifier uniquely identifies the security within the system.
*
* @return the security identifier
*/
public default SecurityId getSecurityId() {
return getInfo().getId();
}
/**
* Gets the currency that the security is traded in.
*
* @return the trading currency
*/
public default Currency getCurrency() {
return getInfo().getPriceInfo().getCurrency();
}
/**
* Gets the set of underlying security identifiers.
* <p>
* The set must contain all the security identifiers that this security directly refers to.
* For example, a bond future will return the identifiers of the underlying basket of bonds,
* but a bond future option will only return the identifier of the underlying future, not the basket.
*
* @return the underlying security identifiers
*/
public abstract ImmutableSet<SecurityId> getUnderlyingIds();
//-------------------------------------------------------------------------
/**
* Creates the product associated with this security.
* <p>
* The product of a security is distinct from the security.
* The product includes the financial details from this security,
* but excludes the additional information.
* The product also includes the products of any underlying securities.
*
* @param refData the reference data used to find underlying securities
* @return the product
* @throws UnsupportedOperationException if the security does not contain information about the product model
*/
public abstract SecuritizedProduct createProduct(ReferenceData refData);
/**
* Creates a trade based on this security.
* <p>
* This creates a trade of a suitable type for this security.
*
* @param tradeInfo the trade information
* @param quantity the number of contracts in the trade
* @param tradePrice the price agreed when the trade occurred
* @param refData the reference data used to find underlying securities
* @return the trade
*/
public abstract Trade createTrade(
TradeInfo tradeInfo,
double quantity,
double tradePrice,
ReferenceData refData);
}