Exemple #1
0
        /// <summary>
        /// 释放对象
        /// </summary>
        public void FreeObject()
        {
            try
            {
                if (thread != null)
                {
                    thread.Abort();
                    thread = null;
                }

                if (manageMarket != null)
                {
                    manageMarket.ForFreeConnectMarket();
                    manageMarket = null;
                }

                if (manageTrade != null)
                {
                    //manageTrade.ForLogout(password, "");
                    manageTrade.ForFreeClient();
                    manageTrade = null;
                }
            }
            catch (Exception ex)
            {
                PrintLine("释放连接异常:" + ex.Message);
                JHLog.forTradeLog("释放连接异常:" + ex.ToString());
            }
        }
Exemple #2
0
            /// <summary>
            /// 连接服务器
            /// </summary>
            /// <param name="_ip">IP地址</param>
            /// <param name="_port">端口号</param>
            /// <returns>成功返回true, 否则返回false</returns>
            public bool ConnectServer(string _IP, int _port)
            {
                IP   = _IP;
                PORT = _port;

                IPAddress  ip  = IPAddress.Parse(_IP);
                IPEndPoint ipe = new IPEndPoint(ip, _port);

                sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                if (sock == null)
                {
                    return(false);
                }
                try
                {
                    sock.Connect(ipe);
                }
                catch (Exception se)
                {
                    JHLog.forMarketLog("连接行情服务器失败!异常code:" + se.Message);
                    return(false);
                }
                jhMarket.OnConnectMarket();
                return(true);
            }
Exemple #3
0
        public static void StrategyThread(Object _obj)
        {
            Strategy stag = (Strategy)_obj;

            if (stag.printMsg != null)
            {
                stag.printMsg.Print("启动监控线程 成功!");
            }

            Thread.Sleep(3000);

            for (; ;)
            {
                try
                {
                    lock (stag)
                    {
                        stag.OnTimer();
                    }
                    Thread.Sleep(2);
                }
                catch (JHTradeException ex)
                {
                    JHLog.forTradeLog(ex.ToString());
                    if (stag.printMsg != null)
                    {
                        stag.printMsg.Print("监控线程执行异常!message:" + ex.Message);
                        stag.printMsg.Print("重新启动监控线程 . . .");
                    }
                    stag.thread = new Thread(new ParameterizedThreadStart(StrategyThread));
                    stag.thread.Start(stag);
                    break;
                }catch (JHMarketException JM)
                {
                    JHLog.forTradeLog(JM.ToString());
                    if (stag.printMsg != null)
                    {
                        stag.printMsg.Print("监控线程执行异常!message:" + JM.Message);
                        stag.printMsg.Print("重新启动监控线程 . . .");
                    }
                    stag.thread = new Thread(new ParameterizedThreadStart(StrategyThread));
                    stag.thread.Start(stag);
                    break;
                }
                catch (Exception ex)
                {
                    JHLog.forTradeLog(ex.ToString());
                    stag.PrintLine("异常停止!" + ex.Message);
                    break;
                }
            }
        }
Exemple #4
0
            /// <summary>
            /// 登陆行情服务器
            /// </summary>
            /// <param name="_username">用户名称</param>
            /// <param name="_password">密码</param>
            /// <param name="_callbackIP">回掉的IP地址</param>
            /// <returns></returns>
            public bool Login(string _username, string _password, string _callbackIP)
            {
                UserName   = _username;
                Password   = _password;
                CallbackIP = _callbackIP;

                PDUHead pdh = new PDUHead();

                pdh.setCommandId(PDUHead.JH_LOGIN);
                pdh.setStatus(0);
                pdh.setSvrTime(0);
                pdh.setTotalLength(PDUHead.PDU_HEAD_LEN + PDUHead.JH_LOGIN_LEN);

                byte[] head  = pdh.ToByteArray();
                byte[] body  = pdh.LoginBody(_username, _password, _callbackIP);
                byte[] login = pdh.HeadAndBody(head, body);

                try
                {
                    sock.Send(login);
                    byte[] rspl = new byte[14];
                    int    len  = sock.Receive(rspl, PDUHead.PDU_HEAD_LEN, SocketFlags.None);
                    if (len != PDUHead.PDU_HEAD_LEN)
                    {
                        JHLog.forMarketLog("登陆行情服务器失败!");
                        return(false);
                    }
                    PDUHead pDU = new PDUHead();
                    pDU.fromString(rspl);
                    if (pDU.status != 0)
                    {
                        JHLog.forMarketLog("登陆行情服务器失败!");
                        return(false);
                    }

                    //登陆成功后消息推送给客户端
                    jhMarket.OnLogin(pDU.svrTime + "");
                    //启动行情接收线程
                    thread = new Thread(new ParameterizedThreadStart(ReceiveThread));
                    thread.Start(this);
                    return(true);
                }catch (Exception ex)
                {
                    JHLog.forMarketLog("登陆行情服务器失败!" + ex.Message);
                    return(false);
                }
            }
Exemple #5
0
 public void OnExceptionMessage(EnumStateFlag sf, string _exMsg)
 {
     //写入日志
     if (sf == EnumStateFlag.行情请求 || sf == EnumStateFlag.行情回报)
     {
         JHLog.forMarketLog(_exMsg);
     }
     else if (sf == EnumStateFlag.交易请求 || sf == EnumStateFlag.交易回报)
     {
         JHLog.forTradeLog(_exMsg);
     }
     //打印到控制台
     if (printMsg != null)
     {
         printMsg.Print(_exMsg);
     }
 }
Exemple #6
0
        public void OnJHTradeForLogin(Trade_Head msgHead)
        {
            if (msgHead.OperTime == "")
            {
                if (stateNotify != null)
                {
                    stateNotify.OnNotify(this, NotifyCode.TRADE_TIME_ERROR);
                }
                return;
            }
            string msg = "";
            bool   brt = false;

            if (int.Parse(msgHead.ReturnCode) == 0)
            {
                msg = "登陆交易服务器成功! code:" + msgHead.ReturnCode + ",desc:" + msgHead.ReturnDesc;
            }
            else
            {
                brt = true;
                msg = "登陆交易服务器异常! code:" + msgHead.ReturnCode + ",desc:" + msgHead.ReturnDesc;
                JHLog.forTradeLog(msg);
            }
            PrintLine(msg);
            if (brt)
            {
                return;
            }

            DateTime servTime;

            //计算时间差
            servTime = Convert.ToDateTime(msgHead.OperTime);
            //保存服务器推送时间
            lastTradeHeartTime = GetTimestamp(servTime);
            //保持本地与服务器时间差
            time_trade_dif = lastTradeHeartTime - GetTimestamp();
            //通知准备工作已经完成
            OnInitInstance();
        }
Exemple #7
0
 /// <summary>
 /// 获取本机MAC地址
 /// </summary>
 /// <returns>本机MAC地址</returns>
 public static string GetMacAddress()
 {
     try
     {
         string          mac = "";
         ManagementClass mc;
         mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
         ManagementObjectCollection moc = mc.GetInstances();
         foreach (ManagementObject mo in moc)
         {
             if (mo["IPEnabled"].ToString() == "True")
             {
                 mac = mo["MacAddress"].ToString();
             }
         }
         return(mac);
     }
     catch
     {
         JHLog.forTradeLog("获取本机MAC失败!");
         return("");
     }
 }
Exemple #8
0
 // 启动交易
 public void InitInstance()
 {
     try
     {
         trade_login_ok = false;
         IsTradeNo      = false;
         if (manageMarket != null)
         {
             manageMarket.ForFreeConnectMarket();
         }
         manageMarket = new ManageMarket(this);
         bool IsConnect = manageMarket.ForConnectMarket(market_addr, int.Parse(market_port));
         if (IsConnect == false)
         {
             manageMarket.ForMarketFreeConnect();
             manageMarket = null;
         }
     }catch (Exception ex)
     {
         JHLog.forMarketLog("连接行情服务器异常!" + ex.ToString());
         throw new JHMarketException("连接行情服务器异常!");
     }
 }
