Пример #1
0
        public override string ToString()
        {
            return(Date.ToString("HH:mm:ss:fff") + "\n"
                   + "开:" + Open.ToString() + "\n"
                   + "收:" + Close.ToString() + "\n"
                   + "最高:" + High.ToString() + "\n"
                   + "最低:" + Low.ToString() + "\n"
                   + "量:" + Volumn.ToString() + "\n"

                   );
        }
Пример #2
0
        /*
         *  指數計算及補價資訊:(<stockid:2>=999x...)
         *  <data:N> = {<subId:1> <值:n1>}重覆直到封包結尾...
         */
        /// <summary>
        ///    大盤指數計算及補價資訊
        /// </summary>
        private static void Decoder(int StockId, MitakeIndex index, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            uint uValue = 0;
            bool bNegative = false;
            byte bMode = 0, bFlag = 0, bModule = 0;

            int iSize = Buffer.Length - 2;

            Buffer.Position = 7;

            do
            {
                //取得subId旗標
                bFlag = Buffer[0];
                ++Buffer.Position;

                //取得量價格式
                bMode   = BitConvert.GetValue(bFlag, 6, 2);
                bModule = BitConvert.GetValue(bFlag, 0, 6);

                switch (StockId)
                {
                case 9999:
                    uValue = Volumn.GetVolumn(bMode, Buffer);

                    Decoder_Index_9999(index, bModule, uValue);
                    break;

                case 10000:
                    if ((Buffer[0] & 0x80) == 0)
                    {
                        bNegative = false;                                                     //正號
                    }
                    else
                    {
                        bNegative = true;                                                      //負號
                        Buffer.Data[Buffer.Position] &= 0x7f;                                  //取消負號旗標
                    }

                    uValue = Volumn.GetVolumn(bMode, Buffer);

                    Decoder_Index_10000(index, bModule, uValue, bNegative);
                    break;

                default:
                    Volumn.GetVolumn(bMode, Buffer);
                    break;
                }
            } while (Buffer.Position < iSize);            //end while

            ++index.UpdateCount;
        }
Пример #3
0
        internal static void Decode(MitakeIndex index, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            int  iSize = 0;
            byte bMode = 0, bType = 0, bFlag = 0;

            iSize = Buffer.Length - 2;

            //移動至資料結構(時間欄位)
            Buffer.Position = 7;

            do
            {
                //取得Format旗標
                bFlag = Buffer[0];
                ++Buffer.Position;

                //取得家數大小(1~4 Byte 不固定)
                bMode = BitConvert.GetValue(bFlag, 6, 2);

                //取得家數代號(有持平家數,上漲家數,下跌家數 等......)
                bType = BitConvert.GetValue(bFlag, 0, 6);

                switch (bType)
                {
                case 0:                         //持平家數
                    index.持平家數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 1:                         //未成交家數
                    index.未成交家數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 2:                         //上漲家數
                    index.漲家數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 3:                         //下跌家數
                    index.跌家數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 4:                         //漲停家數
                    index.漲停家數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 5:                         //跌停家數
                    index.跌停家數 = Volumn.GetVolumn(bMode, Buffer);
                    break;
                }
            } while (Buffer.Position < iSize);            //End While

            ++index.UpdateCount;
        }
Пример #4
0
        internal static void Decode(MitakeIndex index, PacketBuffer Buffer)
        {
            byte            bMode = 0, bFlag = 0;
            MitakeIndexTick cTick = null;

            //移動至資料結構
            Buffer.Position = 7;

            DateTime cTime = Time.GetTime(Buffer);             //取得時間
            bool     bHave = index.GetMitakeTick(cTime, ref cTick);

            cTick.SetFlag(2);

            MitakeIndexTick cPrevTick = null;

            if (index.ComplementStatus != ComplementStatus.NotComplement)
            {
                cPrevTick = index.GetPreviousTick(cTime, 2);
                if (cPrevTick != null)
                {
                    cTick.Clone(cPrevTick);
                }
            }

            //取得format
            bFlag = Buffer[0];
            ++Buffer.Position;

            //取得成交總額
            bMode = BitConvert.GetValue(bFlag, 6, 2);

            uint uVolume = Volumn.GetVolumn(bMode, Buffer);

            cTick.Volume = uVolume;
            if (uVolume > index.成交總額)
            {
                index.成交總額 = uVolume;
            }

            //取得成交張數
            bMode      = BitConvert.GetValue(bFlag, 4, 2);
            cTick.成交張數 = Volumn.GetVolumn(bMode, Buffer);

            //取得成交筆數
            bMode      = BitConvert.GetValue(bFlag, 2, 2);
            cTick.成交筆數 = Volumn.GetVolumn(bMode, Buffer);

            CalculateSingle(cTick, cPrevTick);
            ++index.UpdateCount;
        }
Пример #5
0
 private void InitVolumns(List <Volumn> volumns)
 {
     try
     {
         DataTable table = new DataTable();
         table.Columns.Add("FPDM", typeof(string));
         table.Columns.Add("QSHM", typeof(string));
         table.Columns.Add("ZZHM", typeof(string));
         table.Columns.Add("FPZS", typeof(string));
         if (this.isConfirmed || this.type.Equals("电子增值税普通发票"))
         {
             foreach (Volumn volumn in volumns)
             {
                 DataRow row = table.NewRow();
                 row["FPDM"] = volumn.typeCode;
                 row["QSHM"] = volumn.startNum;
                 row["ZZHM"] = volumn.endNum;
                 row["FPZS"] = volumn.count;
                 table.Rows.Add(row);
             }
         }
         else
         {
             using (List <Volumn> .Enumerator enumerator2 = volumns.GetEnumerator())
             {
                 while (enumerator2.MoveNext())
                 {
                     Volumn  current = enumerator2.Current;
                     DataRow row2    = table.NewRow();
                     row2["FPDM"] = new string('*', 12);
                     row2["QSHM"] = new string('*', 8);
                     row2["ZZHM"] = new string('*', 8);
                     row2["FPZS"] = new string('*', 5);
                     table.Rows.Add(row2);
                 }
             }
         }
         this.detailList.DataSource = table;
     }
     catch (BaseException exception)
     {
         this.loger.Error(exception.Message);
         ExceptionHandler.HandleError(exception);
     }
     catch (Exception exception2)
     {
         this.loger.Error(exception2.Message);
         ExceptionHandler.HandleError(exception2);
     }
 }
Пример #6
0
        internal static void Decode(MitakeIndex index, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            int             iSize = 0;
            uint            uValue = 0;
            byte            bMode = 0, bIType = 0, bFlag = 0;
            MitakeIndexTick cTick = null;

            iSize           = Buffer.Length - 2;
            Buffer.Position = 7;                      //移動至資料結構(時間欄位)

            DateTime cTime = Time.GetTime(Buffer);    //取得時間
            bool     bHave = index.GetMitakeTick(cTime, ref cTick);

            cTick.SetFlag(8);

            if (index.ComplementStatus != ComplementStatus.NotComplement)
            {
                MitakeIndexTick cPrevTick = index.GetPreviousTick(cTime, 8);
                if (cPrevTick != null)
                {
                    cTick.Clone(cPrevTick);
                }
            }

            do
            {
                //取得價量旗標
                bFlag = Buffer[0];
                ++Buffer.Position;

                //取得指數代號(有加權指數,不含金融 等......)
                bIType = Buffer[0];
                ++Buffer.Position;

                //取得類股成交金額
                bMode  = BitConvert.GetValue(bFlag, 6, 2);
                uValue = Volumn.GetVolumn(bMode, Buffer);

                cTick.Classifys[bIType].Amount = uValue;

                //取得類股成交量
                bMode = BitConvert.GetValue(bFlag, 4, 2);

                uValue = Volumn.GetVolumn(bMode, Buffer);
                cTick.Classifys[bIType].Totals = uValue;
            } while (Buffer.Position < iSize);           //End While

            ++index.UpdateCount;
        }
Пример #7
0
        private void ExportVolumn(Volumn volumn)
        {
            var template = File.ReadAllText(AssetHelper.VolumnHtmlPath);
            var builder  = new StringBuilder();

            foreach (var chapter in volumn.Chapters)
            {
                var tag = $"<div class=\"lv2\"><a href = \"C{chapter.Index}.html\" >{chapter.Name}</a></div>";
                builder.AppendLine(tag);
            }
            var text = builder.ToString();

            template = template.Replace("[TOC]", text);
            template = template.Replace("[NAME]", volumn.Name);
            var filePath = Path.Combine(_folder, $"Q{volumn.Index}.html");

            File.WriteAllText(filePath, template);
        }
Пример #8
0
 private static bool ParseZCQueryStateOutput(XmlDocument doc, out string msg, List <OneTypeVolumes> applyQueryList, bool isConfirmQuery)
 {
     try
     {
         XmlNode node  = doc.SelectSingleNode("//returnCode");
         XmlNode node2 = doc.SelectSingleNode("//returnMessage");
         if (!node.InnerText.Equals("00"))
         {
             msg = node2.InnerText;
             return(false);
         }
         Dictionary <string, string> zCTypeCodeNamePairs = GetZCTypeCodeNamePairs();
         XmlNode node3 = doc.SelectSingleNode("//slxx");
         if (node3 != null)
         {
             foreach (XmlNode node4 in node3.ChildNodes)
             {
                 OneTypeVolumes item = new OneTypeVolumes();
                 foreach (XmlNode node5 in node4.ChildNodes)
                 {
                     if (node5.Name.Equals("fplx_dm"))
                     {
                         item.invType = ApplyCommon.Code2InvtypeMix(node5.InnerText);
                     }
                     else if (node5.Name.Equals("fpzl_dm"))
                     {
                         item.typeCode = node5.InnerText;
                         if (zCTypeCodeNamePairs.Keys.Contains <string>(node5.InnerText))
                         {
                             item.typeName = zCTypeCodeNamePairs[node5.InnerText];
                         }
                     }
                     else if (node5.Name.Equals("slsl"))
                     {
                         item.applyAmount = node5.InnerText;
                     }
                     else if (node5.Name.Equals("slsj"))
                     {
                         string innerText = node5.InnerText;
                         if (14 == innerText.Length)
                         {
                             int year   = Convert.ToInt32(innerText.Substring(0, 4));
                             int month  = Convert.ToInt32(innerText.Substring(4, 2));
                             int day    = Convert.ToInt32(innerText.Substring(6, 2));
                             int hour   = Convert.ToInt32(innerText.Substring(8, 2));
                             int minute = Convert.ToInt32(innerText.Substring(10, 2));
                             int second = Convert.ToInt32(innerText.Substring(12, 2));
                             item.applyTime = new DateTime(year, month, day, hour, minute, second).ToString("yyyy-MM-dd HH:mm:ss");
                         }
                         else
                         {
                             item.applyTime = innerText;
                         }
                     }
                     else if (node5.Name.Equals("slxh"))
                     {
                         item.applyNum = node5.InnerText;
                     }
                     else if (node5.Name.Equals("clzt"))
                     {
                         item.applyStatus = node5.InnerText;
                     }
                     else if (node5.Name.Equals("clxx"))
                     {
                         item.applyStatusMsg = node5.InnerText;
                     }
                     else if (node5.Name.Equals("clsj"))
                     {
                         string str2 = node5.InnerText;
                         if (14 == str2.Length)
                         {
                             int num7  = Convert.ToInt32(str2.Substring(0, 4));
                             int num8  = Convert.ToInt32(str2.Substring(4, 2));
                             int num9  = Convert.ToInt32(str2.Substring(6, 2));
                             int num10 = Convert.ToInt32(str2.Substring(8, 2));
                             int num11 = Convert.ToInt32(str2.Substring(10, 2));
                             int num12 = Convert.ToInt32(str2.Substring(12, 2));
                             item.dealTime = new DateTime(num7, num8, num9, num10, num11, num12).ToString("yyyy-MM-dd HH:mm:ss");
                         }
                         else
                         {
                             item.dealTime = str2;
                         }
                     }
                     else if (node5.Name.Equals("ysqbh"))
                     {
                         item.dealNum = node5.InnerText;
                     }
                     else if (node5.Name.Equals("qrjg"))
                     {
                         if (node5.InnerText.Equals("1"))
                         {
                             item.isConfirmed = true;
                         }
                         else
                         {
                             item.isConfirmed = false;
                         }
                     }
                     else if (node5.Name.Equals("sljgmx"))
                     {
                         foreach (XmlNode node6 in node5.ChildNodes)
                         {
                             Volumn volumn = new Volumn();
                             foreach (XmlNode node7 in node6.ChildNodes)
                             {
                                 if (node7.Name.Equals("fpdm"))
                                 {
                                     volumn.typeCode = node7.InnerText;
                                 }
                                 else if (node7.Name.Equals("qshm"))
                                 {
                                     volumn.startNum = node7.InnerText;
                                 }
                                 else if (node7.Name.Equals("zzhm"))
                                 {
                                     volumn.endNum = node7.InnerText;
                                 }
                                 else if (node7.Name.Equals("fs"))
                                 {
                                     volumn.count = node7.InnerText;
                                 }
                             }
                             item.volumns.Add(volumn);
                         }
                     }
                 }
                 if (!isConfirmQuery || !item.isConfirmed)
                 {
                     applyQueryList.Add(item);
                 }
             }
         }
         msg = string.Empty;
         return(true);
     }
     catch (BaseException exception)
     {
         ExceptionHandler.HandleError(exception);
         msg = exception.Message;
         return(false);
     }
     catch (Exception exception2)
     {
         ExceptionHandler.HandleError(exception2);
         msg = exception2.Message;
         return(false);
     }
 }
Пример #9
0
 private static bool ParseHXQueryStateOutput(XmlDocument doc, out string msg, List <OneTypeVolumes> applyQueryList, bool isConfirmQuery)
 {
     try
     {
         XmlNode node  = doc.SelectSingleNode("//CODE");
         XmlNode node2 = doc.SelectSingleNode("//MESS");
         if (!node.InnerText.Equals("0000"))
         {
             msg = node2.InnerText;
             return(false);
         }
         foreach (XmlNode node4 in doc.SelectSingleNode("//DATA").SelectNodes("//SLXX"))
         {
             if (!string.IsNullOrEmpty(node4.InnerText))
             {
                 OneTypeVolumes item = new OneTypeVolumes();
                 foreach (XmlNode node5 in node4.ChildNodes)
                 {
                     if (node5.Name.Equals("FPZL"))
                     {
                         item.invType = ApplyCommon.Code2InvtypeMix(node5.InnerText);
                     }
                     else if (node5.Name.Equals("FPZLDM"))
                     {
                         item.typeCode = node5.InnerText;
                     }
                     else if (node5.Name.Equals("FPZLMC"))
                     {
                         item.typeName = node5.InnerText;
                     }
                     else if (node5.Name.Equals("SLSL"))
                     {
                         item.applyAmount = node5.InnerText;
                     }
                     else if (node5.Name.Equals("SQSJ"))
                     {
                         string innerText = node5.InnerText;
                         if (14 == innerText.Length)
                         {
                             int year   = Convert.ToInt32(innerText.Substring(0, 4));
                             int month  = Convert.ToInt32(innerText.Substring(4, 2));
                             int day    = Convert.ToInt32(innerText.Substring(6, 2));
                             int hour   = Convert.ToInt32(innerText.Substring(8, 2));
                             int minute = Convert.ToInt32(innerText.Substring(10, 2));
                             int second = Convert.ToInt32(innerText.Substring(12, 2));
                             item.applyTime = new DateTime(year, month, day, hour, minute, second).ToString("yyyy-MM-dd HH:mm:ss");
                         }
                         else
                         {
                             item.applyTime = innerText;
                         }
                     }
                     else if (node5.Name.Equals("SLXH"))
                     {
                         item.applyNum = node5.InnerText;
                     }
                     else if (node5.Name.Equals("SLZT"))
                     {
                         item.applyStatus = node5.InnerText;
                     }
                     else if (node5.Name.Equals("CLXX"))
                     {
                         item.applyStatusMsg = node5.InnerText;
                     }
                     else if (node5.Name.Equals("CLSJ"))
                     {
                         string str2 = node5.InnerText;
                         if (14 == str2.Length)
                         {
                             int num7  = Convert.ToInt32(str2.Substring(0, 4));
                             int num8  = Convert.ToInt32(str2.Substring(4, 2));
                             int num9  = Convert.ToInt32(str2.Substring(6, 2));
                             int num10 = Convert.ToInt32(str2.Substring(8, 2));
                             int num11 = Convert.ToInt32(str2.Substring(10, 2));
                             int num12 = Convert.ToInt32(str2.Substring(12, 2));
                             item.dealTime = new DateTime(num7, num8, num9, num10, num11, num12).ToString("yyyy-MM-dd HH:mm:ss");
                         }
                         else
                         {
                             item.dealTime = str2;
                         }
                     }
                     else if (node5.Name.Equals("YSQBH"))
                     {
                         item.dealNum = node5.InnerText;
                     }
                     else if (node5.Name.Equals("SLQRBZ"))
                     {
                         if (node5.InnerText.Equals("Y"))
                         {
                             item.isConfirmed = true;
                         }
                         else
                         {
                             item.isConfirmed = false;
                         }
                     }
                     else if (node5.Name.Equals("FPJXX"))
                     {
                         Volumn volumn = new Volumn();
                         foreach (XmlNode node6 in node5.ChildNodes)
                         {
                             if (node6.Name.Equals("FPDM"))
                             {
                                 volumn.typeCode = node6.InnerText;
                             }
                             else if (node6.Name.Equals("QSHM"))
                             {
                                 volumn.startNum = node6.InnerText;
                             }
                             else if (node6.Name.Equals("ZZHM"))
                             {
                                 volumn.endNum = node6.InnerText;
                             }
                             else if (node6.Name.Equals("FS"))
                             {
                                 volumn.count = node6.InnerText;
                             }
                         }
                         item.volumns.Add(volumn);
                     }
                 }
                 if (!isConfirmQuery || !item.isConfirmed)
                 {
                     applyQueryList.Add(item);
                 }
             }
         }
         msg = string.Empty;
         return(true);
     }
     catch (BaseException exception)
     {
         ExceptionHandler.HandleError(exception);
         msg = exception.Message;
         return(false);
     }
     catch (Exception exception2)
     {
         ExceptionHandler.HandleError(exception2);
         msg = exception2.Message;
         return(false);
     }
 }
Пример #10
0
        internal static void Decode(MitakeIndex index, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            float           fIndex = 0;
            byte            bMode = 0, bIType = 0, bFlag = 0;
            MitakeIndexTick cTick = null;

            int iSize = Buffer.Length - 2;

            Buffer.Position = 7;                      //移動至資料結構(時間欄位)

            DateTime cTime = Time.GetTime(Buffer);    //取得時間
            bool     bHave = index.GetMitakeTick(cTime, ref cTick);

            cTick.SetFlag(1);

            if (index.ComplementStatus != ComplementStatus.NotComplement)
            {
                MitakeIndexTick cPrevTick = index.GetPreviousTick(cTime, 1);
                if (cPrevTick != null)
                {
                    cTick.Clone(cPrevTick);
                }
            }

            do
            {
                //取得價量旗標
                bFlag = Buffer[0];
                ++Buffer.Position;

                //取得指數大小(1~4 Byte 不固定)
                bMode = BitConvert.GetValue(bFlag, 6, 2);

                //取得指數代號(有加權指數,不含金融 等......)
                bIType = BitConvert.GetValue(bFlag, 0, 6);
                fIndex = (float)(Volumn.GetVolumn(bMode, Buffer) * 0.01);

                if (Time.ConvertForTotalSeconds(cTime) == 32400)             //09:00 開盤會送出昨日收盤價
                {
                    index.ReferPrices[bIType] = fIndex;                      //昨天收盤指數
                }
                else
                {
                    if (fIndex > 0)
                    {
                        cTick.Classifys[bIType].IndexValue = fIndex;

                        switch (bIType)
                        {
                        case 0:                                 //加權指數
                            cTick.Ask = new DOMPrice(fIndex, cTick.Ask.Size);
                            cTick.Bid = new DOMPrice(fIndex, cTick.Bid.Size);
                            CalculatePrice(index, cTime, fIndex);

                            if (cTime >= index.即時資訊.Time)
                            {
                                index.Close = fIndex;

                                if (index.Serial == 9999)
                                {
                                    index.加權指數價差 = fIndex - index.ReferPrices[0];
                                }
                                else if (index.Serial == 9998)
                                {
                                    index.OTC指數價差 = fIndex - index.ReferPrices[0];
                                }
                            }
                            break;

                        case 9:                                 //不含金融
                            if (index.Serial == 9999)
                            {
                                if (cTime >= index.即時資訊.Time)
                                {
                                    index.含金融價差 = fIndex - index.ReferPrices[9];
                                }
                            }
                            break;

                        default:
                            break;
                        }
                    }
                }
            } while (Buffer.Position < iSize);            //End While

            if (cTime > index.即時資訊.Time)
            {
                index.即時資訊 = cTick;
            }
            ++index.UpdateCount;
        }
Пример #11
0
        internal static void Decode(MitakeQuote stock, PacketBuffer buffer)
        {
            DateTime        cTime;
            bool            isHave = false;
            int             iSerial = 0;
            float           fReferPrice = 0;
            byte            bType = 0, bMode = 0, bVType = 0, bFlag = 0;
            MitakeQuoteTick cTick = null;

            int  iSize  = buffer.Length - 2;
            byte bSType = buffer.Data[6];

            buffer.Position = 7;

            if ((bSType & 0xf) == 11)
            {
                iSerial         = ((buffer[0] << 8) + buffer[1]);
                buffer.Position = 9;
            }
            else
            {
                iSerial         = (buffer[0] << 16) + (buffer[1] << 8) + buffer[2];
                buffer.Position = 10;
            }

            do
            {
                if (bSType == 0x42)
                {
                    bType = 1;
                    cTime = Time.GetSpecial(buffer);
                }
                else
                {
                    //取得類型
                    bType = BitConvert.GetValue(buffer[0], 7, 1);

                    //取得時間
                    if ((bSType & 0x80) == 0)
                    {
                        cTime = Time.GetTime(buffer);
                    }
                    else
                    {
                        cTime = Time.GetOther(buffer);
                    }
                }

                isHave     = stock.GetMitakeTick(iSerial, ref cTick);
                cTick.Time = cTime;

                bFlag = buffer[0];                 //取得價量旗標
                ++buffer.Position;

                cTick.類型 = bType;                  //類型  0=即時  1=盤後(此封包為盤後封包)

                //買賣型態(0=無法區分  1=買盤量  2=賣盤量)
                bVType    = BitConvert.GetValue(bFlag, 2, 2);
                cTick.買賣盤 = bVType;

                //取得成交價模式
                bMode       = BitConvert.GetValue(bFlag, 6, 2);
                cTick.Price = Price.GetPrice(bMode, buffer, ref fReferPrice);
                Decode_S31.CalculatePrice(stock, iSerial, cTick.Price);                 //計算 開盤 最高 最低

                //取得單量模式
                bMode        = BitConvert.GetValue(bFlag, 4, 2);
                cTick.Single = Volumn.GetVolumn(bMode, buffer);

                //取得委買價
                cTick.Bid = new DOMPrice(cTick.Price - EntrustPrice(BitConvert.GetValue(bFlag, 1, 1), buffer), cTick.Bid.Size);

                //取得委賣價
                cTick.Ask = new DOMPrice(cTick.Price + EntrustPrice(BitConvert.GetValue(bFlag, 0, 1), buffer), cTick.Ask.Size);

                //修正總成交量(伺服器會傳輸回補修正封包, 需要重新修正總成交量)
                MitakeQuoteTick cPrevTick = stock.GetPreviousTick(iSerial);
                cTick.Volume = ((cPrevTick == null) ? 0d : cPrevTick.Volume) + cTick.Single;

                if (!isHave)
                {
                    stock.今日總成交額 += cTick.Price * cTick.Single;
                }
                ++iSerial;
            } while (buffer.Position < iSize);            //End While
        }
