Gatea Record / Playback Platform
In the high-speed world of Market Data, being able to capture, playback and transform data has become a crucial part of today's application and business development.
Developers and systems managers can now leverage these capabilities using the Gatea Record / Playback Platform to ensure functionality as well baseline application thresholds and scaling necessities. The platform helps you answer the "what if" scenarios before they impact your production environment and business.
Using the platform you may:
- Run 24x7 market data service : Develop and test whenever you want
- Record multiple vendors - e.g. Bloomberg, Refinitiv - on same tape
- Record from one or more geographical sites - e.g. NY and LON - to same tape
- Transform or Warp the datafeed using the embedded Python Interpreter
- Python class libraries and source code supplied with the platform
- Many examples in Python included
- Stress test downstream algo-based apps, for example:
- Stochastically Flip Bid / Ask
- Stochastically Widen Bid / Ask Spread
- Enrich your plain vendor-based feed with your own calculations:
- VWAP / TWAP (Time-Weighed Bid / Ask)
- Index Calculator
- Block Trade Publisher
- Daily Hi/Lo Publisher : Any ticker hitting High or Low for the day
- CandleBar Publisher : Open, High, Low, Close, Vol eadh minute
- Vendor Comparison : Exchange Top of Book vs SIP
gateaRecorder
The gateaRecorder records real-time market data from any service on the TREP or Gatea MD-Direct platform and writes to a proprietary tape. The tape is then read by the gateaReplay server and played back into either platform using any of the following parameters:
- Time : Real-time or delayed
- Rate : Recorded or user-defined (faster or slower)
- Content : Recorded or warped
Change Log
Build 20 - 22-06-14
- MDD BDS
- Clean shutdown on WIN32
- CgateaRecorderDlg.Stop() : No ExitProcess()
- Hook SubChannel::OnDead() and record it
- Check max name length:
- Reject in IGLrecChan.AddRecord() if too long
- TapeLocker : ::int64_t _spinMtx
- ---------------— NEW LIBMDDWIRE ---------------—
- Consume Unpacked Field List
Build 19 - 21-12-16
- GLrecControl._GetTicker():
- Allow Ticker or Name : _rec_pAttrTkr / _rec_pAttrName
- GLxmlElem.getXxxValue_c()
Build 18 - 20-06-18
- libUPA : Reactor 5-min TTL:
- RSSL_RC_CET_FD_CHANGE : Do nothing ...
- Reactor.cpp : _empty
- GFC2
- Control on a per-channel basis:
- _rec_pAttrChan
- ModParams._chan
- GLvecIrecChan &GLrecControl._iChans
Build 17 - 20-03-22
- ETA, not UPA
- TREP.Auth.xxx -> GLrecSubDef._trepAuthXxx
- Reactor, etc.
- pwrite() :
- Pwrite *GLrecTape._pwrite
- GLrecChanDef._bPwrite -> Sentinel._bPwrite
- Cloud :
- GLthread.SetName()
Build 16 - 19-04-02
- <Chain name="0#AAPL*.U">
- Nested Chain class in GLrecMDDChan / GLrecUPAChan
- IGLrecChan.AddChain()
- core at 00:05 next day:
- Multi-BDS adding unsynchronized
- IGLrecChan.AddRecordBDS()
- IGLrecChan._bdsAdd
Build 15 - 18-12-13
- unsynchronized LockedInsert() w/ 2+ threads
- GLrecTape._nThr, not _dlg.thrRt().size() : DUH!!
- VS2017
Build 14 - 18-10-29
- core at startup - libUPA:
- Mutex-protect Service._pending in OpenPending(), AddStream(), etc.
Build 13 - 18-09-13
- GLTime.parse() bug fix : Tape.EOD
- core at rollover:
- GLrecTape._Insert() : Update TapeRecAndIdx._idx if rollover
Build 12 - 18-07-13
- License
- BDS
- GLrecUPAChan.OnSymbol()
- GLrecUPAChan.OnWorkerThread()
- TREP.BDS = ( Service,Ticker ) = GLrecSubDef.TrepBDS()
Build 11 - 18-03-11
- Multi-day index bug:
- GLrecTape.CheckFile() : Reset all _curIdx
Build 10 - 18-03-05
- EOD stuff:
- GLrecTape.RollEOD()
- CgateaRecorderDawg
- GLrecChanDef._tEOD
- GLrecTape.CheckFile() : Bool
- CheckFile() from consumer channel(s):
- OnIdle() / SetIdleCallback()
- Multi-day:
- TapeRecAndIdx
- Sentinel
- GLrecDailyHdr
- Bug : Log CPU regardless of latency logging in TapeDawg - DUH!!
-$ core : Bringing down GLrecRtThread:
- delete _gls in GLrecRtThread.onThreadEnd(), not run()
Build 9 - 18-02-06
- Disconnect :
- TREP.Bias -> GLrecSubDef._bias -> GLrecUPAChan.SetBias()
- upaLogTy_PING
- TREP.PingThread
Build 8 - 18-01-09
- Not opening all items:
- > 600K tickers in tape:
- u_int64_t GLrecTape._RecSiz()
- _spinMtx fuck up:
- Lock : ATOMIC_CMP_EXCH( &_spinMtx, 0, 1 )
- Unlock : ATOMIC_CMP_EXCH( &_spinMtx, 1, 0 )
Build 7 - 17-12-15
- libMDDplatform : #ifdef UPA
- Multiple consumer channels:
- GLrecTapeRec._channelID
- GLrecTape.LockedInsert() if > 1 channel; Else Insert()
- GLrecSubDef
- GLvecRtThread
- Tape.SpinLock - GLrecTape._spinMtx
- Performance:
- Subscriber : SocketBufSizK
- Subscriber : ParseFieldList
- Tape.LockWindow
- Tape.EnableRecIdx
- Tape.HugePages
- No htonl() and friends
-$ libUPA : Connect channel in libUPA library thread
- UPA_Start() : SubChannel.Start(), not Connect()
2 channel performance : 334K msg/sec
Build 6 - 16-12-15
- Load tickers from <Ticker name="xxx"> or
- RTEDGE::SubChannel::SetUserStreamID()
Build 5 - 16-10-03
- Native GLrecTapeMsg struct:
- pack (push,1 )
- uint32_t GLrecTapeMsg._xxx : No htonl
Build 4 - 16-09-27
- gateaRecorder:
- IGLrecChan
- GLrecTapeHdr._type : UPA | MDDirect
- IGLrecChan.Modify()
- IGLrecChan._LoadDictFromFile()
- GLrecTape.Insert( mddBuf, bImg )
Build 3 - 16-07-11
- EOD handling:
- GLrecTapeHdr._tCreate
- GLrecTapeHdr._tEOD
- GLrecTape.CheckFile()
- GLrecTape.NewFile()
- GLrecTape.CloseFile()
Build 2 - 16-05-22
- Modify values:
- SDS:
- GLrecTapeRec._tDly
- XML loader w/ delay interval
- GLrecTapeHdr._curTime
Build 1 - 16-05-12
- Created