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; }
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(); } } } } }
/// <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); }
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; }
private void DisposeResources() { if (__cQuoteService != null) { __cQuoteService.onQuote -= QuoteService_onQuote; __cQuoteService.onDisconnected -= QuoteService_onDisconnected; __cQuoteService.onQuoteDateTime -= QuoteService_onQuoteDateTime; __cQuoteService = null; } __cDataLoader.Dispose(); //釋放資料讀取者資源 }
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; } }
/// <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); }
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(); } }
/// <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; } } }
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; }
/// <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; } }
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(); } }
/// <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; }
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); //發送清盤重置事件 } } }
/// <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; }
/// <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); }
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; }
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)); } } }
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)); } } }
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(); }
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(); }