private void timer2_Tick(object sender, System.Timers.ElapsedEventArgs e) { int remainTm = 0; switch (quoteProgramMode) { case QuoteProgramModeOS.QPM_MarketAM://小日經上午盤中作單模式 { remainTm = (int)(convertJpnTimeToTw(g_marketEndTime_AM) - DateTime.Now).TotalSeconds; } break; case QuoteProgramModeOS.QPM_MarketPM://小日經下午盤中作單模式 { remainTm = (int)(convertJpnTimeToTw(g_marketEndTime_PM) - DateTime.Now).TotalSeconds; } break; } TimeSpan t = TimeSpan.FromSeconds(remainTm); string msg = t.Hours.ToString() + ":" + t.Minutes.ToString() + ":" + t.Seconds.ToString(); this.BeginInvoke(new UpdateControl(_mUpdateControl), new object[] { this.lblServerTime, msg }); switch (quoteProgramMode) { #region QPM_AllProduct case (QuoteProgramModeOS.QPM_AllProduct): { if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; if (prodStrCol.Count < 100) break; List<DateTime> prodOSEHot3 = new List<DateTime>(); DateTime _todate = DateTime.Now; string jpnPrefix = "JNM"; foreach (string strProducts in prodStrCol) { //Console.WriteLine(strProducts.Trim()); string[] prodFulNm = (strProducts.Trim()).Split(','); if (prodFulNm[0].ToUpper().IndexOf("OSE") >= 0) { string stID = prodFulNm[2]; if ((stID.ToUpper().IndexOf("JNM") == 0) && (stID.ToUpper().IndexOf("PM") == -1)) // { jpnPrefix = stID.Substring(0, 3); int _my = int.Parse(stID.Substring(3, 4)); if (_my > 1000) { int yr = _my / 100; int mth = _my - yr * 100; DateTime dDate = new DateTime(2000 + yr, mth, _todate.Day); prodOSEHot3.Add(dDate); } } } } // Note.這邊改為交易下個熱門月,這樣就完全沒有換倉問題了 // e.g. 目前1月,交易6月份的商品 int days = 100; //當前時間到目前熱門月結算最多100天(大約3個月) for(int k = 0;k<prodOSEHot3.Count;k++){ DateTime da = prodOSEHot3[k]; int nd = (int)(da - _todate).TotalDays; if (nd < days){ if (k + 1 <= prodOSEHot3.Count){ OSEHotDate = prodOSEHot3[k + 1]; days = nd; } } } if( OSEHotDate.Year < 2) // 至少要有值 OSEHotDate = prodOSEHot3[0]; #region 檢查是否準備換倉[目前無用] // 小日經結算日 各合約月份第二個星期五之前一營業日(如遇假日則提前一天) // 每月份第二個星期三,最快出現在8號 DateTime _secondWendsday = new DateTime(OSEHotDate.Year, OSEHotDate.Month, 8); while (_secondWendsday.DayOfWeek != DayOfWeek.Wednesday) { _secondWendsday = _secondWendsday.AddDays(1); } #endregion string strOSEHotYM = ((OSEHotDate.Year - 2000) * 100 + OSEHotDate.Month).ToString(); OSEJNI_ID_CAP = jpnPrefix + strOSEHotYM; OSEJNIPM_ID_CAP = jpnPrefix + "PM" + strOSEHotYM; if ((OSEJNI_ID_CAP.Length > 0) && (OSEJNI_ID_CAP.Length > 0)) { Console.WriteLine("熱門月 " + OSEJNI_ID_CAP); quoteProgramMode = QuoteProgramModeOS.QPM_MarketKLGetter; // 開始收集K棒 m_nCode = Functions.SKOSQuoteLib_AttachKLineDataCallBack(fNotifyKLineData); m_nCode = Functions.SKOSQuoteLib_RequestKLine("OSE," + OSEJNI_ID_CAP, (short)0); m_nCode = Functions.SKOSQuoteLib_RequestKLine("OSE," + OSEJNIPM_ID_CAP, (short)0); } } break; #endregion #region QPM_MarketKLGetter case (QuoteProgramModeOS.QPM_MarketKLGetter): { if (OseJniHistKL1MinStr.Count < 100) break; if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; // K棒時間排序 List<KLineStr> historyKLine_Day_tSorted = OseJniHistKL1MinStr.OrderBy(c => c.date).ToList(); string fileSavePath = Application.StartupPath + @"\HistoryKLine1Min.xml"; using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileSavePath, false, System.Text.Encoding.ASCII)) { file.WriteLine(OSEJNI_ID_CAP); file.WriteLine(OSEJNIPM_ID_CAP); // 寫入歷史1分K foreach (KLineStr line in historyKLine_Day_tSorted) { file.WriteLine(line._str); } } Process.GetCurrentProcess().Kill(); } break; #endregion #region 上午盤中 case (QuoteProgramModeOS.QPM_MarketAM): { //if (bReconnect) //{ // this.BeginInvoke(new ConnectToQuoteServer(btnConnect_Click), new object[] { null,null}); //} if (DateTime.Compare(DateTime.Now, convertJpnTimeToTw(g_marketEndTime_AM)) > 0) { btnDisconnect_Click(null, null); // try { client.ServiceProxy.Quit(); } // catch { } Process.GetCurrentProcess().Kill(); } } break; #endregion #region 下午盤中 case (QuoteProgramModeOS.QPM_MarketPM): { //if (bReconnect) //{ // this.BeginInvoke(new ConnectToQuoteServer(btnConnect_Click), new object[] { null, null }); //} if (DateTime.Compare(DateTime.Now, convertJpnTimeToTw(g_marketEndTime_PM)) > 0) { btnDisconnect_Click(null, null); try { client.ServiceProxy.Quit(); } catch { } Process.GetCurrentProcess().Kill(); } } break; #endregion #region QPM_AMMarketTickGet case (QuoteProgramModeOS.QPM_AMMarketTickGet): { if ((DateTime.Now - programStartTime).TotalSeconds < 300) { if (LastCbTime.Year < 2) return;//至少有一次callback if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; saveLog_AM(); Process.GetCurrentProcess().Kill(); } else if (LastCbTime.Year < 2) //10分鐘內沒收到任何callback { Process.GetCurrentProcess().Kill(); } } break; #endregion #region QPM_AfterMarket case (QuoteProgramModeOS.QPM_AfterMarket): { if ((DateTime.Now - programStartTime).TotalSeconds < 300) { if (LastCbTime.Year < 2) return;//至少有一次callback if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; saveLog_PM(); Process.GetCurrentProcess().Kill(); } else if (LastCbTime.Year < 2) //10分鐘內沒收到任何callback { Process.GetCurrentProcess().Kill(); } } break; #endregion } }
private void timer1_Tick(object sender, EventArgs e) { //Console.WriteLine(dayTradeSt.convertJpnTimeToTW(dayTradeSt.g_marketEndTime_AM).ToString()); m_nCode = Functions.SKOSQuoteLib_RequestServerTime(); switch(quoteProgramMode) { #region QPM_AllProduct case (QuoteProgramModeOS.QPM_AllProduct): { if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; if (prodStrCol.Count < 100) break; List<DateTime> prodOSEHot3 = new List<DateTime>(); DateTime _todate = DateTime.Now; string jpnPrefix = "JNM"; foreach (string strProducts in prodStrCol) { //Console.WriteLine(strProducts.Trim()); string[] prodFulNm = (strProducts.Trim()).Split(','); if (prodFulNm[0].ToUpper().IndexOf("OSE") >= 0) { string stID = prodFulNm[2]; if ((stID.ToUpper().IndexOf("JNM") == 0) && (stID.ToUpper().IndexOf("PM") == -1)) // { jpnPrefix = stID.Substring(0, 3); int _my = int.Parse(stID.Substring(3, 4)); if (_my > 1000) { int yr = _my / 100; int mth = _my - yr * 100; DateTime dDate = new DateTime(2000 + yr, mth, _todate.Day); prodOSEHot3.Add(dDate); } } } } int days = 150; foreach (DateTime da in prodOSEHot3) { int nd = (int)(da - _todate).TotalDays; if (nd < days) { OSEHotDate = da; days = nd; } } string strOSEHotYM = ((OSEHotDate.Year - 2000) * 100 + OSEHotDate.Month).ToString(); OSEJNI_ID_CAP = jpnPrefix + strOSEHotYM; OSEJNIPM_ID_CAP = jpnPrefix + "PM" + strOSEHotYM; if ((OSEJNI_ID_CAP.Length > 0) && (OSEJNI_ID_CAP.Length > 0)) { Console.WriteLine("熱門月 " + OSEJNI_ID_CAP); quoteProgramMode = QuoteProgramModeOS.QPM_MarketKLGetter; // 開始收集K棒 m_nCode = Functions.SKOSQuoteLib_AttachKLineDataCallBack(fNotifyKLineData); m_nCode = Functions.SKOSQuoteLib_RequestKLine("OSE," + OSEJNI_ID_CAP, (short)0); m_nCode = Functions.SKOSQuoteLib_RequestKLine("OSE,"+ OSEJNIPM_ID_CAP, (short)0); } } break; #endregion #region QPM_MarketKLGetter case (QuoteProgramModeOS.QPM_MarketKLGetter): { if (OseJniHistKL1MinStr.Count < 100) break; if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; // K棒時間排序 List<KLineStr> historyKLine_Day_tSorted = OseJniHistKL1MinStr.OrderBy(c => c.date).ToList(); string fileSavePath = Application.StartupPath + @"\HistoryKLine1Min.xml"; using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileSavePath, false, System.Text.Encoding.ASCII)) { file.WriteLine(OSEJNI_ID_CAP); file.WriteLine(OSEJNIPM_ID_CAP); // 寫入歷史1分K foreach (KLineStr line in historyKLine_Day_tSorted) { file.WriteLine(line._str); } } Process.GetCurrentProcess().Kill(); } break; #endregion #region 上午盤中 //case (QuoteProgramModeOS.QPM_MarketAM): //{ // if (DateTime.Compare(DateTime.Now, dayTradeSt.convertJpnTimeToTw(dayTradeSt.g_marketEndTime_AM)) > 0) // { // btnDisconnect_Click(null,null); // if (bServerMode && bConnected) // { // scserv.Stop(); // // close reply // m_bReplyDisconnect = true; // m_nCode = OrderReply.Functions.SKReplyLib_CloseByID(m_strLoginID); // } // Process.GetCurrentProcess().Kill(); // } //} //break; #endregion #region 下午盤中 //case (QuoteProgramModeOS.QPM_MarketPM): //{ // if (DateTime.Compare(DateTime.Now, dayTradeSt.convertJpnTimeToTw(dayTradeSt.g_marketEndTime_PM)) > 0) // { // if (dayTradeSt.g_CurDeposit == 0) // { // btnDisconnect_Click(null, null); // if (bServerMode && bConnected) // { // scserv.Stop(); // // close reply // m_bReplyDisconnect = true; // m_nCode = OrderReply.Functions.SKReplyLib_CloseByID(m_strLoginID); // } // Process.GetCurrentProcess().Kill(); // } // } //} //break; #endregion #region QPM_AMMarketTickGet //case (QuoteProgramModeOS.QPM_AMMarketTickGet): //{ // if (LastCbTime.Year < 2) return;//至少有一次callback // if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; // saveLog_AM(); // if (bServerMode) // { // scserv.Stop(); // // close reply // m_bReplyDisconnect = true; // m_nCode = OrderReply.Functions.SKReplyLib_CloseByID(m_strLoginID); // } // Process.GetCurrentProcess().Kill(); //} //break; #endregion #region QPM_AfterMarket //case (QuoteProgramModeOS.QPM_AfterMarket): //{ // if (LastCbTime.Year < 2) return;//至少有一次callback // if ((DateTime.Now - LastCbTime).TotalSeconds < 5) return; // if (bServerMode) // { // scserv.Stop(); // // close reply // m_bReplyDisconnect = true; // m_nCode = OrderReply.Functions.SKReplyLib_CloseByID(m_strLoginID); // } // saveLog_PM(); // Process.GetCurrentProcess().Kill(); //} //break; #endregion } }
//---------------------------------------------------------------------- // Initialize //---------------------------------------------------------------------- public ClientMain(string[] args) { //開啟之後特殊模式判別,雙擊開啟不會有任何特殊模式 string strMode = ""; int iMode = 0; try { strMode = args[0]; iMode = int.Parse(strMode); } catch { } switch (iMode) { case 0: quoteProgramMode = QuoteProgramModeOS.QPM_Neutural; Console.WriteLine("當前模式為 Client 一般雙擊開啟"); break; case 1: quoteProgramMode = QuoteProgramModeOS.QPM_AllProduct; Console.WriteLine("當前模式為 Server 取得當前商品列表"); break; case 3: quoteProgramMode = QuoteProgramModeOS.QPM_MarketAM; Console.WriteLine("當前模式為 Client 小日經上午盤中作單模式"); break; case 4: quoteProgramMode = QuoteProgramModeOS.QPM_AMMarketTickGet; Console.WriteLine("當前模式為 Client 小日經上午盤後Tick資訊擷取,上午倉位紀錄"); break; case 5: quoteProgramMode = QuoteProgramModeOS.QPM_MarketPM; Console.WriteLine("當前模式為 Client 小日經下午盤作單模式"); break; case 6: quoteProgramMode = QuoteProgramModeOS.QPM_AfterMarket; Console.WriteLine("當前模式為 Client 小日經下午盤後Tick資訊擷取,寫入每日歷史紀錄"); break; } InitializeComponent(); fConnect = new FOnConnect(OnConnect); GC.KeepAlive(fConnect); fQuoteUpdate = new FOnGetStockIdx(OnQuoteUpdate); GC.KeepAlive(fQuoteUpdate); fNotifyTicks = new FOnNotifyTicks(OnNotifyTicks); GC.KeepAlive(fNotifyTicks); fOnNotifyBest5 = new FOnGetStockIdx(OnNotifyBest5); GC.KeepAlive(fOnNotifyBest5); fOverseaProducts = new FOnOverseaProducts(OnOverseaProducts); GC.KeepAlive(fOverseaProducts); fNotifyServerTime = new FOnNotifyServerTime(OnNotifyServerTime); GC.KeepAlive(fNotifyServerTime); fNotifyKLineData = new FOnNotifyKLineData(OnNotifyKLineData); GC.KeepAlive(fNotifyKLineData); fOnNotifyTicksGet = new FOnNotifyTicksGet(OnNotifyTicksGet); GC.KeepAlive(fOnNotifyTicksGet); m_Logger = new Logger(); client = ScsServiceClientBuilder.CreateClient<IOSQuoteService>(new ScsTcpEndPoint("127.0.0.1", 10083)); g_marketStartTime_AM = new DateTime(todate.Year, todate.Month, todate.Day, 9, 0, 0); g_marketEndTime_AM = new DateTime(todate.Year, todate.Month, todate.Day, 15, 15, 59); g_marketStartTime_PM = new DateTime(todate.Year, todate.Month, todate.Day, 16, 29, 59); DateTime nxDate = todate.AddDays(1); g_marketEndTime_PM = new DateTime(nxDate.Year, nxDate.Month, nxDate.Day, 3, 0, 0); //上午收盤前10分,啟動timer時間 g_marketNearEndTime_AM = g_marketEndTime_AM.AddMinutes(-10); //上午收盤前10分,啟動timer時間 g_marketNearEndTime_PM = g_marketEndTime_PM.AddMinutes(-10); this.tabControl1.SelectTab(1); }
//---------------------------------------------------------------------- // Initialize //---------------------------------------------------------------------- public ServMain(string[] args) { //開啟之後特殊模式判別,雙擊開啟不會有任何特殊模式 string strMode = ""; int iMode = 0; try { strMode = args[0]; iMode = int.Parse(strMode); } catch { } switch (iMode) { case 0: quoteProgramMode = QuoteProgramModeOS.QPM_Neutural; Console.WriteLine("當前模式為 Server 一般雙擊開啟"); break; case 1: quoteProgramMode = QuoteProgramModeOS.QPM_AllProduct; Console.WriteLine("當前模式為 Server 取得當前商品列表"); break; case 2: quoteProgramMode = QuoteProgramModeOS.QPM_MarketKLGetter; Console.WriteLine("當前模式為 Server 昨日下午盤K棒資訊擷取"); break; case 3: quoteProgramMode = QuoteProgramModeOS.QPM_MarketAM; Console.WriteLine("當前模式為 Server 小日經上午盤中作單模式"); break; case 4: quoteProgramMode = QuoteProgramModeOS.QPM_AMMarketTickGet; Console.WriteLine("當前模式為 Server 小日經上午盤後Tick資訊擷取,上午倉位紀錄"); break; case 5: quoteProgramMode = QuoteProgramModeOS.QPM_MarketPM; Console.WriteLine("當前模式為 Server 小日經下午盤作單模式"); break; case 6: quoteProgramMode = QuoteProgramModeOS.QPM_AfterMarket; Console.WriteLine("當前模式為 Server 小日經下午盤後Tick資訊擷取,寫入每日歷史紀錄"); break; } InitializeComponent(); fConnect = new FOnConnect(OnConnect); GC.KeepAlive(fConnect); fQuoteUpdate = new FOnGetStockIdx(OnQuoteUpdate); GC.KeepAlive(fQuoteUpdate); fNotifyTicks = new FOnNotifyTicks(OnNotifyTicks); GC.KeepAlive(fNotifyTicks); fOnNotifyBest5 = new FOnGetStockIdx(OnNotifyBest5); GC.KeepAlive(fOnNotifyBest5); fOverseaProducts = new FOnOverseaProducts(OnOverseaProducts); GC.KeepAlive(fOverseaProducts); fNotifyServerTime = new FOnNotifyServerTime(OnNotifyServerTime); GC.KeepAlive(fNotifyServerTime); fNotifyKLineData = new FOnNotifyKLineData(OnNotifyKLineData); GC.KeepAlive(fNotifyKLineData); fOnNotifyTicksGet = new FOnNotifyTicksGet(OnNotifyTicksGet); GC.KeepAlive(fOnNotifyTicksGet); // Order Lib fOrderAsync = new OrderReply.FOnOrderAsyncReport(OnOrderAsyncReport); GC.KeepAlive(fOrderAsync); fOnExecutionReport = new OrderReply.FOnGetExecutionReoprt(OnExecutionReport); GC.KeepAlive(fOnExecutionReport); GC.SuppressFinalize(fOnExecutionReport); // Reply Lib fData = new OrderReply.FOnData(OnReceiveReplyData); GC.KeepAlive(fData); fRConnect = new OrderReply.FOnConnect(OnRConnect); GC.KeepAlive(fConnect); fDisconnect = new OrderReply.FOnConnect(OnRDisconnect); GC.KeepAlive(fDisconnect); fComplete = new OrderReply.FOnComplete(OnComplete); GC.KeepAlive(fComplete); m_Logger = new Logger(); m_Tick = new TICK(); // 繪圖初始 StockPointList _stklist = new StockPointList(); StockPointList _ema11Plist = new StockPointList(); StockPointList _ema22Plist = new StockPointList(); this.AsyncEventHandler += new AsyncEventArgs(_AsyncEventHandler); m_updGraphDelegate = new updGraphDelegate(updGraph); CreateGraph(zg1, _stklist, _ema11Plist, _ema22Plist); // 啟動策略,更新繪圖 dayTradeSt = new JNAutoDayTrade_Strategy(Application.StartupPath,this); //更新繪圖資訊 DrawGraphOnce(dayTradeSt.m_KLdata_30Min, dayTradeSt.EMA11.records, dayTradeSt.EMA22.records); // 取得商品資訊已經搬移到client ,一定是server mode //if( // (quoteProgramMode==QuoteProgramModeOS.QPM_MarketAM) || // (quoteProgramMode == QuoteProgramModeOS.QPM_AMMarketTickGet) || // (quoteProgramMode == QuoteProgramModeOS.QPM_MarketPM) || // (quoteProgramMode == QuoteProgramModeOS.QPM_AfterMarket) // ) bServerMode = true; //今天日期 DateTime todate = DateTime.Now; // Server 不分上下午,只需開收盤時間 g_marketStartTime_AM = new DateTime(todate.Year, todate.Month, todate.Day, 9, 0, 0); DateTime nxDate = todate.AddDays(1); g_marketEndTime_PM = new DateTime(nxDate.Year, nxDate.Month, nxDate.Day, 3, 0, 0); this.timer2.Interval = 100; this.timer2.Start(); }