Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.Threading;
- using System.Web;
- using Brokerware.MDS.Common;
- using com.neovest.api;
- using com.neovest.api.common;
- using com.neovest.api.symbol;
- using com.neovest.connection;
- using com.neovest.fa.data;
- using com.neovest.fa.@event;
- using com.neovest.util;
- using System.Globalization;
- using NLog;
- using System.Diagnostics;
- namespace Brokerware.MDS.Services
- {
- public class NeovestQuotesProvider : IQuotesUpdater, IQuotesProvider, IQuotesObservable
- {
- Logger _logger = LogManager.GetCurrentClassLogger();
- private SDKSymbolService _service;
- private SymbolListener _listener = new SymbolListener();
- internal static ConcurrentDictionary<string, Quotable> _quotables = new ConcurrentDictionary<string, Quotable>();
- private static NeovestQuotesProvider _instance;
- protected SDKServiceFactory _factory = SDKServiceFactory.getInstance();
- public delegate void SampleRecordReceivedEventHandler(object sender, SampleRecordReceivedEventArgs e);
- private MyConnectionListener connectionListener;
- private static string _optionTickerRegex = @"^[A-Z]{1,6}[1-2][0-9][0-1][0-9][0-3][0-9][CP][0-9]{8}$";
- private static string _optionSymbolNeovestRegex = @"^[A-Z]{1,6}[A-X][0-9]{4}[0-9]{1,4}(\.[0-9]{1,4})?$";
- private DataRequestManager _reqManager = DataRequestManager.Instance;
- private Dictionary<string, StockCodes> _codes = new Dictionary<string, StockCodes>();
- public string Name { get { return "neovest"; } }
- public ConnectionStatus Status { get; private set; }
- /*<Nuevo>*/
- private YahooQuotesProvider _yahooQuotesProvider = YahooQuotesProvider.Instance;
- private ConcurrentDictionary<string, Option> _options = new ConcurrentDictionary<string, Option>();
- private ConcurrentDictionary<string, string[]> _optionChains = new ConcurrentDictionary<string, string[]>();//clave: subyacente y fecha de vencimiento (date), valores: tickers de las opciones para ahorrarme el ir a yahoo a buscarlos.
- private ConcurrentDictionary<string, Stock> _stocks = new ConcurrentDictionary<string, Stock>();
- private ConcurrentDictionary<string, SymbolSubcriptionKey> _subscriptionKeys = new ConcurrentDictionary<string, SymbolSubcriptionKey>(); //para guardar las claves y desuscribir despues
- public event QuoteUpdateHandler OnQuoteUpdate;
- private ConcurrentDictionary<string, UpdateMessage> _updates = new ConcurrentDictionary<string, UpdateMessage>();
- private ConcurrentDictionary<string, UpdateMessage> _accumulatedUpdates = new ConcurrentDictionary<string, UpdateMessage>();
- /*</Nuevo>*/
- private NeovestQuotesProvider()
- {
- _service = _factory.getSymbolService();
- _reqManager.NewRequest += _reqManager_NewRequest;
- connectionListener = new MyConnectionListener();
- connectionListener.MDDisconnected += new EventHandler(connectionListener_MDDisconnected);
- connectionListener.OEDisconnected += new EventHandler(connectionListener_OEDisconnected);
- connectionListener.ConnectionRecordReceived += new SampleRecordReceivedEventHandler(connectionListener_ConnectionRecordReceived);
- _factory.addConnectionListener(connectionListener);
- _listener.QuoteUpdateReceived += quoteUpdateHandler;
- marketDataLogin();
- }
- private void _reqManager_NewRequest(SubscriptionRequest request)
- {
- switch (request.Type)
- {
- case SubscriptionRequest.ReqType.StockQuote:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- requestStockQuotes(request);
- break;
- case SubscriptionRequest.ReqType.StockQuotes:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- requestStockQuotes(request);
- break;
- case SubscriptionRequest.ReqType.OptionQuote:
- break;
- case SubscriptionRequest.ReqType.OptionsList:
- break;
- case SubscriptionRequest.ReqType.OptionsQuoteList:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- requestOptions(request);
- break;
- case SubscriptionRequest.ReqType.OptionsQuoteNTMList:
- break;
- case SubscriptionRequest.ReqType.HistoricalQuote:
- break;
- case SubscriptionRequest.ReqType.FundamentalData:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- requestFundamentalData(request.Parameters["symbol"], request);
- break;
- case SubscriptionRequest.ReqType.SymbolGuide:
- break;
- case SubscriptionRequest.ReqType.OptionContract:
- break;
- case SubscriptionRequest.ReqType.StockCodes:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- requestCodes(request.Parameters["symbol"], request);
- break;
- case SubscriptionRequest.ReqType.StockQuoteSubscription:
- break;
- case SubscriptionRequest.ReqType.QuotesSubscription:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- DoQuotesSubscription(request.Parameters.Values.ToArray(), request);
- break;
- case SubscriptionRequest.ReqType.QuotesUnsubscription:
- request.RequestStatus = SubscriptionRequest.Status.Working;
- DoQuotesUnsubscription(request.Parameters.Values.ToArray(), request);
- break;
- default:
- break;
- }
- }
- private void requestStockQuotes(SubscriptionRequest req)
- {
- //</Nuevo>
- requestData(req.Parameters.Values.ToArray(), new GenericListener((si, sre) =>
- {
- if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- {
- var symbolRecord = sre.getSymbolRecord();
- var ticker = standardSymbol(si.getSymbologySymbolString());
- List<Stock> Stocks = new List<Stock>();
- Stock stock = new Stock(ticker);
- if (!_stocks.TryGetValue(ticker, out stock))
- {
- _stocks.TryAdd(ticker, new Stock(ticker));
- stock = _stocks[ticker];
- }
- //obtengo los datos
- stock.Ask = symbolRecord.getAsk();
- stock.Bid = symbolRecord.getBid();
- stock.Change = symbolRecord.getNet();
- stock.Last = symbolRecord.getLast();
- stock.High = symbolRecord.getHigh();
- stock.Low = symbolRecord.getLow();
- stock.Open = symbolRecord.getOpen();
- stock.Ticker = ticker;
- stock.Volume = symbolRecord.getVolume();
- if (!req.State.ContainsKey(ticker))
- req.State.Add(ticker, "OK");
- if ((req.RequestStatus != SubscriptionRequest.Status.Served) && (req.State.Count == req.Parameters.Count))
- {
- foreach (string tickr in req.Parameters.Values)
- {
- Stock stk;
- string tickrStandard = standardSymbol(tickr);
- _stocks.TryGetValue(tickrStandard, out stk);
- Stocks.Add(stk);
- }
- lock (req)
- {
- req.Result = Stocks;
- _reqManager.SetServed(req);
- }
- }
- }
- }), false);
- //</Nuevo>
- }
- //<Nuevo>
- private void requestFundamentalData(string symbol, SubscriptionRequest req)
- {
- var symbolInfo = new SymbologyInfo(nativeSymbol(symbol));
- var extraFields = new java.util.ArrayList();
- //PE
- SymbolFieldDefRecord.Key PEKey = new SymbolFieldDefRecord.Key(SymbolConstants.PE, SymbolFieldTypeEnum.EXTENDED);
- var PEField = _service.getSymbolField(PEKey);
- if (PEField != null)
- {
- extraFields.add(PEField);
- }
- //Dividend
- SymbolFieldDefRecord.Key dividendKey = new SymbolFieldDefRecord.Key(SymbolConstants.Dividend, SymbolFieldTypeEnum.EXTENDED);
- var dividendField = _service.getSymbolField(dividendKey);
- if (dividendField != null)
- {
- extraFields.add(dividendField);
- }
- //WkHigh52
- SymbolFieldDefRecord.Key WkHigh52Key = new SymbolFieldDefRecord.Key(SymbolConstants.WkHigh52, SymbolFieldTypeEnum.EXTENDED);
- var WkHigh52Field = _service.getSymbolField(WkHigh52Key);
- if (WkHigh52Field != null)
- {
- extraFields.add(WkHigh52Field);
- }
- //WkLow52
- SymbolFieldDefRecord.Key WkLow52Key = new SymbolFieldDefRecord.Key(SymbolConstants.WkLow52, SymbolFieldTypeEnum.EXTENDED);
- var WkLow52Field = _service.getSymbolField(WkLow52Key);
- if (WkLow52Field != null)
- {
- extraFields.add(WkLow52Field);
- }
- //Capital
- SymbolFieldDefRecord.Key CapitalKey = new SymbolFieldDefRecord.Key(SymbolConstants.Capital, SymbolFieldTypeEnum.EXTENDED);
- var CapitalField = _service.getSymbolField(CapitalKey);
- if (CapitalField != null)
- {
- extraFields.add(CapitalField);
- }
- //VolAvg60
- SymbolFieldDefRecord.Key VolAvg60Key = new SymbolFieldDefRecord.Key(SymbolConstants.VolAvg60, SymbolFieldTypeEnum.EXTENDED);
- var VolAvg60Field = _service.getSymbolField(VolAvg60Key);
- if (VolAvg60Field != null)
- {
- extraFields.add(VolAvg60Field);
- }
- //divExDate
- SymbolFieldDefRecord.Key divExDateKey = new SymbolFieldDefRecord.Key(SymbolConstants.DivExDate, SymbolFieldTypeEnum.EXTENDED);
- var divExDateField = _service.getSymbolField(divExDateKey);
- if (divExDateField != null)
- {
- extraFields.add(divExDateField);
- }
- var builder = new SymbolSubscriptionCriteria.Builder(symbolInfo);
- builder.fields(extraFields);
- _service.subscribeSymbol(/*symbolInfo */builder.build(), new GenericListener((si, sre) =>
- {
- if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- {
- var symbolRecord = sre.getSymbolRecord();
- var PE = symbolRecord.getDoubleValue(PEField.getSymbolAttributeID(), 0.0); //PE
- var Dividend = symbolRecord.getDoubleValue(dividendField.getSymbolAttributeID(), 0.0);//Dividend
- var DivExDate = symbolRecord.getStringValue(divExDateField.getSymbolAttributeID(), "?"); //DivExDate
- //var NET = symbolRecord.getStringValue(NETField.getSymbolAttributeID(), "?");
- var WkHigh52 = symbolRecord.getDoubleValue(WkHigh52Field.getSymbolAttributeID(), 0.0);//WkHigh52
- var WkLow52 = symbolRecord.getDoubleValue(WkLow52Field.getSymbolAttributeID(), 0.0);//WkLow52
- var Capital = symbolRecord.getDoubleValue(CapitalField.getSymbolAttributeID(), 0.0);//Capital
- var VolAvg60 = symbolRecord.getDoubleValue(VolAvg60Field.getSymbolAttributeID(), 0.0);//VolAvg60
- FundamentalData ret = new FundamentalData();
- //Capitalizacion - Market Cap
- ret.mktCap = Capital;
- //DividendoAnualPorcentaje - % Dividends
- ret.dividendYield = Dividend;
- //FechaExDividend - -ExDividend Date
- ret.exDivDate = DivExDate;
- //MaxUnAno - -Maximum of the year
- ret.high52 = WkHigh52;
- //MinUnAno - -Minimum pf the year
- ret.low52 = WkLow52;
- //Vol50dias - Average Volume
- ret.vol50DayAvg = VolAvg60;
- //RatioPE - Ratio P/E
- ret.peRatio = PE;
- if (req.RequestStatus != SubscriptionRequest.Status.Served)
- {
- lock (req)
- {
- req.Result = ret;
- _reqManager.SetServed(req);
- }
- }
- }
- }));
- }
- //</Nuevo>
- private void requestCodes(string symbol, SubscriptionRequest req)
- {
- var symbolInfo = new SymbologyInfo(nativeSymbol(symbol));
- var extraFields = new java.util.ArrayList();
- extraFields.add(_service.getSymbolField(new SymbolFieldDefRecord.Key(SymbolConstants.P_ISIN, SymbolFieldTypeEnum.EXTENDED)));
- var builder = new SymbolSubscriptionCriteria.Builder(symbolInfo);
- builder.fields(extraFields);
- var codes = new StockCodes() { Ticker = symbol };
- if (!_codes.ContainsKey(symbol))
- _codes.Add(symbol, codes);
- _service.subscribeSymbol(symbolInfo, new GenericListener((si, sre) =>
- {
- if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- {
- var symbolRecord = sre.getSymbolRecord();
- var isinField = _service.getSymbolField(new SymbolFieldDefRecord.Key(SymbolConstants.P_ISIN, SymbolFieldTypeEnum.EXTENDED));
- codes.ISIN = symbolRecord.getStringValue(isinField.getSymbolAttributeID(), "");
- var isin = symbolRecord.getSymbolDisplayString(SymbologyInfo.ISIN_SYMBOLOGY);
- if (isin != null && isin != "")
- {
- codes.ISIN = isin;
- req.Result = codes;
- _reqManager.SetServed(req);
- }
- }
- }));
- }
- private void quoteUpdateHandler(object sender, QuoteUpdateEventArgs args)
- {
- if (_quotables.ContainsKey(args.Ticker))
- {
- _quotables[args.Ticker].UpdateData(args.Data);
- }
- }
- #region Connection Handlers
- private void connectionListener_ConnectionRecordReceived(object sender, SampleRecordReceivedEventArgs e)
- {
- System.Diagnostics.Debug.WriteLine(e.SampleRecord);
- }
- private void connectionListener_OEDisconnected(object sender, EventArgs e)
- {
- }
- private void connectionListener_MDDisconnected(object sender, EventArgs e)
- {
- bool connected = false;
- while (connected == false)
- {
- try
- {
- marketDataLogin();
- connected = true;
- }
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine(ex.Message);
- System.Diagnostics.Debug.WriteLine(ex.StackTrace);
- }
- }
- }
- #endregion
- private void marketDataLogin()
- {
- ServerIPAndPort[] mdservers = new ServerIPAndPort[] {
- new ServerIPAndPort("directfeed.neovest.com", 5600),
- new ServerIPAndPort("directfeed2.neovest.com", 5600)
- };
- MDAuthInfo mdAuthInfo = new MDAuthInfo("p-bnypaul1", "Jaci1605*", "Idealink", mdservers);
- try
- {
- _factory.loginMarketData(mdAuthInfo);
- }
- catch (Exception e)
- {
- System.Diagnostics.Debug.WriteLine(e.Message);
- System.Diagnostics.Debug.WriteLine(e.StackTrace);
- //cleanup();
- }
- }
- public static NeovestQuotesProvider Instance
- {
- get
- {
- if (_instance == null)
- _instance = new NeovestQuotesProvider();
- return _instance;
- }
- }
- private void requestData(string[] symbols, SymbolRecordListener listener, bool subscribe = true)
- {
- var aditionalFields = new java.util.ArrayList();
- aditionalFields.add(SymbolConstants.VWAP);
- foreach (var symbol in symbols)
- {
- SymbologyInfo symbolInfo = new SymbologyInfo();
- if (isOption(symbol))
- {
- symbolInfo.setIdType(SymbologyInfo.NEOVEST_SYMBOLOGY);
- //symbolInfo.setSymbolType(SymbologyInfo.OPTIONS_SYMBOL_TYPE);
- symbolInfo.setExchangeCode(ExchangeCode.getExchangeCode("OPR"));
- symbolInfo.setSymbologySymbolString(symbol);
- }
- else
- {
- symbolInfo.setIdType(SymbologyInfo.NEOVEST_SYMBOLOGY);
- //symbolInfo.setIdType(SymbologyInfo.BLOOMBERG_SYMBOLOGY);
- //symbolInfo.setExchangeCode(ExchangeCode.getExchangeCode("NAS"));
- symbolInfo.setSymbologySymbolString(symbol);
- }
- ///New way of subscribing
- int updateInterval = 0; // how often to be updated on a given symbol. 0 for immediate
- SymbolSubscriptionCriteria.Builder subscribeCriteriaBuilder = new SymbolSubscriptionCriteria.Builder(symbolInfo);
- //subscribeCriteriaBuilder.fields(aditionalFields);
- if (subscribe)
- {
- subscribeCriteriaBuilder.updateInterval(updateInterval);
- _service.subscribeSymbol(subscribeCriteriaBuilder.build(), listener);
- }
- //<Nuevo>
- else
- {
- SymbolSubcriptionKey subscriptionKey;
- if (!_subscriptionKeys.TryGetValue(symbol, out subscriptionKey))
- {
- subscriptionKey = _service.allocateSubscriptionKey();
- _subscriptionKeys.TryAdd(symbol, subscriptionKey);
- }
- _logger.Info(string.Format("Subscribiendose para el ticker: {0}, SubscriptionKey: {1}", symbol, subscriptionKey));
- _service.subscribeSymbol(symbolInfo, listener, subscriptionKey);
- }
- //</Nuevo>
- }
- }
- private static bool isOption(string symbol)
- {
- return Regex.IsMatch(symbol, _optionSymbolNeovestRegex)
- || Regex.IsMatch(symbol, _optionTickerRegex);
- }
- public void StopUpdate(Quotable quote)
- {
- }
- public bool Update(Quotable quote, bool subscribe)
- {
- this.UpdateMultiple(new Quotable[] { quote });
- return true;
- }
- public bool UpdateMultiple(IEnumerable<Quotable> quotes)
- {
- var toSubscribe = new List<string>();
- foreach (var q in quotes)
- {
- if (!_quotables.ContainsKey(q.Ticker))
- {
- _quotables.AddOrUpdate(q.Ticker, q, (k, p) => q);
- toSubscribe.Add(nativeSymbol(q.Ticker));
- }
- }
- requestData(toSubscribe.ToArray(), _listener);
- return true;
- }
- /// <summary>
- /// Returns Newovest symbol given a OCC option symbol or nasdaq stock symbol
- /// </summary>
- /// <param name="symbol">OCC symbol in case of options or Nasdaq symbol (ticker) en case of stock.</param>
- /// <returns></returns>
- public static string nativeSymbol(string symbol)
- {
- string ret = symbol;
- if (Regex.IsMatch(symbol.ToUpper(), _optionTickerRegex))
- {
- ret = "";
- //convert T181221C00028500 -> TL211828.5000 and also convert T181221C00150000 -> TL2118150.000
- string underlyer = symbol.Substring(0, symbol.Length - 15);
- int underlyerLenght = underlyer.Length;
- ret = ((char)('A' + int.Parse(symbol.Substring(symbol.Length - 13, 2)) - 1 + (symbol.Substring(symbol.Length - 9, 1) == "P" ? 12 : 0))).ToString()
- + symbol.Substring(symbol.Length - 11, 2) //en el ejemplo, 21, o sea, el dia.
- + symbol.Substring(symbol.Length - 15, 2) //en el ejemplo, 18, o sea, el año.
- + int.Parse(symbol.Substring(symbol.Length - 8, 5)).ToString()//la parte entera del strike, en este caso 00028, pero parseado queda 28.
- + "." + symbol.Substring(symbol.Length - 3);
- ret = ret.PadRight(12, '0');
- ret = underlyer + ret;
- }
- switch (symbol)
- {
- case "DOWJONES":
- ret = "DJI2MN";
- break;
- case "COMP":
- ret = "COMPX";
- break;
- case "SPX":
- ret = "SPX.X";
- break;
- //<nuevo>
- case "PBR-A":
- ret = "PBR.A";
- break;
- case "BRKB":
- ret = "BRK.B";
- break;
- //</nuevo>
- }
- return ret;
- }
- /// <summary>
- /// Returns a OCC option symbol or Nasdaq stock symbol given a Neovest symbol
- /// </summary>
- /// <param name="symbol">Newovest symbol</param>
- /// <returns></returns>
- public static string standardSymbol(string symbol)
- {
- var calls = "ABCDEFGHIJKL";
- var puts = "MNOPQRSTUVWX";
- var ret = symbol;
- if (isOption(symbol))
- {
- //convert TL211828.5000 -> T181221C00028500
- //also convert TL2118150.000 -> T181221C00150000
- var m = Regex.Match(symbol, "[A-X][0-3]");
- var underlying = symbol.Substring(0, m.Index);
- var monthCallCode = symbol.Substring(underlying.Length, 1);// "L"
- string[] partesDelStrike = symbol.Substring(underlying.Length + 5).Split('.'); //se saltea "L2118" y toma 28.5000, que separa en 28 y 5000
- partesDelStrike[0] = partesDelStrike[0].PadLeft(5, '0');
- partesDelStrike[1] = partesDelStrike[1].Substring(0, 3);
- string strike = partesDelStrike[0] + partesDelStrike[1];
- ret = underlying
- + symbol.Substring(underlying.Length + 3, 2)
- + (calls.IndexOf(monthCallCode) != -1
- ? (calls.IndexOf(monthCallCode) + 1).ToString().PadLeft(2, '0')
- : (puts.IndexOf(monthCallCode) + 1).ToString().PadLeft(2, '0'))
- + symbol.Substring(underlying.Length + 1, 2)
- + (calls.IndexOf(monthCallCode) != -1 ? "C" : "P")
- + strike;
- }
- switch (symbol)
- {
- case "DJI2MN":
- ret = "DOWJONES";
- break;
- case "COMPX":
- ret = "COMP";
- break;
- case "SPX.X":
- ret = "SPX";
- break;
- //<nuevo>
- case "PBR.A":
- ret = "PBR-A";
- break;
- case "BRK.B":
- ret = "BRKB";
- break;
- //</nuevo>
- }
- return ret;
- }
- internal delegate void handleSymbolEvent(SymbologyInfo si, SymbolRecordEvent sre);
- internal class GenericListener : SymbolRecordListener
- {
- private SDKSymbolService _service;
- private handleSymbolEvent _handler;
- public GenericListener(handleSymbolEvent handler)
- {
- this._handler = handler;
- }
- public long getSupportedEventTypeMask()
- {
- return SymbolRecordEvent.ALL_CHANGES;
- }
- public void handleEvent(SymbologyInfo si, SymbolRecordEvent sre)
- {
- _handler?.Invoke(si, sre);
- }
- }
- internal class SymbolListener : SymbolRecordListener
- {
- internal delegate void QuoteUpdateReceivedEventHandler(object sender, QuoteUpdateEventArgs args);
- internal event QuoteUpdateReceivedEventHandler QuoteUpdateReceived;
- public SymbolListener()
- {
- }
- public long getSupportedEventTypeMask()
- {
- return SymbolRecordEvent.ALL_CHANGES;
- }
- public void handleEvent(SymbologyInfo si, SymbolRecordEvent sre)
- {
- var handleAfterHoursQuotes = true;
- if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- {
- var symbolrecord = sre.getSymbolRecord();
- var updMsg = new UpdateMessage();
- var symbol = NeovestQuotesProvider.standardSymbol(si.getDisplayString());
- var exchange = symbolrecord.getExchangeCode().getExchangeName();
- if (true || symbolrecord.isMarketOpen())
- {
- switch (sre.getEventType())
- {
- case SymbolRecordEvent.TRADE_CHANGES:
- case SymbolRecordEvent.BID_CHANGES:
- case SymbolRecordEvent.ASK_CHANGES:
- case SymbolRecordEvent.PCLOSE_CHANGES:
- case SymbolRecordEvent.NEW_HIGH_CHANGES:
- case SymbolRecordEvent.NEW_LOW_CHANGES:
- updMsg.Ticker = symbol;
- Quotable quote = null;
- _quotables.TryGetValue(symbol, out quote);
- if (quote == null)
- {
- if (symbolrecord.isOption())
- quote = new Option(symbol, SymbolType.Ticker);
- else
- quote = new Stock(symbol);
- _quotables.AddOrUpdate(symbol, quote, (k, p) => quote);
- }
- if (quote != null)
- {
- updMsg.Ask = symbolrecord.getAsk() != quote.Ask ? symbolrecord.getAsk() : updMsg.Ask;
- updMsg.Bid = symbolrecord.getBid() != quote.Bid ? symbolrecord.getBid() : updMsg.Bid;
- updMsg.Change = symbolrecord.getNet() != quote.Change ? symbolrecord.getNet() : updMsg.Change;
- updMsg.High = symbolrecord.getHigh() != quote.High ? symbolrecord.getHigh() : updMsg.High;
- updMsg.Last = symbolrecord.getLast() != quote.Last ? symbolrecord.getLast() : updMsg.Last;
- updMsg.Close = symbolrecord.getPClose() != quote.LastClose ? symbolrecord.getPClose() : updMsg.Close;
- updMsg.Low = symbolrecord.getLow() != quote.Low ? symbolrecord.getLow() : updMsg.Low;
- updMsg.Open = symbolrecord.getOpen() != quote.Open ? symbolrecord.getOpen() : updMsg.Open;
- updMsg.Volume = symbolrecord.getVolume() != quote.Volume ? symbolrecord.getVolume() : updMsg.Volume;
- //quote.VWAP = symbolrecord.getAsk() != quote.Ask ? symbolrecord.getAsk() : quote.Ask;
- if (symbolrecord.getLast() != 0)
- updMsg.ChangePercent = symbolrecord.getNet() != quote.Change ? symbolrecord.getNet() / symbolrecord.getLast() * 100 : updMsg.ChangePercent;
- if (sre.getEventType() == SymbolRecordEvent.TRADE_CHANGES
- || sre.getEventType() == SymbolRecordEvent.BID_CHANGES
- || sre.getEventType() == SymbolRecordEvent.ASK_CHANGES)
- {
- SymbolTradeBidAskChangedEvent sTBAChangedEvent = sre as SymbolTradeBidAskChangedEvent;
- var info = sTBAChangedEvent.getTradeBidAskInfo();
- updMsg.Time = Utils.GetDateTimeFromUnixTimestamp(info.getTimeStamp(), false);
- }
- }
- if (updMsg.HasAnyValue)
- QuoteUpdateReceived?.Invoke(this, new QuoteUpdateEventArgs(0, symbol, updMsg));
- break;
- case SymbolRecordEvent.GENERAL_CHANGES:
- break;
- case SymbolRecordEvent.SYMBOL_COMPLETE:
- break;
- default:
- break;
- }
- }
- }
- else
- {
- //TODO: Handle error
- }
- }
- }
- private class MyConnectionListener : SDKServiceConnectionListener
- {
- internal event EventHandler MDDisconnected;
- internal event EventHandler OEDisconnected;
- internal event SampleRecordReceivedEventHandler ConnectionRecordReceived;
- public void connectionUpdate(SDKServiceConnectionEvent sdksce)
- {
- int eventType = sdksce.getEventType();
- if (eventType == SDKServiceConnectionEvent.UNEXPECTED_DISCONNECT)
- {
- SDKServerInfo info = sdksce.getServerInfo();
- SDKServerInfo.ConnectionType connectionType = info.getType();
- if (connectionType == SDKServerInfo.ConnectionType.MARKET_DATA)
- {
- OnMDDisconnected();
- }
- else if (connectionType == SDKServerInfo.ConnectionType.ORDER_ENTRY)
- {
- OnOEDisconnected();
- }
- }
- else if (eventType == SDKServiceConnectionEvent.EXPECTED_DISCONNECT)
- {
- OnConnectionRecordReceived(new SampleRecordReceivedEventArgs("Connection updated - eventType: " + eventType));
- }
- }
- private void OnMDDisconnected()
- {
- if (MDDisconnected != null)
- MDDisconnected(this, EventArgs.Empty);
- }
- private void OnOEDisconnected()
- {
- if (OEDisconnected != null)
- OEDisconnected(this, EventArgs.Empty);
- }
- private void OnConnectionRecordReceived(SampleRecordReceivedEventArgs e)
- {
- if (ConnectionRecordReceived != null)
- ConnectionRecordReceived(this, e);
- }
- }
- public class SampleRecordReceivedEventArgs : EventArgs
- {
- private string sampleRecord;
- public SampleRecordReceivedEventArgs(string sRecord)
- {
- sampleRecord = sRecord;
- }
- public string SampleRecord
- {
- get { return sampleRecord; }
- }
- }
- /*<Nuevo>*/
- public StockCodes GetCodes(string ticker)
- {
- StockCodes codes = new StockCodes() { Ticker = ticker };
- var parameters = new Dictionary<string, string>() { { "symbol", ticker } };
- var req = new SubscriptionRequest(parameters, SubscriptionRequest.ReqType.StockCodes);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000 /*10 segundos*/);
- _codes.TryGetValue(ticker, out codes);
- return codes;
- }
- /*</Nuevo>*/
- public FundamentalData GetFundamentalData(string symbol)
- {
- //envio mi request y espero que quede servida
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters.Add("symbol", nativeSymbol(symbol));
- SubscriptionRequest req = new SubscriptionRequest(parameters, SubscriptionRequest.ReqType.FundamentalData);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);
- //obtengo el resultado de la request
- FundamentalData resultadoDeLaRequest = (FundamentalData)req.Result;
- resultadoDeLaRequest.symbol = symbol;
- return resultadoDeLaRequest;
- }
- public HistoricQuoteItem[] GetHistoricalQuotes(string ticker, string from, string frequency)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Method that returns an "OptionChainResponse" with all the options requested.
- /// </summary>
- /// <param name="req">Request que contiene en "Parameters" la lista de los tickers</param>
- private void requestOptions(SubscriptionRequest req)
- {
- Stopwatch stopwatch = new Stopwatch();
- stopwatch.Start();
- _logger.Info("Requesting options for from Neovest...");
- List<OptionPair> optPairsRet = new List<OptionPair>();
- requestData(req.Parameters.Values.ToArray(), new GenericListener((si, sre) =>
- {
- if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- {
- var symbolRecord = sre.getSymbolRecord();
- var ticker = si.getSymbologySymbolString();//standardSymbol(si.getSymbologySymbolString());
- Option option;
- string tickrStandard = standardSymbol(ticker);
- if (!_options.TryGetValue(tickrStandard, out option))
- {
- _options.TryAdd(tickrStandard, new Option(tickrStandard, SymbolType.Ticker));
- option = _options[tickrStandard];
- }
- //obtengo los datos
- option.Ask = symbolRecord.getAsk();
- option.Bid = symbolRecord.getBid();
- option.Change = symbolRecord.getNet();
- option.Last = symbolRecord.getLast();
- option.High = symbolRecord.getHigh();
- option.Low = symbolRecord.getLow();
- option.Open = symbolRecord.getOpen();
- option.Ticker = ticker;
- option.Volume = symbolRecord.getVolume();
- lock (req)
- {
- if (!req.State.ContainsKey(ticker))
- {
- req.State.Add(ticker, "OK");
- _logger.Info(string.Format("Datos obtenidos para el ticker: {0}", ticker));
- }
- if ((req.RequestStatus != SubscriptionRequest.Status.Served) && (req.State.Count == req.Parameters.Count))
- {
- OptionChainResponse optionChain = new OptionChainResponse();
- List<Option> Calls = new List<Option>();
- List<Option> Puts = new List<Option>();
- foreach (string tickr in req.Parameters.Values)
- {
- Option opt = new Option();
- tickrStandard = standardSymbol(tickr);
- if (_options.TryGetValue(tickrStandard, out opt)) //para evitar la nullpointerException.
- {
- if (opt.Type == OptionType.Call)
- {
- Calls.Add(opt);
- }
- else
- {
- Puts.Add(opt);
- }
- }
- else
- {
- _logger.Info(string.Format("Error al obtener datos para el ticker: {0}", tickr));
- }
- }
- optionChain.Calls = Calls.ToArray();
- optionChain.Puts = Puts.ToArray();
- req.Result = optionChain;
- _reqManager.SetServed(req);
- }
- }
- }
- }), false);
- }
- /// <summary>
- /// convierto un ticker call en uno put y viceversa. Simplemente cambia la C por la P
- /// </summary>
- /// <param name="ticker">Ticker en formato Yahoo</param>
- /// <param name="tipoFinal">Tipo del que va a ser el ticker devuelto</param>
- /// <returns></returns>
- public static string transformarTipoDeTicker(string ticker, char tipoFinal)
- {
- return ticker.Substring(0, ticker.Length - 9) + tipoFinal.ToString() + ticker.Substring(ticker.Length - 8);
- }
- /// <summary>
- /// convierto la optionChainResponse "chain" en una lista de pares de opciones :)
- /// </summary>
- /// <param name="chain">:)</param>
- /// <returns></returns>
- private OptionPair[] createOptPairsFromChain(OptionChainResponse chain)
- {
- List<OptionPair> ret = new List<OptionPair>();
- if (chain.Calls.Length != chain.Puts.Length)
- {
- _logger.Info("Error: la cadena generada no tiene la misma cantidad de puts que de calls. No se pueden crear Option pairs.");
- throw new Exception();
- }
- if (chain != null)
- {
- //primero pongo todas las calls en los pares de opciones que voy a devolver.
- chain.Calls.OrderBy(call => call.Ticker);
- chain.Puts.OrderBy(put => put.Ticker);
- foreach (Option call in chain.Calls) //creo un par por cada call y lo agrego a ret. Luego a ese par le voy a completar el "put"
- {
- OptionPair optPair = new OptionPair();
- optPair.CallAsk = call.Ask;
- optPair.CallBid = call.Bid;
- optPair.CallChange = call.Change;
- optPair.CallLast = call.Last;
- optPair.CallTicker = call.Ticker;
- optPair.CallVolume = call.Volume;
- optPair.Strike = call.Strike;// puedo tomar el strike del call o del put, es el mismo.
- ret.Add(optPair);
- }
- int i = 0;
- foreach (Option put in chain.Puts) //agrego los puts a los pares de opciones. Como estan ordenados por ticker simplemente los agrego uno a uno a los pares.
- {
- ret[i].PutAsk = put.Ask;
- ret[i].PutBid = put.Bid;
- ret[i].PutChange = put.Change;
- ret[i].PutLast = put.Last;
- ret[i].PutTicker = put.Ticker;
- ret[i].PutVolume = put.Volume;
- i++;
- }
- }
- return ret.ToArray();
- }
- public OptionPair[] GetOptionChain(string symbol, string date, int start, int count) //
- {
- //declaro variables iniciales
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- int i = 1;
- string ticker;
- var culture = CultureInfo.InvariantCulture;
- DateTime fecha;
- if (!DateTime.TryParseExact(date, "MMMyy;yyyy-MM-dd;yyyyMMdd".Split(';'), culture, DateTimeStyles.None, out fecha))
- throw new ApplicationException("date format not supported.");
- string key = symbol + "-" + fecha;
- string[] tickers; //para guardar la lista de tickers que devuelve mi "cache"
- if (_optionChains.TryGetValue(key, out tickers))// si es esta en la cache, entonces no es necesario pedir los datos a yahoo nuevamente.
- {
- _logger.Info(string.Format("Obtenidas de Yahoo: {0}", tickers.Length));
- foreach (string s in tickers)
- {
- ticker = s;
- parameters.Add("Ticker" + i.ToString(), ticker);
- i++;
- }
- }
- else //si no estaba en mi "cache", entonces pido los datos a yahoo! y los guardo en un nuevo registro de mi diccionario cache.
- {
- List<string> tckrs = new List<string>();//para mi cache
- OptionPair[] optionChainYahoo = _yahooQuotesProvider.GetOptionChain(symbol, date, start, count);
- //convierto los nombres a "native" para que neovest los entienda
- foreach (OptionPair opt in optionChainYahoo)
- {
- if ((opt.CallTicker != null) && (opt.PutTicker != null))
- {
- //Para verificar que es un call (dado que yahoo a veces se confunde y manda puts por calls y viceversa. Es decir, un optionPair con dos calls o dos puts. Pasa con AA-20191005)
- string callTicker = transformarTipoDeTicker(opt.CallTicker, 'C');
- ticker = nativeSymbol(callTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- //Para verificar que es un put (dado que yahoo a veces se confunde y manda puts por calls y viceversa. Es decir, un optionPair con dos calls o dos puts. Pasa con AA-20191005)
- string putTicker = transformarTipoDeTicker(opt.PutTicker, 'P');
- ticker = nativeSymbol(putTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- else if ((opt.CallTicker != null) && (opt.PutTicker == null))
- {
- ticker = nativeSymbol(opt.CallTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- string putTicker = transformarTipoDeTicker(opt.CallTicker, 'P');
- ticker = nativeSymbol(putTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- else if ((opt.CallTicker == null) && (opt.PutTicker != null))
- {
- string callTicker = transformarTipoDeTicker(opt.PutTicker, 'C');
- ticker = nativeSymbol(callTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- ticker = nativeSymbol(opt.PutTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- }
- _logger.Info(string.Format("Obtenidas de Yahoo: {0}", tckrs.Count()));
- _optionChains.TryAdd(key, tckrs.ToArray());//los guardo en un nuevo registro de mi diccionario cache.
- }
- //envio mi request y espero que quede pronta
- SubscriptionRequest req = new SubscriptionRequest(parameters, SubscriptionRequest.ReqType.OptionsQuoteList);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);
- //obtengo el resultado de la request
- OptionChainResponse res = (OptionChainResponse)req.Result;
- if (req.RequestStatus == SubscriptionRequest.Status.Served)
- {
- _logger.Info(string.Format("OptionChain for {0} date {1} served from Neovest", symbol, date));
- }
- else
- {
- _logger.Info(string.Format("Timedout: OptionChain for {0} date {1}", symbol, date));
- }
- //convierto la cadena de opciones en un arreglo de optionPairs
- OptionPair[] ret = createOptPairsFromChain(res);
- return ret;
- }
- public OptionPair[] GetOptionChainNTM(string symbol, string date, int count)
- {
- //declaro variables iniciales
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- int i = 1;
- string ticker;
- var culture = CultureInfo.InvariantCulture;
- DateTime fecha;
- Stopwatch stopwatch = new Stopwatch();
- if (!DateTime.TryParseExact(date, "MMMyy;yyyy-MM-dd;yyyyMMdd".Split(';'), culture, DateTimeStyles.None, out fecha))
- throw new ApplicationException("date format not supported.");
- string key = symbol + "-" + fecha + "NTM";
- string[] tickers; //para guardar la lista de tickers que devuelve mi "cache"
- if (_optionChains.TryGetValue(key, out tickers))// si es esta en la cache, entonces no es necesario pedir los datos a yahoo nuevamente.
- {
- _logger.Info(string.Format("Obtenidas de Yahoo: {0}", tickers.Length));
- foreach (string s in tickers)
- {
- ticker = s;
- parameters.Add("Ticker" + i.ToString(), ticker);
- i++;
- }
- }
- else //si no estaba en mi "cache", entonces pido los datos a yahoo! y los guardo en un nuevo registro de mi diccionario cache.
- {
- List<string> tckrs = new List<string>();//para mi cache
- OptionPair[] optionChainYahoo = _yahooQuotesProvider.GetOptionChainNTM(symbol, date, count);
- //convierto los nombres a "native" para que neovest los entienda
- foreach (OptionPair opt in optionChainYahoo)
- {
- if ((opt.CallTicker != null) && (opt.PutTicker != null))
- {
- //Para verificar que es un call (dado que yahoo a veces se confunde y manda puts por calls y viceversa. Es decir, un optionPair con dos calls o dos puts. Pasa con AA-20191005)
- string callTicker = transformarTipoDeTicker(opt.CallTicker, 'C');
- ticker = nativeSymbol(callTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- //Para verificar que es un put (dado que yahoo a veces se confunde y manda puts por calls y viceversa. Es decir, un optionPair con dos calls o dos puts. Pasa con AA-20191005)
- string putTicker = transformarTipoDeTicker(opt.PutTicker, 'P');
- ticker = nativeSymbol(putTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- else if ((opt.CallTicker != null) && (opt.PutTicker == null))
- {
- ticker = nativeSymbol(opt.CallTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- string putTicker = transformarTipoDeTicker(opt.CallTicker, 'P');
- ticker = nativeSymbol(putTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- else if ((opt.CallTicker == null) && (opt.PutTicker != null))
- {
- string callTicker = transformarTipoDeTicker(opt.PutTicker, 'C');
- ticker = nativeSymbol(callTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- ticker = nativeSymbol(opt.PutTicker);
- parameters.Add("Ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- }
- _logger.Info(string.Format("Obtenidas de Yahoo: {0}", tckrs.Count()));
- _optionChains.TryAdd(key, tckrs.ToArray());//los guardo en un nuevo registro de mi diccionario cache.
- }
- //envio mi request y espero que quede pronta
- SubscriptionRequest req = new SubscriptionRequest(parameters, SubscriptionRequest.ReqType.OptionsQuoteList);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);
- if (req.RequestStatus == SubscriptionRequest.Status.Served)
- {
- _logger.Info(string.Format("OptionChainNTM for {0} date {1} served from Neovest", symbol, date));
- }
- else
- {
- _logger.Info(string.Format("Timedout: OptionChainNTM for {0} date {1}", symbol, date));
- }
- OptionChainResponse res;
- OptionPair[] ret;
- //if (req.RequestStatus == SubscriptionRequest.Status.Served)
- //{
- // obtengo el resultado de la request
- res = (OptionChainResponse)req.Result;
- //convierto la cadena de opciones en un arreglo de optionPairs
- ret = createOptPairsFromChain(res);
- //}
- //else
- //{
- // throw new Exception($"Request no servida. Status: {req.RequestStatus}");
- //}
- return ret;
- }
- public OptionChainResponse GetOptionChain(string symbol, string date)
- {
- //declaro variables iniciales
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- int i = 1;
- string ticker;
- var culture = CultureInfo.InvariantCulture;
- DateTime fecha;
- if (!DateTime.TryParseExact(date, "MMMyy;yyyy-MM-dd;yyyyMMdd".Split(';'), culture, DateTimeStyles.None, out fecha))
- throw new ApplicationException("date format not supported.");
- string key = symbol + "-" + fecha;
- string[] tickers; //para guardar la lista de tickers que devuelve mi "cache"
- if (_optionChains.TryGetValue(key, out tickers))// si es esta en la cache, entonces no es necesario pedir los datos a yahoo nuevamente.
- {
- foreach (string s in tickers)
- {
- ticker = s;
- parameters.Add("Ticker" + i.ToString(), ticker);
- i++;
- }
- }
- else //si no estaba en mi "cache", entonces pido los datos a yahoo! y los guardo en un nuevo registro de mi diccionario cache.
- {
- List<string> tckrs = new List<string>();//para mi cache
- OptionChainResponse optionChainResponseYahoo = _yahooQuotesProvider.GetOptionChain(symbol, date);
- //convierto los nombres a "native" para que neovest los entienda
- foreach (Option opt in optionChainResponseYahoo.Puts)
- {
- ticker = nativeSymbol(opt.Ticker);
- parameters.Add("ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- foreach (Option opt in optionChainResponseYahoo.Calls)
- {
- ticker = nativeSymbol(opt.Ticker);
- parameters.Add("ticker" + i.ToString(), ticker);
- tckrs.Add(ticker);//para mi cache
- i++;
- }
- _optionChains.TryAdd(key, tckrs.ToArray());//los guardo en un nuevo registro de mi diccionario cache.
- }
- //envio mi request y espero que quede pronta
- SubscriptionRequest req = new SubscriptionRequest(parameters, SubscriptionRequest.ReqType.OptionsQuoteList);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);
- if (req.RequestStatus == SubscriptionRequest.Status.Served)
- {
- _logger.Info(string.Format("OptionChain for {0} date {1} served from Neovest", symbol, date));
- }
- else
- {
- _logger.Info(string.Format("Timedout: OptionChain for {0} date {1}", symbol, date));
- }
- //obtengo el resultado de la request
- OptionChainResponse ret = (OptionChainResponse)req.Result;
- return ret;
- }
- public string[] GetOptionContracts(string symbol, string format)
- {
- throw new NotImplementedException();
- }
- public Option GetOptionQuote(string symbol)
- {
- throw new NotImplementedException();
- }
- public Stock GetStockQuote(string symbol)
- {
- //<Nuevo>
- //envio mi request y espero que quede servida
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters.Add("symbol", nativeSymbol(symbol));
- SubscriptionRequest req = new SubscriptionRequest(parameters, SubscriptionRequest.ReqType.StockQuote);
- Stopwatch stopwatch = new Stopwatch();
- stopwatch.Start();
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);
- //obtengo el resultado de la request
- List<Stock> stocks = (List<Stock>)req.Result;
- Stock stock = stocks[0];
- //if (stock != null)
- //{
- // _logger.Info(string.Format("Stock quotes served from Neovest in {0}", stopwatch.Elapsed));
- //}
- //else
- //{
- // _logger.Info(string.Format("Stock quotes request Timed Out, {0} seconds elapsed", stopwatch.Elapsed));
- //}
- return stock;
- //</Nuevo>
- }
- public SymbolGuide[] GetSymbolGuide(string symbol, int start, int count)
- {
- throw new NotImplementedException();
- }
- public double GetVAR(string symbol)
- {
- throw new NotImplementedException();
- }
- public bool IsAvailable()
- {
- throw new NotImplementedException();
- }
- public void RemoveFromSymbolGuide(string symbol)
- {
- throw new NotImplementedException();
- }
- public void Start()
- {
- }
- public void Stop()
- {
- throw new NotImplementedException();
- }
- public void UpdateSymbolGuide(SymbolGuide entry)
- {
- throw new NotImplementedException();
- }
- private void handleUpdate(UpdateMessage msg)
- {
- var delta = _accumulatedUpdates.ContainsKey(msg.Ticker) ? msg.getDiff(_accumulatedUpdates[msg.Ticker]) : msg;
- _accumulatedUpdates.AddOrUpdate(msg.Ticker, msg, (k, o) => o.Update(delta));
- if (OnQuoteUpdate != null && delta.HasAnyValue)
- OnQuoteUpdate(new UpdateMessage[] { delta });
- }
- public void Subscribe(string[] symbols)
- {
- Dictionary<string, string> symbolsNeovest = new Dictionary<string, string>();
- int i = 1;
- foreach (string s in symbols)
- {
- symbolsNeovest.Add("Ticker" + i.ToString(), nativeSymbol(s));
- i++;
- }
- SubscriptionRequest req = new SubscriptionRequest(symbolsNeovest, SubscriptionRequest.ReqType.QuotesSubscription);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);//wip
- if(req.RequestStatus == SubscriptionRequest.Status.Served)
- {
- List<UpdateMessage> mensajes = (List<UpdateMessage>)req.Result;
- foreach (UpdateMessage updMsg in mensajes)
- {
- if (updMsg.HasAnyValue)
- handleUpdate(updMsg);
- }
- }
- else
- {
- _logger.Info("Request Timedout");
- }
- }
- private void DoQuotesSubscription(string[] symbols, SubscriptionRequest req)
- {
- requestData(symbols, new GenericListener((si, sre) =>
- {
- if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- {
- var symbolrecord = sre.getSymbolRecord();
- var updMsg = new UpdateMessage();
- var symbol = NeovestQuotesProvider.standardSymbol(si.getDisplayString());
- //var exchange = symbolrecord.getExchangeCode().getExchangeName();
- switch (sre.getEventType())
- {
- case SymbolRecordEvent.TRADE_CHANGES:
- case SymbolRecordEvent.BID_CHANGES:
- case SymbolRecordEvent.ASK_CHANGES:
- case SymbolRecordEvent.PCLOSE_CHANGES:
- case SymbolRecordEvent.NEW_HIGH_CHANGES:
- case SymbolRecordEvent.NEW_LOW_CHANGES:
- case SymbolRecordEvent.SYMBOL_COMPLETE:
- updMsg.Ticker = symbol;
- updMsg.Ask = symbolrecord.getAsk();
- updMsg.Bid = symbolrecord.getBid();
- updMsg.Change = symbolrecord.getNet();
- updMsg.High = symbolrecord.getHigh();
- updMsg.Last = symbolrecord.getLast();
- updMsg.Close = symbolrecord.getPClose();
- updMsg.Low = symbolrecord.getLow();
- updMsg.Open = symbolrecord.getOpen();
- updMsg.Volume = symbolrecord.getVolume();
- _updates.AddOrUpdate(symbol, updMsg, (s, u) => u );//wip
- //if (updMsg.HasAnyValue)
- // handleUpdate(updMsg);
- break;
- //case SymbolRecordEvent.GENERAL_CHANGES:
- // break;
- default:
- break;
- }
- lock (req)
- {
- if (!req.State.ContainsKey(symbol))
- {
- req.State.Add(symbol, "OK");
- }
- if ((req.RequestStatus != SubscriptionRequest.Status.Served) && (req.State.Count == symbols.Length))
- {
- List<UpdateMessage> mensajes = new List<UpdateMessage>();
- foreach (string s in symbols)
- {
- string standardSym = standardSymbol(s);
- UpdateMessage message;
- _updates.TryGetValue(standardSym, out message);
- mensajes.Add(message);
- }
- req.Result = mensajes;
- _reqManager.SetServed(req);
- }
- }
- }
- }), false);
- }
- public void Unsubscribe(string[] symbols)
- {
- Dictionary<string, string> symbolsNeovest = new Dictionary<string, string>();
- int i = 1;
- foreach (string s in symbols)
- {
- symbolsNeovest.Add("Ticker" + i.ToString(), nativeSymbol(s));
- i++;
- }
- SubscriptionRequest req = new SubscriptionRequest(symbolsNeovest, SubscriptionRequest.ReqType.QuotesUnsubscription);
- req = _reqManager.Submit(req);
- _reqManager.WaitServed(req, 10000);
- }
- private void DoQuotesUnsubscription(string[] symbols, SubscriptionRequest req)
- {
- foreach (string symbol in symbols)
- {
- SymbolSubcriptionKey subscriptionKey;
- _subscriptionKeys.TryGetValue(symbol, out subscriptionKey);
- _logger.Info(string.Format("Desubscribiendose para el ticker: {0}, SubscriptionKey: {1}", symbol, subscriptionKey));
- _service.unsubscribeSymbol(subscriptionKey);
- //var symbolInfo = new SymbologyInfo(symbol);
- //_service.unsubscribeSymbol(symbolInfo, new GenericListener((si, sre) =>
- //{
- // if (sre.getStatus() == SymbolRecordEvent.SUCCESS)
- // {
- // var ticker = si.getSymbologySymbolString();
- // if (!req.State.ContainsKey(ticker))
- // {
- // req.State.Add(ticker, "OK");
- // }
- // if ((req.RequestStatus != SubscriptionRequest.Status.Served) && (req.State.Count == symbols.Length))
- // {
- // lock (req)
- // {
- // _reqManager.SetServed(req);
- // }
- // }
- // }
- //}), );
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement