internal void MergeTicks() {
			string sDataSource = __cDataRequest.DataFeed;
			AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
			if (cService != null) {
				if (cService.TradeDate > LastBarTime.Date) {  //如果即時報價服務交易日期大於最後 Bars 交易日期, 就合併今日即時資訊
					this.Initialized = false;
					__cDataRequest.Range.To = cService.TradeDate;
					Indexer.RealtimeIndex = __cCloses.Count - __iRealtimeCount - 1;
					this.CreateRealtimePeriods();

					string sSymbolId = __cDataRequest.Symbol;
					IQuote cQuote = cService.Storage.GetQuote(sSymbolId);
					if (cQuote != null) {
						int iTickCount = cQuote.TickCount;
						for (int i = iTickCount - 1; i >= 0; i--) {
							Merge(cQuote.GetTick(i));
						}
					}
				} else {  //盤後分檔與日檔資料已經公布, 不用在合併今日即時資訊
					string sSymbolId = __cDataRequest.Symbol;
					IQuote cQuote = cService.Storage.GetQuote(sSymbolId);
					if (cQuote != null) {
						__dOVolume = cQuote.RealTick.Volume;  //取得今日即時資訊的總成交量(當 tick 來時會比對tick 總成交量是否比此變數大, 如果比較大就合併到 Bars 內, 所以如果今日已有分日檔資訊, 此欄位需填入今日即時資訊總成交量, 才不會被重複合併到最後一根 Bars)
					}
				}
			}
			this.Initialized = true;
		}
Beispiel #2
0
		private void CheckLogin(string dataSource) {
			if (__cDataSources.Contains(dataSource)) {
				AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(dataSource);
				if (cService != null) {
					if (!cService.IsLogin) {
						EventWaitHandle cWaitHandle = null;
						lock (__cAsyncArgs) {
							_AsyncEventArgs cArgs = null;
							if (__cAsyncArgs.TryGetValue(dataSource, out cArgs)) {
								cWaitHandle = cArgs.handle;
							} else {
								cArgs = new _AsyncEventArgs();
								cWaitHandle = new ManualResetEvent(false);
								cArgs.handle = cWaitHandle;
								
								__cAsyncArgs.Add(dataSource, cArgs);
							}
						}

						if (cWaitHandle != null) {
							cWaitHandle.WaitOne();
						}
					}
				}
			}
		}
Beispiel #3
0
        /// <summary>
        ///   啟動報價元件服務
        /// </summary>
        /// <param name="quoteServiceInformation">報價服務資訊</param>
        /// <param name="userId">使用者ID</param>
        /// <param name="password">使用者密碼</param>
        /// <returns>返回值:true=登入成功, false=登入失敗</returns>
        public bool StartQuoteService(QuoteServiceInformation quoteServiceInformation, string userId = null, string password = null)
        {
            bool bRet = quoteServiceInformation.Enabled;

            if (!bRet)
            {
                AbstractQuoteService cQuoteService = GetQuoteService(quoteServiceInformation);
                if (userId != null && password != null)
                {
                    cQuoteService.UserId   = userId;
                    cQuoteService.Password = password;
                }

                bool bLogin = cQuoteService.Login();                  //登入報價伺服器
                if (bLogin)
                {
                    quoteServiceInformation.Enabled    = bLogin;
                    quoteServiceInformation.DataSource = cQuoteService.DataSource;

                    AddQuoteService(cQuoteService);
                    bRet = bLogin;
                }
            }
            return(bRet);
        }
