private MinuteRecord ReadNextMinuteRecord() { MinuteMask1Flags mask1 = (MinuteMask1Flags)_br.ReadByte(); MinuteMask2Flags mask2 = (MinuteMask2Flags)_br.ReadByte(); // Inputs UInt64 timeDelta; uint openDelta; uint highDelta; uint lowDelta; uint closeDelta; UInt64 volumeDelta; uint openDeltaOffset; // Outputs DateTime barDateTime; Double barOpen; Double barHigh; Double barLow; Double barClose; long barVolume; // // check the Time flag // if (mask1.HasOption(MinuteMask1Flags.Time4)) { timeDelta = _br.ReadUInt32BE(); } else if (mask1.HasOption(MinuteMask1Flags.Time1)) { timeDelta = _br.ReadByte(); } else if (mask1.HasOption(MinuteMask1Flags.Time2)) { timeDelta = _br.ReadUInt16BE(); } else { timeDelta = 1; } barDateTime = _lastDateTime.AddMinutes(timeDelta); // // check the Open flag // if (mask1.HasOption(MinuteMask1Flags.Open4)) { openDelta = _br.ReadUInt32BE(); openDeltaOffset = 1073741824; // 2147483648; // 1073741824; // 0x40000000 } else if (mask1.HasOption(MinuteMask1Flags.Open1)) { openDelta = _br.ReadByte(); openDeltaOffset = 128; // 0x80 } else if (mask1.HasOption(MinuteMask1Flags.Open2)) { openDelta = _br.ReadUInt16BE(); openDeltaOffset = 32768; // 0x4000 } else { openDelta = 0; openDeltaOffset = 0; } barOpen = Math.Round(_lastPrice + ((openDelta - openDeltaOffset) * _tickSizePrice), 2); // // check the High flag // if (mask2.HasOption(MinuteMask2Flags.High4)) { highDelta = _br.ReadUInt32BE(); } else if (mask2.HasOption(MinuteMask2Flags.High1)) { highDelta = _br.ReadByte(); } else if (mask2.HasOption(MinuteMask2Flags.High2)) { highDelta = _br.ReadUInt16BE(); } else { highDelta = 0; } barHigh = Math.Round(barOpen + (highDelta * _tickSizePrice), 2); // // check the Low flag // if (mask2.HasOption(MinuteMask2Flags.Low4)) { lowDelta = _br.ReadUInt32BE(); } else if (mask2.HasOption(MinuteMask2Flags.Low1)) { lowDelta = _br.ReadByte(); } else if (mask2.HasOption(MinuteMask2Flags.Low2)) { lowDelta = _br.ReadUInt16BE(); } else { lowDelta = 0; } barLow = Math.Round(barOpen - (lowDelta * _tickSizePrice), 2); // // check the Close flag // if (mask2.HasOption(MinuteMask2Flags.Close4)) { closeDelta = _br.ReadUInt32BE(); } else if (mask2.HasOption(MinuteMask2Flags.Close1)) { closeDelta = _br.ReadByte(); } else if (mask2.HasOption(MinuteMask2Flags.Close2)) { closeDelta = _br.ReadUInt16BE(); } else { closeDelta = 0; } barClose = Math.Round(barLow + (closeDelta * _tickSizePrice), 2); // // check the Volume flag // int volumeMultiplier = 1; if (mask1.HasOption(MinuteMask1Flags.Volume8)) { volumeDelta = _br.ReadUInt64BE(); } else if (mask1.HasOption(MinuteMask1Flags.Volume4)) { volumeDelta = _br.ReadUInt32BE(); } else if (mask1.HasOption(MinuteMask1Flags.Volume2)) { volumeDelta = _br.ReadUInt16BE(); } else if (mask1.HasOption(MinuteMask1Flags.Volume1X1000)) { volumeDelta = _br.ReadByte(); volumeMultiplier = 1000; } else if (mask1.HasOption(MinuteMask1Flags.Volume1X500)) { volumeDelta = _br.ReadByte(); volumeMultiplier = 500; } else if (mask1.HasOption(MinuteMask1Flags.Volume1)) { volumeDelta = _br.ReadByte(); } else if (mask1.HasOption(MinuteMask1Flags.Volume1X100)) { volumeDelta = _br.ReadByte(); volumeMultiplier = 100; } else { throw new Exception($"Unknown Volume Flag in Mask1: {Convert.ToString((short)mask1, 2)}\n" + $"Mask2: {Convert.ToString((short)mask2, 2)}\n" + $"FileName: {FileName}\n" + $"Position: {_br.BaseStream.Position}"); } barVolume = (long)volumeDelta * volumeMultiplier; _lastDateTime = barDateTime; _lastPrice = barOpen; _lastVolume = barVolume; _lastMask1 = mask1; _lastMask2 = mask2; return(new MinuteRecord(barDateTime, barOpen, barHigh, barLow, barClose, barVolume)); }
public static bool HasOption(this MinuteMask1Flags mask1, MinuteMask1Flags checkflag) { return((mask1 & checkflag) == checkflag); }