public void OnRequest(IInputOutput aServer, dynamic aJson) { var source = new DockServer(); var sql = string.Empty; var ucode = 0; var from_ucode = 0; sql = "SELECT user_code FROM user WHERE mt4=@mt4_id"; using (var db = source.CopySource) { using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_id", Convert.ToInt32(aJson["mt4_id"])); var from_obj = cmd.ExecuteScalar(); if (from_obj != null) { ucode = Convert.ToInt32(from_obj); } } sql = "SELECT user_code FROM copy_order LEFT JOIN user ON copy_order.mt4_from=user.mt4 WHERE order_to=@order_id"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@order_id", Convert.ToInt32(aJson["order_id"])); var from_obj = cmd.ExecuteScalar(); if (from_obj != null) { from_ucode = Convert.ToInt32(from_obj); } } } dynamic resp = new ExpandoObject(); resp.is_succ = true; resp.ucode = ucode; resp.from_ucode = from_ucode; resp.err_msg = ""; aServer.Output = JsonConvert.SerializeObject(resp); }
public void OnRequest(IInputOutput aServer, dynamic aJson) { var sql = string.Empty; var dock = new DockServer(); var mt4_id = Convert.ToInt32(aJson["mt4_id"]); var balance = Convert.ToDouble(aJson["balance"]); //原生订单需要统计一下剩余保证金是否大于等于copy用金额 //是的话,清除copy关系,但保持持仓copy订单 var used_balance = 0.0; sql = "SELECT TOTAL(amount) FROM copy WHERE to_mt4=@mt4_id"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@mt4_id", mt4_id); var obj = cmd.ExecuteScalar(); if (obj != null) { used_balance = Convert.ToDouble(obj); } } //Q:余额是0或者负的 //A:解除copy关系 //Q:可用余额是负的 //A:也解除 if (balance <= 0 || balance - used_balance <= 0 || balance < 2 * used_balance) { //解除here sql = "DELETE FROM copy WHERE to_mt4=@mt4_id"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@mt4_id", mt4_id); cmd.ExecuteNonQuery(); } } }
public SaveServer() { TradeSource = new DockServer(); QuoteSource = new DockServer(); }
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)); }
public void OnRequest(IInputOutput aServer, dynamic aJson) { var from_user_code = Convert.ToInt32(aJson["from_code"]); var to_user_code = Convert.ToInt32(aJson["to_code"]); var to_source = Convert.ToString(aJson["source"]); var auto_delete = Convert.ToBoolean(aJson["auto_delete"]); var db = new DockServer(); var key = string.Empty; MT4CliWrapper.MT4Wrapper api = null; if (auto_delete) { api = Poll.New(); } using (var redis = db.RedisCopy) { key = string.Format(RedisCopyBreakTemplate, to_user_code, from_user_code); var orders = redis.SMembers(key); foreach (var order in orders) { key = string.Format(RedisCopyFromTemplate, order); var copys = redis.SMembers(key); foreach (var copy_link in copys) { var arr = copy_link.Split(','); var copy_order = int.Parse(arr[0]); var volume = int.Parse(arr[1]); var order_id = arr[2]; var source = arr[3]; var to_user = Convert.ToInt32(arr[4]); var direction = Convert.ToInt16(arr[6]); if (to_user != to_user_code || to_source != source) { continue; } var order_id_key = string.Format(RedisCopyToTemplate, order_id); redis.Del(order_id_key); redis.SRem(key, copy_link); if (auto_delete) { try { var args2 = new TradeTransInfoArgsResult { type = TradeTransInfoTypes.TT_BR_ORDER_DELETE, cmd = direction, order = copy_order, volume = volume, }; var result = api.TradeTransaction(ref args2); if (result == MT4CliWrapper.RET_CODE.RET_OK) { Utils.CommonLog.Info("BreakCopy强制平仓复制订单{0}成功", copy_order); } else { Utils.CommonLog.Info("BreakCopy强制平仓复制订单{0}成功,原因{1}", copy_order, result); } } catch (Exception e) { Utils.CommonLog.Error("BreakCopy强制平仓出现问题,在订单{0},{1},{2}", copy_order, e.Message, e.StackTrace); } } } } if (auto_delete) { api.Dispose(); } } dynamic resp = new ExpandoObject(); resp.is_succ = true; resp.errMsg = string.Empty; resp.errCode = 0; aServer.Output = JsonConvert.SerializeObject(resp); }
public void OnRequest(IInputOutput aIO, dynamic aJson) { var from_mt4 = Convert.ToInt32(aJson["from_mt4"]); var to_mt4 = Convert.ToInt32(aJson["to_mt4"]); var auto_delete = Convert.ToBoolean(aJson["auto_delete"]); var sql = string.Empty; var dock = new DockServer(); var db = dock.CopySource; if (auto_delete) { sql = "SELECT * FROM copy_order WHERE mt4_to = @mt4_to"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_to", to_mt4); using (var order_reader = cmd.ExecuteReader()) { while (order_reader.Read()) { dynamic item = new ExpandoObject(); item.mt4 = int.Parse(order_reader["mt4_to"].ToString()); item.volume = int.Parse(order_reader["volume"].ToString()); item.direction = int.Parse(order_reader["direction"].ToString()); item.order = int.Parse(order_reader["order_to"].ToString()); item.source = int.Parse(order_reader["source"].ToString()); var args = new TradeTransInfoArgsResult { type = TradeTransInfoTypes.TT_BR_ORDER_DELETE, cmd = (short)item.direction, order = item.order, volume = item.volume, }; MT4Wrapper api = null; if (item.source == 0) { api = Poll.New(); } else { api = Poll.DemoAPI(); } using (api) { var result = api.TradeTransaction(ref args); if (result == RET_CODE.RET_OK) { Utils.CommonLog.Info("用户{0}关闭copy功能成功平仓{1}订单,报价{2}", args.orderby, args.order, args.price); } } } } } } sql = "DELETE 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); cmd.ExecuteNonQuery(); } sql = "DELETE FROM copy_order WHERE mt4_to=@mt4_to"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_to", to_mt4); cmd.ExecuteNonQuery(); } aIO.Output = JsonConvert.SerializeObject( Utils.MakeResponseObject(true, 0, string.Empty)); }
public void OnRequest(IInputOutput aIO, dynamic aJson) { var from_mt4 = Convert.ToInt32(aJson["from_mt4"]); var real_mt4 = Convert.ToInt32(aJson["real_mt4"]); var demo_mt4 = Convert.ToInt32(aJson["demo_mt4"]); var dock = new DockServer(); var real_amount = string.Empty; var demo_amount = string.Empty; var copy_count = 0; using (var db = dock.CopySource) { var sql = string.Empty; sql = "SELECT COUNT(*) FROM copy WHERE from_mt4=@mt4_from"; using (var cmd = new SQLiteCommand(sql, db)) { cmd.Parameters.AddWithValue("@mt4_from", from_mt4); var obj = cmd.ExecuteScalar(); if (obj != null) { copy_count = Convert.ToInt32(obj); } } sql = "SELECT amount 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", real_mt4); var obj = cmd.ExecuteScalar(); if (obj != null) { real_amount = Convert.ToDouble(obj).ToString("0.00"); } else { real_amount = null; } } sql = "SELECT amount 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", demo_mt4); var obj = cmd.ExecuteScalar(); if (obj != null) { demo_amount = Convert.ToDouble(obj).ToString("0.00"); } else { demo_amount = null; } } } var resp = Utils.MakeResponseObject(true, 0, ""); resp.real_amount = real_amount; resp.demo_amount = demo_amount; resp.copy_count = copy_count; aIO.Output = JsonConvert.SerializeObject(resp); }