public bool UpdateFromSecurityTypeMsg(IQMessageArgs args) { var fields = args.Message.Split(','); if (fields.Length >= 3) { int id; if (!int.TryParse(fields[0], out id)) { return(false); } SecurityType type; if (!Enum.TryParse(fields[1], true, out type)) { return(false); } if (!TryAdd(type, id)) { return(false); } return(Count >= ExpectedCount); } return(false); }
// Result Format for HIX, HID, and HIT requests: // // +---------------+---------------------+ // | Field | Format | // +---------------+---------------------+ // | RequestID | Text | // | Timestamp | CCYY-MM-DD HH:MM:SS | // | High | decimal | // | Low | decimal | // | Open | decimal | // | Close | decimal | // | Total Volume | integer | // | Period Volume | integer | // +---------------+---------------------+ // // // Result Format for HDX, HDT, HWX, and HMX requests: // // +---------------+---------------------+ // | Field | Format | // +---------------+---------------------+ // | RequestID | Text | // | Timestamp | CCYY-MM-DD HH:MM:SS | // | High | decimal | // | Low | decimal | // | Open | decimal | // | Close | decimal | // | Period Volume | integer | // | Open Interest | integer | // +---------------+---------------------+ public static void Parse(IQMessageArgs args, HistoryProviderSpan span, out HistoryMsg msg) { msg = new HistoryMsg(); var isHitRequest = HistoryProviderSpan.Day > span; var fields = args.Message.Split(','); msg.Time = IQFeedParser.ParseDateTime(fields[FIELD_TIME], "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd"); msg.Time = IQFeedParser.FromIQFeedTime(msg.Time) - span.ToTimeSpan(); // Переводим в нашу временную зону и сдвигаем все свечи на на величину периода, чтобы свечи были как везде msg.High = IQFeedParser.ParseDecimal(fields[FIELD_HIGH]); msg.Low = IQFeedParser.ParseDecimal(fields[FIELD_LOW]); msg.Open = IQFeedParser.ParseDecimal(fields[FIELD_OPEN]); msg.Close = IQFeedParser.ParseDecimal(fields[FIELD_CLOSE]); if (isHitRequest) { msg.Volume = IQFeedParser.ParseInt(fields[FIELD_VOLUME]); msg.OpenInterest = IQFeedParser.ParseInt(fields[FIELD_OPEN_INTEREST]); } else { msg.Volume = IQFeedParser.ParseInt(fields[FIELD_VOLUME_HIT]); msg.OpenInterest = 0; } }
public void UpdateFromL1SystemMsg(IQMessageArgs args) { var fields = args.Message.Split(','); for (var i = 1; i < fields.Length; i++) { this[fields[i]] = i - 1; } }
public static void Parse(IQMessageArgs args, out L1FundamentalMsg msg) { msg = new L1FundamentalMsg(); var fields = args.Message.Split(','); msg.Symbol = fields[FIELD_SYMBOL]; msg.DecimalPlaces = IQFeedParser.ParseUint(fields[FIELD_DECIMAL_PLACES]); msg.PriceStep = (decimal)(1.0 / (Math.Pow(10, msg.DecimalPlaces))); msg.PriceStepValue = null; // TODO }
public static bool TryParse(IQMessageArgs args, L1FieldIndex index, out L1UpdateMsg msg) { string rawValue; msg = new L1UpdateMsg(); var fields = args.Message.Split(','); #region Symbol if (!index.TryGetField(fields, FIELD_SYMBOL, out msg.Symbol)) { return(false); } #endregion #region BestBidPrice if (!index.TryGetField(fields, FIELD_BID, out rawValue)) { return(false); } msg.BestBidPrice = IQFeedParser.ParseDecimal(rawValue); #endregion #region BestOfferPrice if (!index.TryGetField(fields, FIELD_ASK, out rawValue)) { return(false); } msg.BestOfferPrice = IQFeedParser.ParseDecimal(rawValue); #endregion #region BestBidQuantity if (!index.TryGetField(fields, FIELD_BID_SIZE, out rawValue)) { return(false); } msg.BestBidQuantity = IQFeedParser.ParseLong(rawValue); #endregion #region BestOfferQuantity if (!index.TryGetField(fields, FIELD_ASK_SIZE, out rawValue)) { return(false); } msg.BestOfferQuantity = IQFeedParser.ParseLong(rawValue); #endregion #region LastPrice if (!index.TryGetField(fields, FIELD_LAST, out rawValue)) { return(false); } msg.LastPrice = IQFeedParser.ParseDecimal(rawValue); #endregion //msg.LastChangeTime = fields[16]; #region Settlement if (!index.TryGetField(fields, FIELD_SETTLE, out rawValue)) { return(false); } msg.Settlement = IQFeedParser.ParseDecimal(rawValue); #endregion #region PreviousSettlement if (!index.TryGetField(fields, FIELD_EXTENDED_TRADE, out rawValue)) { return(false); } var extendedTrade = IQFeedParser.ParseDecimal(rawValue); if (!index.TryGetField(fields, FIELD_EXTENDED_TRADING_CHANGE, out rawValue)) { return(false); } var extendedTradingChange = IQFeedParser.ParseDecimal(rawValue); // IQFeed API не выставляет наружу PreviousSettlement, но в документации есть два интересных поля: // | 37 | Extended Trading Change | float | IQFeed 4.9 | Extended Trade (field 76) minus Yesterday's close | Calculated by IQConnect.exe | // | 76 | Extended Trade | float | IQFeed 5.0 | Price of the most recent extended trade (last qualified trades + Form T trades). | Provided by the exchange or 3rd party data provider | // Зная эти два поля, можно посчитать Yesterday's close, худо-бедно сойдет msg.PreviousSettlement = extendedTrade - extendedTradingChange; #endregion //msg.BottomPriceLimit //msg.TopPriceLimit //msg.Vola = ParseDecimal(fields[43]) * 100; //msg.Go //msg.LotSize //msg.PremiumStyle //msg.TheorPrice return(true); }