Exemple #9
0
            /// <summary>
            /// 线程处理函数 如果登陆成功后用来接收行情
            /// </summary>
            /// <param name="obj"></param>
            public static void ReceiveThread(object obj)
            {
                SocketWorker sw   = ((SocketWorker)obj);
                Socket       sock = sw.getSocket();

                byte[] bufferArr  = new byte[2 * 1024];             //包体
                byte[] PDUHeadArr = new byte[PDUHead.PDU_HEAD_LEN]; //数据长度
                int    totalLen   = 0;                              //实际数据长度,初始为0
                int    readLen    = 0;                              //读取的长度

                try
                {
                    for (; sock.Connected;)
                    {
                        //初始化缓存
                        Array.Clear(PDUHeadArr, 0, PDUHeadArr.Length);
                        Array.Clear(bufferArr, 0, bufferArr.Length);

                        //接收包头数据
                        int headBuf    = PDUHead.PDU_HEAD_LEN;
                        int headLeft   = PDUHead.PDU_HEAD_LEN;
                        int headOffset = 0;

                        while (sock.Connected && headLeft > 0)
                        {
                            readLen = sock.Receive(PDUHeadArr, headOffset, headLeft, SocketFlags.None);
                            if (readLen < 0)
                            {
                                throw new MarketException("接收行情包头数据异常!");
                            }
                            if (readLen == 0)
                            {
                                break;
                            }
                            headOffset += readLen;
                            headLeft   -= readLen;
                        }
                        //判断接收的数据长度是否有误
                        readLen = headBuf - headLeft;           //抛出异常
                        if (readLen != PDUHead.PDU_HEAD_LEN)
                        {
                            throw new MarketException("接收行情包头数据异常!");
                        }
                        //解析头信息
                        PDUHead phed = PDUHead.byteToPDUHead(PDUHeadArr);
                        //查看缓存区大小是否够用。
                        totalLen = phed.totalLength;
                        if (totalLen > bufferArr.Length)
                        {
                            bufferArr = new byte[totalLen];
                        }

                        //接收包体数据
                        int bodyBuf    = totalLen - PDUHead.PDU_HEAD_LEN;
                        int bodyLeft   = totalLen - PDUHead.PDU_HEAD_LEN;
                        int bodyOffset = 0;

                        while (sock.Connected && bodyLeft > 0)
                        {
                            readLen = sock.Receive(bufferArr, bodyOffset, bodyLeft, SocketFlags.None);//读取socket数据

                            if (readLen < 0)
                            {
                                throw new MarketException("接收行情包体数据异常!");
                            }
                            if (readLen == 0)
                            {
                                break;
                            }
                            bodyLeft   -= readLen;
                            bodyOffset += readLen;
                        }

                        readLen = bodyBuf - bodyLeft;           //抛出异常
                        if (readLen != totalLen - PDUHead.PDU_HEAD_LEN)
                        {
                            throw new MarketException("接收行情包体数据异常!");
                        }

                        //查看接收数据是否是行情数据
                        if (phed.commandId == PDUHead.JH_REALTRADEINFO)
                        {
                            Tick tck = Tick.byteToTick(bufferArr);
                            if (tck == null)
                            {
                                throw new MarketException("解析行情数据包异常!");
                            }
                            sw.GetJHMarket().ReturnTick(tck);
                            sw.GetJHMarket().OnHeartTest(phed.svrTime);
                            continue;
                        }
                        //查看数据是否是心跳数据
                        if (phed.commandId == PDUHead.JH_ACTIVETEST)
                        {
                            sw.GetJHMarket().OnHeartTest(phed.svrTime);
                            continue;
                        }
                    }
                    //异常
                }catch (MarketException me)
                {
                    sw.GetJHMarket().OnError("error@" + "Socket Worker Thread," + me.Message);
                    JHLog.forMarketLog("Socket Worker Thread," + me.ToString());
                    return;
                }
                catch (Exception ex)
                {
                    JHLog.forMarketLog("Socket Worker Thread," + ex.ToString());
                    return;
                }
            }