247 lines
8.3 KiB
C++
247 lines
8.3 KiB
C++
/*
|
|
* Legal Notice
|
|
*
|
|
* This document and associated source code (the "Work") is a part of a
|
|
* benchmark specification maintained by the TPC.
|
|
*
|
|
* The TPC reserves all right, title, and interest to the Work as provided
|
|
* under U.S. and international laws, including without limitation all patent
|
|
* and trademark rights therein.
|
|
*
|
|
* No Warranty
|
|
*
|
|
* 1.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE INFORMATION
|
|
* CONTAINED HEREIN IS PROVIDED "AS IS" AND WITH ALL FAULTS, AND THE
|
|
* AUTHORS AND DEVELOPERS OF THE WORK HEREBY DISCLAIM ALL OTHER
|
|
* WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
|
|
* INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) IMPLIED WARRANTIES,
|
|
* DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
|
|
* PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OF
|
|
* WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF NEGLIGENCE.
|
|
* ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT,
|
|
* QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT
|
|
* WITH REGARD TO THE WORK.
|
|
* 1.2 IN NO EVENT WILL ANY AUTHOR OR DEVELOPER OF THE WORK BE LIABLE TO
|
|
* ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING BUT NOT LIMITED TO THE
|
|
* COST OF PROCURING SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS
|
|
* OF USE, LOSS OF DATA, OR ANY INCIDENTAL, CONSEQUENTIAL, DIRECT,
|
|
* INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER CONTRACT, TORT, WARRANTY,
|
|
* OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY OTHER AGREEMENT
|
|
* RELATING TO THE WORK, WHETHER OR NOT SUCH AUTHOR OR DEVELOPER HAD
|
|
* ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
*
|
|
* Contributors
|
|
* - Sergey Vasilevskiy, Doug Johnson
|
|
*/
|
|
|
|
/******************************************************************************
|
|
* Description: This class represents an extension of the
|
|
* MEEApproximation class orginally written by Sergey for
|
|
* EGenLoader.
|
|
* This new class now provides additional functionality
|
|
* for use at runtime by the MEE as well. All of the
|
|
* price/time functionality needed to emulate a securities
|
|
* behavior in the market is captured here.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#ifndef MEE_SECURITY_H
|
|
#define MEE_SECURITY_H
|
|
|
|
#include "utilities/EGenUtilities_stdafx.h"
|
|
#include "TradeTypeIDs.h"
|
|
#include "SecurityPriceRange.h"
|
|
|
|
namespace TPCE {
|
|
|
|
class CMEESecurity {
|
|
private:
|
|
CRandom m_rnd;
|
|
CMoney m_fRangeLow; // price range start
|
|
CMoney m_fRangeHigh; // price range end
|
|
CMoney m_fRange; // price range length (high - low)
|
|
int m_iPeriod; // time to get to the same price (in seconds)
|
|
INT32 m_TradingTimeSoFar; // for picking up where we last left off on the
|
|
// price curve
|
|
|
|
CDateTime *m_pBaseTime; // Wall clock time corresponding to m_fInitialTime
|
|
CDateTime *m_pCurrentTime;
|
|
|
|
// Mean delay between Pending and Submission times
|
|
// for an immediatelly triggered (in-the-money) limit
|
|
// order. Calculated outside based on scale factor
|
|
// and the number of customers (e.g. MF rate).
|
|
//
|
|
// The actual delay is randomly calculated in the range
|
|
// [0.5 * Mean .. 1.5 * Mean]
|
|
//
|
|
double m_fMeanInTheMoneySubmissionDelay;
|
|
|
|
/*
|
|
* Calculate the "unique" starting offset
|
|
* in the price curve based on the security ID (0-based)
|
|
* 0 corresponds to m_fRangeLow price,
|
|
* m_fPeriod/2 corresponds to m_fRangeHigh price,
|
|
* m_fPeriod corresponds again to m_fRangeLow price
|
|
*
|
|
* PARAMETERS:
|
|
* IN SecurityIndex - unique security index to generate a unique
|
|
* starting price
|
|
*
|
|
* RETURNS:
|
|
* time from which to calculate initial price
|
|
*/
|
|
inline double InitialTime(TIdent SecurityIndex);
|
|
|
|
/*
|
|
* Negative exponential distribution.
|
|
*
|
|
* PARAMETERS:
|
|
* IN fMean - mean value of the distribution
|
|
*
|
|
* RETURNS:
|
|
* random value according to the negative
|
|
* exponential distribution with the given mean.
|
|
*/
|
|
inline double NegExp(double fMean);
|
|
|
|
/*
|
|
* Calculate time required to move between certain prices
|
|
* with certain initial direction of price change.
|
|
*
|
|
* PARAMETERS:
|
|
* IN fStartPrice - price at the start of the time interval
|
|
* IN fEndPrice - price at the end of the time interval
|
|
* IN iStartDirection - direction (up or down) on the price curve
|
|
* at the start of the time interval
|
|
*
|
|
* RETURNS:
|
|
* seconds required to move from the start price to the end price
|
|
*/
|
|
double CalculateTime(CMoney fStartPrice, CMoney fEndPrice, int iStartDirection);
|
|
|
|
public:
|
|
/*
|
|
* Default constructor (no parameters) to be able
|
|
* to allocate an array of security objects.
|
|
*
|
|
* PARAMETERS:
|
|
* none.
|
|
*
|
|
* RETURNS:
|
|
* not applicable.
|
|
*/
|
|
CMEESecurity();
|
|
|
|
/*
|
|
* Initialize before the first use.
|
|
* Separated from constructor in order to have default (no-parameters)
|
|
* constructor.
|
|
*
|
|
* PARAMETERS:
|
|
* IN TradeTimeSoFar - point where we last left
|
|
* off on the price curve IN pBaseTime - wall clock
|
|
* time corresponding to the initial time for all securities IN pCurrentTime
|
|
* - current time for the security (determines current price) IN
|
|
* fMeanInTheMoneySubmissionDelay - Mean delay between Pending and
|
|
* Submission times for an immediatelly triggered (in-the-money) limit
|
|
* order.
|
|
*
|
|
* RETURNS:
|
|
* none
|
|
*/
|
|
void Init(INT32 TradingTimeSoFar, CDateTime *pBaseTime, CDateTime *pCurrentTime,
|
|
double fMeanInTheMoneySubmissionDelay);
|
|
|
|
/*
|
|
* Calculate price at a certain point in time.
|
|
*
|
|
* PARAMETERS:
|
|
* IN SecurityIndex - unique security index to generate a
|
|
* unique starting price IN fTime - seconds from initial time
|
|
*
|
|
* RETURNS:
|
|
* price according to the triangular function
|
|
* that will be achived at the given time
|
|
*/
|
|
CMoney CalculatePrice(TIdent SecurityIndex, double fTime);
|
|
|
|
/*
|
|
* Calculate current price for the security identified by its index
|
|
* (0-based).
|
|
*
|
|
* PARAMETERS:
|
|
* IN SecurityIndex - unique identifier for the security.
|
|
*
|
|
* RETURNS:
|
|
* price at this point in time given with integer number of cents.
|
|
*/
|
|
CMoney GetCurrentPrice(TIdent SecurityIndex);
|
|
|
|
/*
|
|
* Return minimum price on the price curve for any security.
|
|
*
|
|
* PARAMETERS:
|
|
* none.
|
|
*
|
|
* RETURNS:
|
|
* minimum price given with integer number of cents.
|
|
*/
|
|
CMoney GetMinPrice(void);
|
|
|
|
/*
|
|
* Return maximum price on the price curve for any security.
|
|
*
|
|
* PARAMETERS:
|
|
* none.
|
|
*
|
|
* RETURNS:
|
|
* maximum price given with integer number of cents.
|
|
*/
|
|
CMoney GetMaxPrice(void);
|
|
|
|
/*
|
|
* Calculate triggering time for limit orders.
|
|
*
|
|
* PARAMETERS:
|
|
* IN SecurityIndex - unique security index to generate a
|
|
* unique starting price IN fPendingTime - pending time of the order, in
|
|
* seconds from time 0 IN fLimitPrice - limit price of the order IN
|
|
* TradeType - order trade type
|
|
*
|
|
* RETURNS:
|
|
* the expected submission time
|
|
*/
|
|
double GetSubmissionTime(TIdent SecurityIndex, double fPendingTime, CMoney fLimitPrice, eTradeTypeID TradeType);
|
|
|
|
/*
|
|
* Return the expected completion time and the completion price.
|
|
* Completion time is between 0 and 5 seconds
|
|
* with 1 sec mean.
|
|
*
|
|
* Used to calculate completion time for
|
|
* both limit (first must get submission time)
|
|
* and market orders.
|
|
*
|
|
* Equivalent of MEE function sequence
|
|
* 'receive trade' then 'complete the trade request'.
|
|
*
|
|
* PARAMETERS:
|
|
* IN SecurityIndex - unique security index to generate a
|
|
* unique starting price IN fSubmissionTime - time when the order was
|
|
* submitted, in seconds from time 0 OUT pCompletionPrice - completion
|
|
* price of the order
|
|
*
|
|
* RETURNS:
|
|
* the approximated completion time for the trade
|
|
*
|
|
*/
|
|
double GetCompletionTime(TIdent SecurityIndex, double fSubmissionTime,
|
|
CMoney *pCompletionPrice // output parameter
|
|
);
|
|
};
|
|
|
|
} // namespace TPCE
|
|
|
|
#endif // MEE_SECURITY_H
|