Beispiel #4
0
        private void QuoteManager_onQuoteServiceSwitchChanged(object sender, QuoteServiceSwitchChangedEvent e)
        {
            string sDataSource = e.DataSource;

            if (e.IsRunning)
            {
                bool bNotHave = false;
                lock (__cDataSources) {
                    if (!__cDataSources.Contains(sDataSource))
                    {
                        __cDataSources.Add(sDataSource);
                        bNotHave = true;
                    }
                }

                if (bNotHave)
                {
                    AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
                    cService.onQuote += QuoteService_onQuote;
                    cService.onSubscribeCompleted  += QuoteService_onCompleted;
                    cService.onComplementCompleted += QuoteService_onCompleted;
                }
            }
            else
            {
                lock (__cDataSources) {
                    __cDataSources.Remove(sDataSource);
                }
            }
        }
 private void btnCancel_Click(object sender, EventArgs e)
 {
     if (!__cQuoteService.IsLogin)
     {
         __cQuoteService.Dispose();
         __cQuoteService = null;
     }
     this.DialogResult = DialogResult.Cancel;
 }
Beispiel #6
0
		private void DisposeResources() {
			if (__cQuoteService != null) {
				__cQuoteService.onQuote -= QuoteService_onQuote;
				__cQuoteService.onDisconnected -= QuoteService_onDisconnected;
				__cQuoteService.onQuoteDateTime -= QuoteService_onQuoteDateTime;
				__cQuoteService = null;
			}
			__cDataLoader.Dispose();  //釋放資料讀取者資源
		}
Beispiel #7
0
        private void QuoteService_onCompleted(object sender, QuoteComplementCompletedEvent e)
        {
            AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(e.DataSource);
            IQuote cQuote = cService.Storage.GetQuote(e.SymbolId);

            if (cQuote != null)
            {
                QuoteUpdate(e.ExchangeName, e.DataSource, cQuote);                  //更新報價
                RefreshGrid();
            }
        }
 private void CheckAndUpdateAccount(_QuoteServiceInfo info)
 {
     if (info.Enabled)
     {
         AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(info.DataSource);
         info.LogonId = cService.UserId;
     }
     else
     {
         info.LogonId = string.Empty;
     }
 }
Beispiel #9
0
        /// <summary>
        ///   取得即時報價服務
        /// </summary>
        /// <param name="dataSource">報價元件名稱</param>
        /// <returns>返回值: AbstractQuoteService 報價服務抽象類別</returns>
        public AbstractQuoteService GetQuoteService(string dataSource)
        {
            int iIndex = 0;
            AbstractQuoteService cQuoteService = null;

            lock (__cIndexs) {
                if (__cIndexs.TryGetValue(dataSource, out iIndex))
                {
                    cQuoteService = __cQuoteServices[iIndex];
                }
            }
            return(cQuoteService);
        }
Beispiel #10
0
 private void RemoveQuoteServices()
 {
     lock (__cDataSources) {
         foreach (string sDataSource in __cDataSources)
         {
             AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
             cService.onQuote -= QuoteService_onQuote;
             cService.onSubscribeCompleted  -= QuoteService_onCompleted;
             cService.onComplementCompleted -= QuoteService_onCompleted;
         }
         __cDataSources.Clear();
     }
 }
Beispiel #11
0
		/// <summary>
		///   連結即時報價資訊源
		/// </summary>
		public void ConnectQuoteServer() {
			if (this.Bars != null) {
				string sDataSource = this.Bars.Request.DataFeed;
				AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
				if (cService != null && cService != __cQuoteService) {
					__cQuoteService = cService;
					__cQuoteService.AddSubscribe(this.Bars.Request.Symbol);

					__cQuoteService.onQuote += QuoteService_onQuote;
					__cQuoteService.onQuoteDateTime += QuoteService_onQuoteDateTime;
				}
			}
		}
Beispiel #12
0
        private void btnRefreshSymbol_Click(object sender, EventArgs e)
        {
            _QuoteServiceInfo cQuoteInfo = dataGrid.SelectedDataRows[0] as _QuoteServiceInfo;

            if (cQuoteInfo.Enabled)
            {
                AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(cQuoteInfo.DataSource);
                if (cService != null)
                {
                    cService.SymbolUpdate();
                }
            }
        }
		private Queue<DateTime> CreateRealtimePeriods() {
			DateTime cToday = DateTime.UtcNow.AddHours(__cSettings.TimeZone);
			string sDataSource = __cDataRequest.DataFeed;
			AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
			if (cService != null) {
				cToday = cService.TradeDate;
			}

			//從新計算今日的起始時間與結束時間的周期(有些商品不是每天的開收盤都一樣)
			SessionObject cSession = __cSettings.GetSessionFromToday();
			__cDataRequest.Resolution.CalculateRate(cSession.GetStartTimeForDaylight(), cSession.GetCloseTimeForDaylight(), __cSettings.Sessions.Count);

			//從新計算結算日期
			__cSettings.SetExpirationFromTime(cToday);
			__cTimeQueue = __cDataRequest.Resolution.CalculateRealtimePeriods((this.LastBarTime == DateTime.MinValue) ? cToday : this.LastBarTime, cToday, __cSettings.Expiration);
			return __cTimeQueue;
		}
Beispiel #14
0
		/// <summary>
		///   建構子
		/// </summary>
		/// <param name="source">SeriesSymbolData 商品資料類別</param>
		/// <param name="request">資料請求結構</param>
		internal SeriesSymbolDataRand(SeriesSymbolData source, InstrumentDataRequest request) {
			__cSource = source;
			__cSource.onRequestCompleted += SeriesSymbolData_onRequestCompleted;  //附掛請求歷史資料完成的事件通知

			__cIndexer = source.Indexer;
			__iBaseAdjustTotal = __cIndexer.AdjustTotalCount;
			source.Clone(out __cTimes, out __cOpens, out __cHighs, out __cLows, out __cCloses, out __cVolumes);

			__iHistoryIndex = __cCloses.Count - (request.Range.Count + source.RealtimeCount);
			this.Current = 1;  //預設值索引從 1 開始(內部會自動計算對應至 SeriesSymbolData 序列資料的正確索引位置)

			string sDataSource = source.DataRequest.DataFeed;
			AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
			if (cService != null) {
				__cQuoteStorage = cService.Storage;
			}
		}
Beispiel #15
0
		private void QuoteService_onLoginCompleted(object sender, EventArgs e) {
			AbstractQuoteService cService = sender as AbstractQuoteService;
			cService.onLoginCompleted -= QuoteService_onLoginCompleted;
			
			_AsyncEventArgs cArgs = null;
			string sDataSource = cService.DataSource;
			lock (__cAsyncArgs) {
				if (__cAsyncArgs.TryGetValue(sDataSource, out cArgs)) {
					__cAsyncArgs.Remove(sDataSource);
				}
			}

			if (cArgs != null) {
				EventWaitHandle cWaitHandle = cArgs.handle;
				cWaitHandle.Set();
				cWaitHandle.Dispose();
			}
		}
Beispiel #16
0
		/// <summary>
		///   設定報價資訊服務
		/// </summary>
		/// <param name="dataSource">報價資訊來源名稱</param>
		public void SetQuoteService(string dataSource) {
			lock (__cDataSources) {
				if (!__cDataSources.Contains(dataSource)) {
					AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(dataSource);
					if (cService != null) {
						if (!cService.IsLogin) {
							cService.onLoginCompleted += QuoteService_onLoginCompleted;
						}

						cService.onQuote += QuoteService_onQuote;
						cService.onReset += QuoteService_onReset;
						cService.onComplementCompleted += QuoteService_onComplementCompleted;
						
						__cDataSources.Add(dataSource);
					}
				}
			}
		}
        private void btnSave_Click(object sender, EventArgs e)
        {
            __cQuoteService.DataSource = txtDataSource.Text;
            __cQuoteService.RemoteIP   = txtRemoteIP.Text;

            int iRemotePort = 0;

            int.TryParse(txtRemotePort.Text, out iRemotePort);
            __cQuoteService.RemotePort = iRemotePort;

            __cQuoteService.UserId   = txtAccount.Text;
            __cQuoteService.Password = txtPassword.Text;

            __cQuoteService.Save();              //儲存
            __cQuoteService.Dispose();
            __cQuoteService = null;

            this.DialogResult = DialogResult.OK;
        }
Beispiel #18
0
		private void Complement(InstrumentDataRequest request, int millisecondsTimeout) {
			string sDataSource = request.DataFeed;
			if (__cDataSources.Contains(sDataSource)) {
				AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
				if (cService != null) {
					string sSymbolId = request.Symbol;
					IQuote cQuote = cService.Storage.GetQuote(sSymbolId);
					if (cQuote != null && cQuote.ComplementStatus != ComplementStatus.Complemented) {
						EventWaitHandle cWaitHandle = null;
						lock (__cAsyncArgs) {
							_AsyncEventArgs cArgs = null;
							string sHashKey = string.Format("{0}_{1}", sDataSource, sSymbolId);
							if (__cAsyncArgs.TryGetValue(sHashKey, out cArgs)) {
								cWaitHandle = cArgs.handle;
							} else {
								if (cQuote.ComplementStatus == ComplementStatus.NotComplement) {
									cArgs = new _AsyncEventArgs();
									cArgs.request = request;
									
									cWaitHandle = new ManualResetEvent(false);
									cArgs.handle = cWaitHandle;
									__cAsyncArgs.Add(sHashKey, cArgs);

									cService.AddSubscribe(sSymbolId);
									cService.Complement(sSymbolId);
								}
							}
						}

						if (cWaitHandle != null) {
							if (!cWaitHandle.WaitOne(millisecondsTimeout)) {  //等待回補資訊(如果 millisecondsTimeout 為 -1 則會無限等待, 如果有設定 Timeout 在時間到了之後還沒回補完畢就直接釋放 WaitHandle 元件並移除)
								cWaitHandle.Dispose();
								
								string sHashKey = string.Format("{0}_{1}", sDataSource, sSymbolId);
								lock (__cAsyncArgs) {
									__cAsyncArgs.Remove(sHashKey);
								}
							}
						}
					}
				}
			}
		}
		internal void Reset() {
			string sDataSource = __cDataRequest.DataFeed;
			AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(sDataSource);
			if (cService != null) {
				__dOVolume = 0;
				__cDataRequest.Range.To = cService.TradeDate;
				__cDataRequest.Range.Count = this.Indexer.Count;

				int iCount = __iRealtimeCount - (__cCloses.Count - Indexer.RealtimeIndex - 1);  //計算即時報價資訊所需要的 Bars 個數量(調整好等候合併即時報價)
				if (iCount > 0) {
					this.AdjustSize(iCount);  //調整即時資訊所需要的空間
				}
				CreateRealtimePeriods();  //建立即時資訊所需要的報價周期

				if (onReset != null) {
					onReset(this, EventArgs.Empty);  //發送清盤重置事件
				}
			}
		}
Beispiel #20
0
        /// <summary>
        ///   取得即時報價服務
        /// </summary>
        /// <param name="quoteServiceInformation">報價服務資訊</param>
        /// <returns>返回值: AbstractQuoteService 報價服務抽象類別</returns>
        public AbstractQuoteService GetQuoteService(QuoteServiceInformation quoteServiceInformation)
        {
            AbstractQuoteService cQuoteService = null;
            string sDataSource = quoteServiceInformation.DataSource;

            if (sDataSource == null)
            {
                string   sFilename = Path.GetFileName(quoteServiceInformation.Location);
                Assembly cAssembly = File.Exists(sFilename) ? Assembly.LoadFile(Path.GetFullPath(sFilename)) : Assembly.LoadFile(Path.GetFullPath(quoteServiceInformation.Location));
                Type     cType     = cAssembly.GetType(quoteServiceInformation.Name);

                cQuoteService = Activator.CreateInstance(cType) as AbstractQuoteService;
                cQuoteService.Load();                   //讀取資訊
            }
            else
            {
                cQuoteService = GetQuoteService(sDataSource);
            }
            return(cQuoteService);
        }
        internal frmProductManager()
        {
            __cDataSources = new List <string>(64);
            __cAllData     = new List <_ProductInfo>(1024);
            __cBasicData   = new List <_ProductInfo>(1024);
            __cCustomData  = new List <_ProductInfo>(128);

            //讀取所有可用的資料來源
            List <AbstractQuoteService> cServices = QuoteManager.Manager.QuoteServices;
            int iCount = cServices.Count;

            for (int i = 0; i < iCount; i++)
            {
                AbstractQuoteService cService = cServices[i];
                __cDataSources.Add(cService.DataSource);
            }

            InitializeComponent();
            InitializeSourceGrid();

            __cPrevFilterButton = toolItem_All;
        }
Beispiel #22
0
        /// <summary>
        ///   從資料來源搜尋商品代號資訊
        /// </summary>
        /// <param name="symbolId">商品代號</param>
        /// <returns>返回值:DataSourceInformation類別列表</returns>
        public List <DataSourceInformation> SearchSymbolFromDataSource(string symbolId)
        {
            int iCount = __cQuoteServices.Count;
            List <DataSourceInformation> cDataSourceInfos = new List <DataSourceInformation>(iCount);

            for (int i = 0; i < iCount; i++)
            {
                AbstractQuoteService cQuoteService = __cQuoteServices[i];
                if (cQuoteService.Storage.IsSymbolExist(symbolId))
                {
                    AbstractExchange cExchange = ProductManager.Manager.GetExchange(cQuoteService.ExchangeName);
                    if (cExchange != null)
                    {
                        Product cProduct = cExchange.GetProduct(symbolId);
                        if (cProduct != null)
                        {
                            cDataSourceInfos.Add(new DataSourceInformation(cExchange.ShortName, cQuoteService, cProduct));
                        }
                    }
                }
            }
            return(cDataSourceInfos);
        }
Beispiel #23
0
        private void timer_Tick(object sender, EventArgs e)
        {
            timer.Enabled = false;

            int iCount = source.Count;

            for (int i = 0; i < iCount; i++)
            {
                _QuoteServiceInfo cQuoteInfo = source.GetItemAt(i);
                if (cQuoteInfo.Enabled)
                {
                    AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(cQuoteInfo.DataSource);
                    if (cService != null)
                    {
                        long lPacketCount = cService.PacketCount;
                        cQuoteInfo.SetPacketCount(lPacketCount);
                    }
                }
            }

            source.Refresh();
            timer.Enabled = true;
        }
Beispiel #24
0
        internal void AddQuoteService(AbstractQuoteService quoteService)
        {
            int    iIndex      = -1;
            bool   bNotHave    = false;
            string sDataSource = quoteService.DataSource;

            lock (__cIndexs) {
                if (!__cIndexs.TryGetValue(sDataSource, out iIndex))
                {
                    __cIndexs.Add(sDataSource, __cQuoteServices.Count);
                    __cQuoteServices.Add(quoteService);
                    bNotHave = true;
                }
            }

            if (bNotHave)
            {
                if (onQuoteServiceSwitchChanged != null)
                {
                    onQuoteServiceSwitchChanged(this, new QuoteServiceSwitchChangedEvent(sDataSource, true));
                }
            }
        }
Beispiel #25
0
        internal void RemoveQuoteService(string dataSource)
        {
            int  iIndex = -1;
            bool bHave  = false;

            lock (__cIndexs) {
                if (__cIndexs.TryGetValue(dataSource, out iIndex))
                {
                    iIndex = __cIndexs[dataSource];

                    AbstractQuoteService cCurrent = __cQuoteServices[iIndex];
                    cCurrent.Dispose();                      //釋放資源

                    int iLast = __cQuoteServices.Count - 1;
                    if (iLast > 0 && iLast > iIndex)
                    {
                        AbstractQuoteService cLast = __cQuoteServices[iLast];

                        __cIndexs[cLast.DataSource] = iIndex;
                        __cQuoteServices[iIndex]    = cLast;
                    }

                    __cIndexs.Remove(dataSource);
                    __cQuoteServices.RemoveAt(iLast);
                    bHave = true;
                }
            }

            if (bHave)
            {
                if (onQuoteServiceSwitchChanged != null)
                {
                    onQuoteServiceSwitchChanged(this, new QuoteServiceSwitchChangedEvent(dataSource, false));
                }
            }
        }
Beispiel #26
0
        private void frmTrustViewer_Shown(object sender, System.EventArgs e)
        {
            AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(__sDataSource);

            if (cService != null)
            {
                __cStorage = cService.Storage;

                IQuote cQuote = cService.Storage.GetQuote(__sSymbolId);
                if (cQuote != null)
                {
                    __cTimer           = new System.Timers.Timer(100);
                    __cTimer.AutoReset = false;
                    __cTimer.Elapsed  += Timer_onElapsed;

                    cService.onQuote += QuoteService_onQuote;

                    TrustUpdate();
                    RefreshGrid();
                }
            }

            this.Focus();
        }
Beispiel #27
0
        static void Main(string[] args)
        {
            XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("log4net_config.xml"));

            ServicePointManager.DefaultConnectionLimit = 1024;

            ProductManager.Load("exchanges");
            QuoteManager.Manager.Refresh("plugins\\quotes");

            QuoteServiceInformation[] cQuoteServiceInfos = QuoteManager.Manager.GetQuoteServiceInformations();
            QuoteManager.Manager.StartQuoteService(cQuoteServiceInfos[0]);
            AbstractQuoteService cService = QuoteManager.Manager.GetQuoteService(cQuoteServiceInfos[0].DataSource);

            cService.Load();
            cService.onLoginCompleted += Service_onLoginCompleted;

            Zeghs.Settings.GlobalSettings.Load();

            //*
            //轉換三竹資訊源即時資料
            if (args.Length > 0 && args[0].Equals("/admin"))
            {
                int iCommand = PrintMenu();
                if (iCommand > 0)
                {
                    ExcuteCommand(iCommand);
                }
            }
            else
            {
                MitakeSourceAdapter cAdapter = new MitakeSourceAdapter();
                cAdapter.Load(DateTime.Today);
            }
            // */

            /* 轉換期交所指數期貨 RPT 資料
             * if (args.Length > 0 && args[0].Equals("/admin")) {
             *      int iCommand = PrintMenu();
             *      if (iCommand > 0) {
             *              ExcuteCommand(iCommand);
             *      }
             * } else {
             *      bool bEvent = __cManualEvent.WaitOne(60000);
             *      FuturesRptAdapter.Convert(DateTime.Now);
             * }
             * // */

            //DumpDataUtil.Load("TXF0.tw", true, new DateTime(2017, 12, 22, 8, 45, 0), new DateTime(2017, 12, 26, 13, 45, 0));
            //DumpDataUtil.Save("TXF0.tw", true, "abc.txt", new DateTime(2013,11,20,8,45,0));

            //FuturesCsvAdapter.Convert();  //轉換CSV使用

            //bool bEvent = __cManualEvent.WaitOne(60000);

            /*
             * MitakeSourceAdapter cAdapter = new MitakeSourceAdapter();
             * DateTime cStartDate = new DateTime(2012, 1, 1);
             * DateTime cEndDate = new DateTime(2014, 12, 31);
             *
             * while (cStartDate <= cEndDate) {
             *      cAdapter.Load(cStartDate);
             *      cStartDate = cStartDate.AddSeconds(86400);
             * }
             * cAdapter.Dispose();
             *
             * //*/
            //System.Console.WriteLine("Completed...");
            //System.Console.ReadLine();
            //return;

            __cManualEvent.Dispose();
            QuoteManager.Manager.CloseAll();
        }
 /// <summary>
 ///   建構子
 /// </summary>
 /// <param name="exchangeName">交易所簡稱</param>
 /// <param name="quoteService">即時報價服務</param>
 /// <param name="product">商品資訊</param>
 public DataSourceInformation(string exchangeName, AbstractQuoteService quoteService, Product product)
 {
     __sExchangeName = exchangeName;
     __cQuoteService = quoteService;
     __cProduct      = product;
 }
        private void frmCreateScriptSetting_Load(object sender, EventArgs e)
        {
            //列舉所有圖表周期
            EResolution[] cResolutions = Enum.GetValues(typeof(EResolution)) as EResolution[];
            foreach (EResolution cResolution in cResolutions)
            {
                comboResolution.Items.Add(cResolution.ToString());
            }

            //加入圖層索引資料
            for (int i = 1; i <= this.MaxLayerCount; i++)
            {
                comboLayer.Items.Add(i);
            }

            //加入線寬資料資料
            for (int i = 0; i < 16; i++)
            {
                comboDownWidth.Items.Add(i);
                comboLineWidth.Items.Add(i);
                comboUpWidth.Items.Add(i);
            }

            comboUpWidth.SelectedIndex   = 0;
            comboDownWidth.SelectedIndex = 0;
            comboLineWidth.SelectedIndex = 0;

            //設定顏色值
            colorLegend.SelectedColor = Color.Yellow;
            colorUp.SelectedColor     = Color.Red;
            colorDown.SelectedColor   = Color.Lime;
            colorLine.SelectedColor   = Color.Gray;

            comboTimeZone.SelectedIndex = 0;

            if (__bEdit)
            {
                SetChartSetting();
                SetRequestSetting();

                if (!__bNewSetting)
                {
                    foreach (Control cControl in pageItem_Product.Controls)
                    {
                        cControl.Enabled = false;
                    }

                    foreach (Control cControl in pageItem_Settings.Controls)
                    {
                        cControl.Enabled = false;
                    }
                    listSubChart.Enabled  = true;
                    listChartType.Enabled = false;
                }
            }
            else
            {
                //加入所有已經啟動的報價資料來源名稱
                List <AbstractQuoteService> cServices = QuoteManager.Manager.QuoteServices;
                int iCount = cServices.Count;
                if (iCount > 0)
                {
                    for (int i = 0; i < iCount; i++)
                    {
                        AbstractQuoteService cService = cServices[i];
                        comboDataSources.Items.Add(cService.DataSource);
                    }

                    comboDataSources.SelectedIndex = 0;
                    __bUseDataSource = true;
                }
                else
                {
                    //讀取商品列表並載入
                    LoadProducts(string.Empty);
                    RefreshGrid();                      //更新商品列表 DataGrid
                }

                //加入使用者之前所選過的商品名稱
                if (__cAddSymbolIds.Count > 0)
                {
                    foreach (string sSymbolId in __cAddSymbolIds.Keys)
                    {
                        comboProduct.Items.Insert(0, sSymbolId);
                    }
                    comboProduct.SelectedIndex = 0;
                }

                //設定 ComboBox & listBox 索引值
                comboLayer.Items.Add("New");
                comboLayer.SelectedIndex       = 0;
                comboResolution.SelectedIndex  = 0;
                comboRequestMode.SelectedIndex = 0;
                listSubChart.SelectedIndex     = 0;
                listChartType.SelectedIndex    = 2;
                listAxisRange.SelectedIndex    = 3;

                //預設選取第一種區間模式
                radioRange1.Checked = true;
            }
        }
        internal frmQuoteServiceSettings(AbstractQuoteService quoteService)
        {
            __cQuoteService = quoteService;

            InitializeComponent();
        }