Пример #12
0
        internal static void Decode(MitakeQuote stock, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            int iSize = 0;

            float fPeferPrice = 0;
            byte  bNumber = 0, bMode = 0, bFlag = 0, bBuyFlag = 0;

            iSize           = Buffer.Length - 2;
            Buffer.Position = 7;              //移動至資料結構

            int iCount = MitakeEntrust.MAX_DOM_COUNT;

            for (int i = 1; i < iCount; i++)
            {
                stock.委買委賣資訊.Ask[i] = DOMPrice.EMPTY;
                stock.委買委賣資訊.Bid[i] = DOMPrice.EMPTY;
            }

            do
            {
                //取得價量旗標
                bFlag = Buffer[0];
                ++Buffer.Position;

                bNumber = BitConvert.GetValue(bFlag, 0, 3);
                ++bNumber;

                //買賣型態(0=委買量  1=委賣量)
                bBuyFlag = BitConvert.GetValue(bFlag, 3, 1);

                double dPrice = 0, dVolume = 0;
                if (bBuyFlag == 0)
                {
                    //取得委買價模式
                    bMode  = BitConvert.GetValue(bFlag, 6, 2);
                    dPrice = Price.GetPrice(bMode, Buffer, ref fPeferPrice);

                    //取得委買量模式
                    bMode   = BitConvert.GetValue(bFlag, 4, 2);
                    dVolume = Volumn.GetVolumn(bMode, Buffer);

                    if (bNumber < MitakeEntrust.MAX_DOM_COUNT)
                    {
                        stock.委買委賣資訊.Bid[bNumber] = new DOMPrice(dPrice, dVolume);
                    }
                }
                else
                {
                    //取得委賣價模式
                    bMode  = BitConvert.GetValue(bFlag, 6, 2);
                    dPrice = Price.GetPrice(bMode, Buffer, ref fPeferPrice);

                    //取得委賣量模式
                    bMode   = BitConvert.GetValue(bFlag, 4, 2);
                    dVolume = Volumn.GetVolumn(bMode, Buffer);

                    if (bNumber < MitakeEntrust.MAX_DOM_COUNT)
                    {
                        stock.委買委賣資訊.Ask[bNumber] = new DOMPrice(dPrice, dVolume);
                    }
                }
            } while (Buffer.Position < iSize);             //End While

            ++stock.UpdateCount;
        }
Пример #13
0
        private static void Decoder(MitakeQuote stock, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            float fReferPrice = 0;
            byte  bMode = 0, bModule = 0, bPVFlag = 0, bFlag = 0;

            int iSize = Buffer.Length - 2;

            Buffer.Position = 7;

            do
            {
                bFlag = Buffer[0];                  //移動至資料結構
                ++Buffer.Position;

                //取得(價/量)旗標 0=量  1=價
                bPVFlag = BitConvert.GetValue(bFlag, 5, 1);

                //取得參考價或是成交量模式
                bMode   = BitConvert.GetValue(bFlag, 6, 2);
                bModule = BitConvert.GetValue(bFlag, 0, 6);

                switch (bModule)
                {
                case 2:                         //累計買量
                    stock.累計買量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 3:                         //累計賣量
                    stock.累計賣量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 4:                         //即時單筆買進巨量
                    stock.單筆買進巨量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 5:                         //即時單筆賣出巨量
                    stock.單筆賣出巨量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 6:                         //(即時)累計買進巨量
                    stock.累計買進巨量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 7:                         //(即時)累計賣出巨量
                    stock.累計賣出巨量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 8:                         //即時)量幅,小數兩位(每3筆送一次)
                    stock.即時量幅 = (float)(Volumn.GetVolumn(bMode, Buffer) * 0.01);
                    break;

                case 9:                         //(即時)買氣,0~100,賣氣=100-買氣(每3筆送一次)
                    stock.買進量百分比 = (byte)Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 15:                         //昨日總成交量
                    stock.昨日總成交量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 17:                         //買進成交筆數(股票與選擇權共用)
                    stock.買進成交筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 18:                         //賣出成交筆數(股票與選擇權共用)
                    stock.賣出成交筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 19:                         //總成交合約數(股票與選擇權共用)
                    stock.總成交合約數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 20:                         //買進累計委託筆數
                    stock.買進累計委託筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 21:                         //買進累計委託合約量
                    stock.買進累計委託合約量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 22:                         //賣出累計委託筆數
                    stock.賣出累計委託筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 23:                         //賣出累計委託合約量
                    stock.賣出累計委託合約量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 24:                         //未平倉合約數(收盤後)
                    stock.未平倉合約數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 25:                         //選擇權:委託買進總口數
                    stock.委託買進總口數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 26:                         //選擇權:委託賣出總口數
                    stock.委託賣出總口數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 27:                         //選擇權:總成交筆數
                    stock.總成交筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 29:                         //盤前試戳成交量
                    stock.試戳成交量 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 32:                         //(即時)均價(每10筆送一次)
                    stock.即時均價 = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 40:                         //昨日最高價
                    stock.昨日最高價 = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 41:                         //昨日最低價
                    stock.昨日最低價 = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 42:                         //今日開盤價
                    stock.Open = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 43:                         //今日最高價
                    stock.High = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 44:                         //今日最低價
                    stock.Low = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 45:                         //今日收盤價
                    stock.Close = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 54:                         //結算價(收盤後)
                    stock.結算價 = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                case 55:                         //盤前試戳成交價
                    stock.試戳成交價 = Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    break;

                default:                         //其他屬於盤後資料(已經不計入範圍內)
                    if (bPVFlag == 0)
                    {
                        Volumn.GetVolumn(bMode, Buffer);
                    }
                    else
                    {
                        Price.GetPrice(bMode, Buffer, ref fReferPrice);
                    }
                    break;
                }                              //end switch
            } while (Buffer.Position < iSize); //end while

            ++stock.UpdateCount;
        }
