public void OnRequest(IInputOutput aIO, dynamic aJson) { var from_mt4 = Convert.ToInt32(aJson["from_mt4"]); var to_mt4 = Convert.ToInt32(aJson["to_mt4"]); var amount = Convert.ToDouble(aJson["amount"]); var source = aJson["source"].ToString(); var from_user_code = Convert.ToInt32(aJson["from_user_code"]); var to_user_code = Convert.ToInt32(aJson["to_user_code"]); var dock = new DockServer(); var db = dock.CopySource; var sql = string.Empty; sql = "REPLACE INTO user(mt4 ,user_code) VALUES(@mt4_id, @user_code)"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_id", from_mt4); cmd.Parameters.AddWithValue("@user_code", from_user_code); cmd.ExecuteNonQuery(); } using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_id", to_mt4); cmd.Parameters.AddWithValue("@user_code", to_user_code); cmd.ExecuteNonQuery(); } if (amount < 100) { var result = Utils.MakeResponseObject(false, 1, "复制金额过小"); aIO.Output = JsonConvert.SerializeObject(result); return; } MT4Wrapper api = null; if (source == "demo") { api = Poll.DemoAPI(); } else { api = Poll.New(); } double equity = 0; double free = 0; double balance = 0; using (api) { api.GetEquity(to_mt4, ref equity, ref free, ref balance); if (balance == 0) { var result = Utils.MakeResponseObject(false, 2, "余额不足"); aIO.Output = JsonConvert.SerializeObject(result); return; } if (amount / balance > 0.5) { var result = Utils.MakeResponseObject(false, 3, "复制比例过大"); aIO.Output = JsonConvert.SerializeObject(result); return; } } var offset = 0.0; sql = "SELECT * FROM copy WHERE from_mt4=@mt4_from AND to_mt4=@mt4_to"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_from", from_mt4); cmd.Parameters.AddWithValue("@mt4_to", to_mt4); using (var group_reader = cmd.ExecuteReader()) { while (group_reader.Read()) { offset = -double.Parse(group_reader["amount"].ToString()); break; } } } sql = "SELECT COUNT(*) AS total_count, TOTAL(amount) as total_amount FROM " + "copy WHERE to_mt4 = @mt4_id"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_id", to_mt4); using (var group_reader = cmd.ExecuteReader()) { while (group_reader.Read()) { var count = int.Parse(group_reader["total_count"].ToString()); var total_amount = double.Parse(group_reader["total_amount"].ToString()); if (count > 9) { var result = Utils.MakeResponseObject(false, 4, "复制人数已达到上限"); aIO.Output = JsonConvert.SerializeObject(result); return; } if (total_amount + amount + offset > balance) { var result = Utils.MakeResponseObject(false, 5, "余额不足"); aIO.Output = JsonConvert.SerializeObject(result); return; } break; } } } sql = "REPLACE INTO copy(from_mt4, to_mt4, source, amount) VALUES" + "(@from_mt4, @to_mt4, @source, @amount)"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@from_mt4", from_mt4); cmd.Parameters.AddWithValue("@to_mt4", to_mt4); cmd.Parameters.AddWithValue("@source", source == "demo" ? 1 : 0); cmd.Parameters.AddWithValue("@amount", amount); cmd.ExecuteNonQuery(); } aIO.Output = JsonConvert.SerializeObject( Utils.MakeResponseObject(true, 0, string.Empty)); }
private void StartLink(TRANS_TYPE trade_type, TradeRecordResult trade) { var dock = new DockServer(); try { using (var db = dock.CopySource) { var sql = string.Empty; var mt4_from = trade.login; var jss = new JavaScriptSerializer(); if ((trade_type == TRANS_TYPE.TRANS_ADD || trade_type == TRANS_TYPE.TRANS_UPDATE) && trade.cmd <= (int)Utils.TRADE_COMMAND.OP_SELL) { var trade_date = trade.timestamp.FromTime32(); Utils.CommonLog.Info("MT4:{0}的订单{1}已收到", mt4_from, trade.order); try { sql = "SELECT * FROM copy WHERE from_mt4=@mt4_id"; var lst = new List <dynamic>(); using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_id", mt4_from); using (var copy_reader = cmd.ExecuteReader()) { while (copy_reader.Read()) { dynamic copy_item = new ExpandoObject(); copy_item.from_mt4 = int.Parse(copy_reader["from_mt4"] .ToString()); copy_item.to_mt4 = int.Parse(copy_reader["to_mt4"] .ToString()); copy_item.source = int.Parse(copy_reader["source"] .ToString()); copy_item.amount = double.Parse(copy_reader["amount"] .ToString()); lst.Add(copy_item); } } } var real_copy = lst.Where(i => i.source == 0); var demo_copy = lst.Where(i => i.source != 0); if (lst.Count > 0) { MT4Wrapper api = null; var equity = 0.0; var balance = 0.0; var free = 0.0; using (api = Poll.New()) { api.GetEquity(mt4_from, ref equity, ref free, ref balance); } if (real_copy.Count() > 0) { using (api = Poll.New()) { CopyNewTrade(trade, mt4_from, real_copy, trade_date, api, balance, dock, 0); } } if (demo_copy.Count() > 0) { using (api = Poll.DemoAPI()) { CopyNewTrade(trade, mt4_from, demo_copy, trade_date, api, balance, dock, 1); } } } } catch (Exception e) { Utils.CommonLog.Error("执行copy功能出现故障,订单号{0},{1},{2}", trade.order, e.Message, e.StackTrace); } } if (trade_type == TRANS_TYPE.TRANS_DELETE && !string.IsNullOrWhiteSpace(trade.symbol)) { try { sql = "SELECT * FROM copy_order WHERE order_from=@order_id"; var lst = new List <dynamic>(); using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@order_id", trade.order); using (var copy_reader = cmd.ExecuteReader()) { while (copy_reader.Read()) { dynamic copy_item = new ExpandoObject(); copy_item.mt4_from = int.Parse(copy_reader["mt4_from"] .ToString()); copy_item.mt4_to = int.Parse(copy_reader["mt4_to"] .ToString()); copy_item.source = int.Parse(copy_reader["source"] .ToString()); copy_item.order_from = int.Parse(copy_reader["order_from"] .ToString()); copy_item.order_to = int.Parse(copy_reader["order_to"] .ToString()); copy_item.direction = int.Parse(copy_reader["direction"] .ToString()); copy_item.volume = int.Parse(copy_reader["volume"] .ToString()); lst.Add(copy_item); } } } if (lst.Count > 0) { Utils.CommonLog.Info("可复制订单{0}已平仓,copy数量{1}", trade.order, lst.Count); } var real_copy = lst.Where(i => i.source == 0); var demo_copy = lst.Where(i => i.source != 0); MT4Wrapper api = null; if (real_copy.Count() > 0) { using (api = Poll.New()) { CopyBalanceTrade(trade, mt4_from, real_copy, api, dock, 0); } } if (demo_copy.Count() > 0) { using (api = Poll.DemoAPI()) { CopyBalanceTrade(trade, mt4_from, demo_copy, api, dock, 1); } } } catch (Exception e) { Utils.CommonLog.Error("执行copy平仓功能出现故障,订单号{0},{1},{2}", trade.order, e.Message, e.StackTrace); } } } } catch (Exception e) { Utils.CommonLog.Error(string.Format("复制StartLink出错,{0},{1}", e.Message, e.StackTrace)); } }