コード例 #1
0
        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));
        }
コード例 #2
0
 public static bool HasOption(this MinuteMask1Flags mask1, MinuteMask1Flags checkflag)
 {
     return((mask1 & checkflag) == checkflag);
 }