Пример #14
0
        internal static void Decode(MitakeIndex index, Mitake.Sockets.Data.PacketBuffer Buffer)
        {
            int             iSize = 0;
            byte            bMode = 0, bType = 0, bFlag = 0;
            MitakeIndexTick cTick = null;

            iSize           = Buffer.Length - 2;
            Buffer.Position = 7;                     //移動至資料結構(時間欄位)

            DateTime cTime = Time.GetTime(Buffer);   //取得時間

            if (cTime.TimeOfDay == __c忽略報價時間)        //這個時間點可以直接忽略
            {
                return;
            }

            bool bHave = index.GetMitakeTick(cTime, ref cTick);

            cTick.SetFlag(4);

            if (index.ComplementStatus != ComplementStatus.NotComplement)
            {
                MitakeIndexTick cPrevTick = index.GetPreviousTick(cTime, 4);
                if (cPrevTick != null)
                {
                    cTick.Clone(cPrevTick);
                }
            }

            do
            {
                //取得Format旗標
                bFlag = Buffer[0];
                ++Buffer.Position;

                //取得委託張數大小(1~4 Byte 不固定)
                bMode = BitConvert.GetValue(bFlag, 6, 2);

                //取得委託代號(有委賣合計張數,委買合計張數 等......)
                bType = BitConvert.GetValue(bFlag, 0, 6);

                switch (bType)
                {
                case 0:                         //委買合計張數
                    cTick.Bid = new DOMPrice(cTick.Price, Volumn.GetVolumn(bMode, Buffer));
                    break;

                case 1:                         //委賣合計張數
                    cTick.Ask = new DOMPrice(cTick.Price, Volumn.GetVolumn(bMode, Buffer));
                    break;

                case 2:                         //委買合計筆數
                    cTick.委買合計筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 3:                         //委賣合計筆數
                    cTick.委賣合計筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 4:                         //委買總漲停張數
                    cTick.委買總漲停張數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 5:                         //委賣總漲停張數
                    cTick.委賣總漲停張數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 6:                         //委買總漲停筆數
                    cTick.委買總漲停筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 7:                         //委賣總漲停筆數
                    cTick.委賣總漲停筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 8:                         //委買總跌停張數
                    cTick.委買總跌停張數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 9:                         //委賣總跌停張數
                    cTick.委賣總跌停張數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 10:                         //委買總跌停筆數
                    cTick.委買總跌停筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                case 11:                         //委賣總跌停筆數
                    cTick.委賣總跌停筆數 = Volumn.GetVolumn(bMode, Buffer);
                    break;

                default:
                    Buffer.Position += (bMode + 1);
                    break;
                }                              //End Switch
            } while (Buffer.Position < iSize); //End While

            ++index.UpdateCount;
        }
