private void HandleRequestCommand(BotCommand cmd, User sender)
        {
            var quantitySign = cmd["action"].Equals("buy", StringComparison.InvariantCultureIgnoreCase) ?
                               1 : -1;
            var request = new RfqQuoteRequest(
                cmd["requestId"],
                cmd["requestParty"],
                cmd["counterParty"],
                cmd["product"],
                null,
                quantitySign * ParseQuantity(cmd["quantity"]).Value,
                ParseExpiry(cmd.Get("requestExpirationDate")));

            lock (mx_)
            {
                if (!counterPartiesTrackingRequestsFromRequestParties_.Contains(request.CounterParty))
                {
                    return;
                }
            }

            // rfq [email protected]:1 at [email protected] buy 100m GBP/EUR (15 min)
            // rfq [email protected]:1 at [email protected] buy 100m GBP/EUR
            RaiseQuoteRequestReceived(request);
        }
        private void RaiseQuoteRequestReceived(RfqQuoteRequest request)
        {
            Logger.InfoFormat("Quote request received: {0}", request);

            var handler = QuoteRequestReceived;

            if (handler != null)
            {
                handler(this, new Event <RfqQuoteRequest>(request));
            }
        }
        private void RaiseQuoteRequestReceived(RfqQuoteRequest quoteRequest)
        {
            Logger.InfoFormat("Quote request received: {0}", quoteRequest);

            lock (mx_)
            {
                if (!quoteRequestSubscriptions_.Contains(quoteRequest.CounterParty))
                {
                    return;
                }
            }

            var handler = QuoteRequestReceived;

            if (handler != null)
            {
                handler(this, new Event <RfqQuoteRequest>(quoteRequest));
            }
        }