public void Initialize() { EnableRunning = true; PumpServer.OnNewQuote += WhenNewQuote; CopyServer.OnNewTrade += WhenNewTrade; if (_quoteTimer == null) { _quoteTimer = new Timer(10000); _quoteTimer.Elapsed += SaveQuoteProc; SaveQuoteProc(_quoteTimer, null); } if (_tradeThread == null) { _tradeThread = new System.Threading.Thread( () => { while (Utils.SignalWait(ref EnableRunning, _tradeSignal)) { TradeInfoEventArgs item = null; _queTrades.TryDequeue(out item); PushTrade(item); } foreach (var item in _queTrades.ToArray()) { PushTrade(item); } ServerContainer.FinishStop(); }); _tradeThread.IsBackground = true; _tradeThread.Start(); } var logger = Utils.CommonLog; logger.Info("订单与报价同步服务已经启动"); }
void WhenNewTrade(object sender, TradeInfoEventArgs e) { if (EnableRunning) { _queTrades.Enqueue(e); _tradeSignal.Release(); } }
void gw_TradeChanged(object sender, TradeInfoEventArgs e) { if (e.TradeInfo.Mode == TradeInfoMode.NewTrade) { _logger.Log(e.TradeInfo.ToString()); _logger.Log(e.TradeInfoDetails.ToString()); } }
private void Trade2Social(TradeInfoEventArgs e) { try { if (e.TradeType != TRANS_TYPE.TRANS_DELETE) { return; } var key = RedisSocialTradeKey; var recordString = JsonConvert.SerializeObject(e); TradeSource.RedisSocial.LPush(key, recordString); } catch (Exception excp) { Utils.CommonLog.Error("同步到social数据库失败,{0},{1}", excp.Message, excp.StackTrace); } }
public void PushTrade(TradeInfoEventArgs aTrade) { string symbolPattern = @"^(?<symbol>[A-Za-z]+)(?<leverage>\d*)$"; string symbolPattern_CFD = @"^(?<symbol>[A-Za-z]+)_(?<number>\d*)$"; var recordString = string.Empty; try { foreach (Match j in Regex.Matches(aTrade.Trade.symbol, symbolPattern)) { var leverage = 100; var match = j.Groups; if (!string.IsNullOrWhiteSpace(match["leverage"].ToString())) { leverage = int.Parse(match["leverage"].ToString()); } //Trade2Social(aTrade); Trade2Mysql(aTrade.TradeType, aTrade.Trade, j, leverage, 100000, 1.0f, aTrade.FromUsercode, aTrade.ToUsercode); } foreach (Match j in Regex.Matches(aTrade.Trade.symbol, symbolPattern_CFD)) { var match = j.Groups; var symbol = match["symbol"].ToString(); var pov = ForexMath.GetPOV(symbol); //Trade2Social(aTrade); Trade2Mysql(aTrade.TradeType, aTrade.Trade, j, 100, pov, 10.0f); } } catch (Exception e) { recordString = JsonConvert.SerializeObject(aTrade); var logger = Utils.CommonLog; if (e is MySqlException) { var e_mysql = e as MySqlException; if (e_mysql.Number == 1062 && e_mysql.Message.Contains("cb_unique") && e_mysql.Message.Contains("Duplicate entry")) { logger.Info(string.Format("交易MySQL数据已存在,单号:{0}\n原始数据:{1}", aTrade.Trade.order, recordString)); return; } } logger.Error(string.Format("交易MySQL操作失败,错误信息{0}\n原始数据:{1}", e.Message, recordString)); TradeSource.MysqlSource = null; } }
private void WhenNewTrade(object sender, TradeInfoEventArgs e) { _queTrades.Enqueue(new Tuple <TRANS_TYPE, TradeRecordResult>(e.TradeType, e.Trade)); _tradeSignal.Release(); }
private void CopyProc() { TradeInfoEventArgs item = null; var sql = string.Empty; while (Utils.SignalWait(ref EnableRunning, _signal)) { _queNewTrades.TryDequeue(out item); try { var trade_type = item.TradeType; var trade = item.Trade; var key = string.Empty; var handler = OnNewTrade; //if (handler != null) // handler(this, item); //continue; try { if (string.IsNullOrWhiteSpace(InnerServer)) { sql = "SELECT user_code FROM user WHERE mt4=@mt4_id"; using (var cmd = new SQLiteCommand(sql, Source.CopySource)) { cmd.Parameters.AddWithValue("@mt4_id", item.Trade.login); var user_code_obj = cmd.ExecuteScalar(); var user_code = string.Empty; if (user_code_obj != null) { user_code = user_code_obj.ToString(); } item.Usercode = user_code; } sql = "SELECT mt4_from FROM copy_order WHERE order_to=@order_id"; using (var cmd = new SQLiteCommand(sql, Source.CopySource)) { cmd.Parameters.AddWithValue("@order_id", item.Trade.order); var from_obj = cmd.ExecuteScalar(); if (from_obj != null) { item.FromUsercode = from_obj.ToString(); item.ToUsercode = item.Usercode; } } } else { using (var reqSocket = _zmqContext.CreateSocket(SocketType.Req)) { reqSocket.Connect(InnerServer); dynamic reqBody = new ExpandoObject(); reqBody.__api = "InnerSearchUsercode"; reqBody.mt4_id = trade.login; reqBody.order_id = trade.order; var req = JsonConvert.SerializeObject(reqBody) as string; reqSocket.Send(req); var repBody = _jss.Deserialize <dynamic>(reqSocket.RecvString()); var code = Convert.ToInt32(repBody["ucode"]); if (code != 0) { item.Usercode = code.ToString(); } var from_code = Convert.ToInt32(repBody["from_ucode"]); if (from_code != 0) { item.FromUsercode = from_code.ToString(); item.ToUsercode = code.ToString(); } } } } catch (Exception e) { Utils.CommonLog.Error("组装订单出现问题,订单号{0},{1},{2}", trade.order, e.Message, e.StackTrace); } if (handler != null) { handler(this, item); } if ((trade_type == TRANS_TYPE.TRANS_ADD || trade_type == TRANS_TYPE.TRANS_UPDATE) && trade.cmd <= (int)Utils.TRADE_COMMAND.OP_SELL) { var apiEquity = Poll.New(); var equity = 0.0; var balance = 0.0; var free = 0.0; apiEquity.GetEquity(trade.login, ref equity, ref free, ref balance); Poll.Release(apiEquity); dynamic reqBody = new ExpandoObject(); reqBody.mt4_id = trade.login; reqBody.balance = balance; reqBody.__api = "InnerCheckCopyBalance"; using (var reqSocket = _zmqContext.CreateSocket(SocketType.Req)) { reqSocket.Connect(CopyCheckAddr); var req = JsonConvert.SerializeObject(reqBody) as string; reqSocket.Send(req); reqSocket.RecvString(); } } if (!Enable) { continue; } if (trade_type == TRANS_TYPE.TRANS_ADD && trade.comment == "copy") { continue; } Task.Factory.StartNew(() => { StartLink(trade_type, trade); }); } catch (Exception e) { Utils.CommonLog.Error(string.Format("复制服务出错,{0},{1}", e.Message, e.StackTrace)); } } ServerContainer.FinishStop(); }
public void WhenNewTrade(object sender, TradeInfoEventArgs e) { _queNewTrades.Enqueue(e); _signal.Release(); }
private static void TradeChanged(object sender, TradeInfoEventArgs e) { // Process trade here Console.WriteLine("--> TRADE: {0}", e.TradeInfo); }