Пример #15
0
		internal static void Decode(MitakeQuote stock, Mitake.Sockets.Data.PacketBuffer Buffer) {
			DateTime cTime;
			float fReferPrice = 0;
			double dAskP = 0, dAskV = 0, dBidP = 0, dBidV = 0, dPrice = 0, dVolume = 0, dSingle = 0;
			byte bType = 0, bMode = 0, bPType = 0, bVType = 0, bFlag = 0, b類型 = 0, b買賣盤 = 0, b價格類型 = 0;

			int iSerial = 0, iSize = Buffer.Length - 2;
			byte bSType = Buffer.Data[6];

			Buffer.Position = 7;

			//取得序號
			if ((bSType & 0x31) == 0x31) {  //0x31 0xb1 與不等於 0x41 (夜盤) 序號都兩個位元組
				iSerial = (Buffer[0] << 8) + Buffer[1];
				Buffer.Position = 9;
			} else {  //其他類型序號都是三個位元組
				iSerial = (Buffer[0] << 16) + (Buffer[1] << 8) + Buffer[2];
				Buffer.Position = 10;
			}

			if (bSType == 0x41) {  //夜盤代號 0x41 (時間格式不同)
				bType = 0;
				cTime = Time.GetSpecial(Buffer);
			} else {
				//取得類型
				bType = BitConvert.GetValue(Buffer[0], 7, 1);

				//取得時間
				if ((bSType & 0x80) == 0) {
					cTime = Time.GetTime(Buffer);
				} else {
					cTime = Time.GetOther(Buffer);
				}
			}

			do {
				//取得價量旗標
				bFlag = Buffer[0];
				++Buffer.Position;

				b類型 = bType;  //類型  0=即時  1=盤後

				//判斷是否是單量(1110B)
				if (BitConvert.GetValue(bFlag, 0, 4) == 0xe) {
					//買賣型態(0=無法區分買賣盤量  1=買量  2=賣量)
					bVType = BitConvert.GetValue(bFlag, 6, 2);
					b買賣盤 = bVType;

					bMode = BitConvert.GetValue(bFlag, 4, 2);
					dSingle = Volumn.GetVolumn(bMode, Buffer);
				} else {
					//買賣型態(0=無法確定 1=買盤 2=賣盤 3=委託買賣)
					bVType = BitConvert.GetValue(bFlag, 2, 2);

					//價位型態(0=一般成交價 1=開 2=高 3=低)
					//如果買賣型態為委託買賣(0=委買 1=委賣)
					bPType = BitConvert.GetValue(bFlag, 0, 2);

					//取得成交價或委託價模式
					bMode = BitConvert.GetValue(bFlag, 6, 2);

					switch (bVType) {
						case 3: //委買委賣格式
							if (bPType == 0) {
								dBidP = Price.GetPrice(bMode, Buffer, ref fReferPrice);

								//取得委買量模式
								bMode = BitConvert.GetValue(bFlag, 4, 2);
								dBidV = Volumn.GetVolumn(bMode, Buffer);
							} else {
								dAskP = Price.GetPrice(bMode, Buffer, ref fReferPrice);

								//取得委賣量模式
								bMode = BitConvert.GetValue(bFlag, 4, 2);
								dAskV = Volumn.GetVolumn(bMode, Buffer);
							}
							break;
						default: //一般成交格式
							b價格類型 = bPType;
							dPrice = Price.GetPrice(bMode, Buffer, ref fReferPrice);

							CalculatePrice(stock, iSerial, dPrice);

							bMode = BitConvert.GetValue(bFlag, 4, 2);
							dVolume = Volumn.GetVolumn(bMode, Buffer);
							break;
					}
				}
			} while (Buffer.Position < iSize); //End While

			MitakeQuoteTick cTick = null;
			bool bHave = stock.GetMitakeTick(iSerial, ref cTick);
			MitakeQuoteTick cPrevTick = stock.GetPreviousTick(iSerial);
			if (bHave) {
				cTick.Time = cTime;
				cTick.Ask = new DOMPrice(dAskP, dAskV);
				cTick.Bid = new DOMPrice(dBidP, dBidV);
			} else {
				cTick.類型 = b類型;
				cTick.買賣盤 = b買賣盤;
				cTick.價格類型 = b價格類型;
				cTick.Time = cTime;
				cTick.Single = dSingle;
				cTick.Price = (dPrice == 0 && cPrevTick != null) ? cPrevTick.Price : dPrice;
				cTick.Volume = (dVolume == 0 && cPrevTick != null) ? cPrevTick.Volume : dVolume;
				cTick.Ask = (dAskP == 0 && dAskV == 0 && cPrevTick != null) ? cPrevTick.Ask : new DOMPrice(dAskP, dAskV);
				cTick.Bid = (dBidP == 0 && dBidV == 0 && cPrevTick != null) ? cPrevTick.Bid : new DOMPrice(dBidP, dBidV);

				if (dPrice > 0 && dVolume > 0) {  //如果有價量才計算成交金額與更換最新的即時資訊訊息
					stock.今日總成交額 += cTick.Price * (cTick.Volume - ((cPrevTick == null) ? 0d : cPrevTick.Volume));
					if (iSerial > stock.即時資訊.Serial) {
						stock.今日總成交量 = dVolume;
						stock.即時資訊 = cTick;
					}
				}
			}

			//填入委託價格第一檔
			CalculateEntrust(stock, cTick);

			//計算委託價格買賣盤
			MitakeEntrust.ComparePrice(cTick, cPrevTick);
			++stock.UpdateCount;
		}