/// <summary> /// /// </summary> public void Quotes(string symbol, int operationId, double ask, double bid, double open, double close, double low, double high, double volume, double time) { TracerHelper.TraceEntry(); CombinedDataSubscriptionInformation session = GetDataSession(symbol); if (session == null) { SystemMonitor.Error("Failed to find symbol session [" + symbol + "], quotes not sent."); return; } try { QuoteUpdateMessage message = new QuoteUpdateMessage(session.SessionInformation.Info, new Quote((decimal)ask, (decimal)bid, (decimal)open, (decimal)close, (decimal)high, (decimal)low, (decimal)volume, GeneralHelper.GenerateDateTimeSecondsFrom1970((long)time)), true); SendToDataSubscribers(session, message, null); } catch (Exception ex) {// Make sure we handle any possible unexpected exceptions, as otherwise they bring the // entire package (MT4 included) down with a bad error. SystemMonitor.Error(ex.Message); } }
void SendToDataSubscribers(CombinedDataSubscriptionInformation session, QuoteUpdateMessage quoteMessage, DataHistoryUpdateMessage updateMessage) { TracerHelper.TraceEntry(); lock (this) { // TODO: make sure proper subscription based filtering is applied here too. foreach (KeyValuePair <TransportInfo, DataSubscriptionInfo> pair in session.SubscriptionsUnsafe.Values) { if (quoteMessage != null && pair.Value.AcceptsUpdate(quoteMessage.Quote)) { TracerHelper.Trace("Sending [" + quoteMessage.GetType().Name + "] to [" + pair.Key.OriginalSenderId.Value.Id.Name + "]."); SendResponding(pair.Key, quoteMessage); } if (updateMessage != null && pair.Value.AcceptsUpdate(updateMessage.Update)) { TracerHelper.Trace("Sending [" + updateMessage.GetType().Name + "] to [" + pair.Key.OriginalSenderId.Value.Id.Name + "]."); SendResponding(pair.Key, updateMessage); } } } }