Skip to content

Instantly share code, notes, and snippets.

@michaeldiamant
Created June 8, 2012 00:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save michaeldiamant/2892756 to your computer and use it in GitHub Desktop.
Save michaeldiamant/2892756 to your computer and use it in GitHub Desktop.
Extensible trade execution processor
trait ExtensibleTradeExecutionProcessor extends TradeExecutionProcessor {
val requestedTradeRepository: RequestedTradeRepository
val priceMutators: Set[(RequestedTrade, BigDecimal) => BigDecimal]
def process(requestId: String, executionPrice: BigDecimal): Option[ExecutedTrade] =
for {
requestedTrade <- requestedTradeRepository.findById(requestId)
reportedPrice <- priceMutators.foldLeft(executionPrice)((price, mutator) => mutator(requestedTrade, price)).some
} yield
ExecutedTrade(
requestId = requestedTrade.id,
executedPrice = executionPrice,
reportedPrice = reportedPrice
)
}
trait PriceMutators extends MarkupApplicator {
val markingUpSymbol: String
val symbolMarkup: BigDecimal
val markupVolumeThreshold: Long
val volumeMarkup: BigDecimal
def symbolBasedPriceMutator(trade: RequestedTrade, executionPrice: BigDecimal): BigDecimal =
(trade.symbol == markingUpSymbol)
.option(addMarkup(trade.side, executionPrice, symbolMarkup))
.getOrElse(executionPrice)
def volumeThresholdPriceMutator(trade: RequestedTrade, executionPrice: BigDecimal): BigDecimal =
(trade.volume <= markupVolumeThreshold)
.option(addMarkup(trade.side, executionPrice, volumeMarkup))
.getOrElse(executionPrice)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment