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

            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 4
0
        //----------------------------------------------------------------------
        // 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();
        }