using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace upper_limit_crawler { public static class ULUtil { //static string m_strLogServer = "http://mjjo53.us.to:8000"; static CPUTILLib.CpCybos m_CPUtil = null; static CPUTILLib.CpCodeMgr m_CPCodeMgr = null; static TextBox m_tbLog = null; static string m_strLogDir; static string m_strLogFileName; static string m_strCSVFileName; static TimeSpan m_TimeDiff = TimeSpan.Zero; static int m_iTradingStartTime; static int m_iTradingEndTime; public static void Init(TextBox tbLog) { m_CPUtil = new CPUTILLib.CpCybos(); m_CPCodeMgr = new CPUTILLib.CpCodeMgr(); m_tbLog = tbLog; if (Debugger.IsAttached == true) m_strLogDir = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName + "\\"; m_strLogDir += "log\\"; if (Directory.Exists(m_strLogDir) == false) Directory.CreateDirectory(m_strLogDir); m_strLogFileName = m_strLogDir + "log-" + GetCurTime().ToString("yyyy-MM-dd") + ".txt"; m_strCSVFileName = m_strLogDir + "log-" + GetCurTime().ToString("yyyy-MM-dd") + ".csv"; m_iTradingStartTime = (int)m_CPCodeMgr.GetMarketStartTime(); m_iTradingStartTime *= 100; m_iTradingEndTime = (int)m_CPCodeMgr.GetMarketEndTime(); m_iTradingEndTime *= 100; } public static void SyncServerTime() { DateTime time = GetFastestNISTDate(); m_TimeDiff = time - DateTime.Now; } public static DateTime GetCurTime() { return DateTime.Now + m_TimeDiff; } public static void GetServerTime() { try { string strURL = string.Format("http://www.timeapi.org/utc/now?format={0}", (@"\Y-\m-\d \H:\M:\S")); Uri uri = new Uri(strURL); WebRequest wReq = (HttpWebRequest)WebRequest.Create(uri); // WebRequest 객체 형성 및 HttpWebRequest 로 형변환 wReq.Method = "GET"; // 전송 방법 "GET" or "POST" using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse()) { Stream respPostStream = wRes.GetResponseStream(); StreamReader readerPost = new StreamReader(respPostStream, Encoding.GetEncoding("EUC-KR"), true); string resResult = readerPost.ReadToEnd(); } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) { var resp = (HttpWebResponse)ex.Response; Trace("인터넷 시간 동기화 실패 ({0})", resp.StatusCode); } } } public static DateTime GetFastestNISTDate() { var result = DateTime.MinValue; // Initialize the list of NIST time servers // http://tf.nist.gov/tf-cgi/servers.cgi string[] servers = new string[] { "time-c.nist.gov", "nist1-macon.macon.ga.us", "time.nist.gov", "time-nw.nist.gov", "nist-time-server.eoni.com" }; // Try 5 servers in random order to spread the load Random rnd = new Random(); foreach (string server in servers.OrderBy(s => rnd.NextDouble()).Take(5)) { try { ULUtil.Trace("TimeSync trying [server:{0}]", server); // Connect to the server (at port 13) and get the response string serverResponse = string.Empty; using (var reader = new StreamReader(new System.Net.Sockets.TcpClient(server, 13).GetStream())) { serverResponse = reader.ReadToEnd(); } // If a response was received if (!string.IsNullOrEmpty(serverResponse)) { // Split the response string ("55596 11-02-14 13:54:11 00 0 0 478.1 UTC(NIST) *") string[] tokens = serverResponse.Split(' '); // Check the number of tokens if (tokens.Length >= 6) { // Check the health status string health = tokens[5]; if (health == "0") { // Get date and time parts from the server response string[] dateParts = tokens[1].Split('-'); string[] timeParts = tokens[2].Split(':'); // Create a DateTime instance DateTime utcDateTime = new DateTime( Convert.ToInt32(dateParts[0]) + 2000, Convert.ToInt32(dateParts[1]), Convert.ToInt32(dateParts[2]), Convert.ToInt32(timeParts[0]), Convert.ToInt32(timeParts[1]), Convert.ToInt32(timeParts[2])); // Convert received (UTC) DateTime value to the local timezone result = utcDateTime.ToLocalTime(); return result; // Response successfully received; exit the loop } } } } catch { // Ignore exception and try the next server } } return result; } public static string GetCurTimeString() { return GetCurTime().ToString("yyyy-MM-dd HH:mm:ss"); } public static int GetCurTimeInt() { return int.Parse(GetCurTime().ToString("HHmmss")); } public static int GetTimeDiff(int iTime1, int iTime2) { TimeSpan Diff = DateTime.Parse(iTime2.ToString()) - DateTime.Parse(iTime1.ToString()); return int.Parse(Diff.ToString("HHmmss")); } public static void WebLog(string strURL, string strMsg) { try { // 요청 String -> 요청 Byte 변환 byte[] byteDataParams = UTF8Encoding.UTF8.GetBytes(strMsg); // HttpWebRequest 객체 생성, 설정 Uri reqURI = new Uri(strURL); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(reqURI); request.Method = "POST"; // 기본값 "GET" request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteDataParams.Length; // 요청 Byte -> 요청 Stream 변환 Stream stDataParams = request.GetRequestStream(); stDataParams.Write(byteDataParams, 0, byteDataParams.Length); stDataParams.Close(); // 요청, 응답 받기 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // 응답 Stream 읽기 Stream stReadData = response.GetResponseStream(); StreamReader srReadData = new StreamReader(stReadData, Encoding.Default); // 응답 Stream -> 응답 String 변환 string strResult = srReadData.ReadToEnd(); Console.WriteLine(strResult); } catch(Exception ex) { ex.ToString(); } } public static string GetLogDir() { return m_strLogDir; } public static void Trace(string strMsg) { string strLog = "["+GetCurTimeString()+"] "+strMsg; System.IO.File.AppendAllText(m_strLogFileName, strLog + Environment.NewLine); Console.WriteLine(strLog); bool bScrollToEnd = (m_tbLog.SelectionStart == m_tbLog.Text.Length); m_tbLog.Text += strLog + Environment.NewLine; if(bScrollToEnd == true) { m_tbLog.SelectionStart = m_tbLog.Text.Length; m_tbLog.ScrollToCaret(); } //WebLog(m_strLogServer, strLog); } public static void Trace(string strFormat, params object[] args) { Trace(string.Format(strFormat, args)); } public static void TraceCSV(params object[] args) { string strLog = GetCurTimeString(); foreach (object arg in args) strLog += ", " + arg; System.IO.File.AppendAllText(m_strCSVFileName, strLog + Environment.NewLine, Encoding.UTF8); } public static int GetLimitRemainCountTrace() { return m_CPUtil.GetLimitRemainCount(CPUTILLib.LIMIT_TYPE.LT_TRADE_REQUEST); } public static int GetLimitRemainCountRQ() { return m_CPUtil.GetLimitRemainCount(CPUTILLib.LIMIT_TYPE.LT_NONTRADE_REQUEST); } public static int GetLimitRemainCountSB() { return m_CPUtil.GetLimitRemainCount(CPUTILLib.LIMIT_TYPE.LT_SUBSCRIBE); } public static bool IsConnected() { return (m_CPUtil.IsConnect==1); } public static string GetCodeName(string strCode) { return m_CPCodeMgr.CodeToName(strCode); } public static void Reset() { m_CPUtil = null; System.GC.Collect(0, GCCollectionMode.Forced); System.GC.WaitForFullGCComplete(); m_CPUtil = new CPUTILLib.CpCybos(); } public static bool IsInTime(int iTime1, int iTime2, int iMinDiff) { int iHour1 = iTime1 / 10000; int iMin1 = (iTime1 / 100) % 100; int iSec1 = iTime1 % 100; int iHour2 = iTime2 / 10000; int iMin2 = (iTime2 / 100) % 100; int iSec2 = iTime2 % 100; int iTotalSec1 = iHour1 * 60 * 60 + iMin1 * 60 + iSec1; int iTotalSec2 = iHour2 * 60 * 60 + iMin2 * 60 + iSec2; return (iTotalSec2 >= iTotalSec1 && iTotalSec2 - iTotalSec1 <= iMinDiff * 60); } public static short BlockRequest(CPTRADELib.ICpTdDib obj) { while(GetLimitRemainCountRQ() < 1) Thread.Sleep(500); return obj.BlockRequest2(1); } public static short BlockRequest(CPSYSDIBLib.ISysDib obj) { while(GetLimitRemainCountRQ() < 1) Thread.Sleep(500); return obj.BlockRequest2(1); } public static bool IsTradingTime() { int iCurTime = GetCurTimeInt(); return (iCurTime >= m_iTradingStartTime && iCurTime <= m_iTradingEndTime); } } }