public void OnRequest(IInputOutput aServer, dynamic aJson) { dynamic resp = new ExpandoObject(); var dict = aJson; if (!_leverageSet.Contains(dict["leverage"])) { resp = Utils.MakeResponseObject(false, -1, "杠杆不正确"); aServer.Output = JsonConvert.SerializeObject(resp); return; } var args = new TradeTransInfoArgsResult { type = Convert.ToInt32(dict["type"]), cmd = Convert.ToInt16(dict["cmd"]), orderby = Convert.ToInt32(dict["mt4UserID"]), price = Convert.ToDouble(dict["price"]), order = Convert.ToInt32(dict["mt4OrderID"]), symbol = string.Format("{0}{1}", dict["symbol"], dict["leverage"]), volume = Convert.ToInt32(dict["volume"]), sl = Convert.ToDouble(dict["sl"]), tp = Convert.ToDouble(dict["tp"]), }; //if(args.type == TradeTransInfoTypes.TT_BR_BALANCE) var result = aServer.MT4.TradeTransaction(ref args); resp.is_succ = result == 0; resp.errMsg = Utils.GetErrorMessage(result); resp.errCode = (int)result; aServer.Output = JsonConvert.SerializeObject(resp); }
public void OnRequest(IInputOutput aServer, dynamic aJson) { var dict = aJson; var args = new TradeTransInfoArgsResult { type = TradeTransInfoTypes.TT_BR_BALANCE, cmd = 6, orderby = Convert.ToInt32(dict["mt4UserID"]), price = Convert.ToDouble(dict["price"]) }; var result = aServer.MT4.TradeTransaction(ref args); dynamic resp = new ExpandoObject(); resp.is_succ = result == 0; resp.errMsg = Utils.GetErrorMessage(result); resp.errCode = (int)result; aServer.Output = JsonConvert.SerializeObject(resp); }
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 aServer, dynamic aJson) { try { var dict = aJson; var api = aServer.MT4; var is_real = Convert.ToBoolean(dict["is_real"]); var user_code = Convert.ToInt32(dict["invite_code"]); var mt4_id = Convert.ToInt32(dict["mt4UserID"]); var args = new UserRecordArgs { login = mt4_id, password = dict["password"], name = dict["name"], email = dict["email"], group = Poll.MT4Group, leverage = Convert.ToInt32(dict["leverage"]) }; if (!is_real) { args.group = MT4Group; api = Poll.DemoAPI(); } var result = api.OpenAccount(args); if (result == RET_CODE.RET_OK) { var handle = OnCreateUser; if (handle != null) { handle(this, new EventArg.CreateUserEventArgs { MT4ID = mt4_id, Usercode = user_code, IsLiveAccount = is_real }); } if (!is_real && InitEqutiy > 0) { var money_args = new TradeTransInfoArgsResult { type = TradeTransInfoTypes.TT_BR_BALANCE, cmd = 6, orderby = Convert.ToInt32(dict["mt4UserID"]), price = 10000.0 }; result = api.TradeTransaction(ref money_args); dynamic resp = new ExpandoObject(); resp.is_succ = result == RET_CODE.RET_OK; resp.err_msg = Utils.GetErrorMessage(result); aServer.Output = JsonConvert.SerializeObject(resp); if (result != RET_CODE.RET_OK) { var logger = Utils.CommonLog; logger.Error(string.Format("模拟账户充钱失败ID:{0},PASSWD:{1},NAME:{2},EMAIL:{3},GROUP:{4}", args.login, args.password, args.name, args.email, args.group)); } } else { dynamic resp = new ExpandoObject(); resp.is_succ = result == RET_CODE.RET_OK; resp.err_msg = Utils.GetErrorMessage(result); aServer.Output = JsonConvert.SerializeObject(resp); } } else { dynamic resp = new ExpandoObject(); resp.is_succ = result == RET_CODE.RET_OK; resp.err_msg = Utils.GetErrorMessage(result); aServer.Output = JsonConvert.SerializeObject(resp); var logger = Utils.CommonLog; logger.Error(string.Format("开户失败ID:{0},PASSWD:{1},NAME:{2},EMAIL:{3},GROUP:{4}", args.login, args.password, args.name, args.email, args.group)); } } catch (Exception e) { Console.WriteLine(e.Message + e.StackTrace); } }
private static void CopyNewTrade(TradeRecordResult trade, int mt4_from, IEnumerable <dynamic> items, DateTime trade_date, MT4Wrapper api, double balance, DockServer dock, int source) { foreach (var i in items) { var mt4_to = 0; try { mt4_to = i.to_mt4; var to_source = i.source; var amount = i.amount; Utils.CommonLog.Info("将[MT4:{0}]的订单{1}复制给[MT4:{2}]", mt4_from, trade.order, mt4_to); var volume = ForexMath.CopyTransform(balance, trade.volume, amount); var now = TimeServer.Now; if (to_source == 0 && Math.Abs((now - trade_date).TotalSeconds) > 1) { Utils.CommonLog.Info("将[MT4:{0}]的订单{1}复制给[MT4:{2}],时间过长,单据时间:{3},此时:{4}", mt4_from, trade.order, mt4_to, trade_date, now); continue; } if (volume <= 0) { Utils.CommonLog.Info("将[MT4:{0}]的订单{1}复制给[MT4:{2}],复制单成交量过小,跳过复制", mt4_from, trade.order, mt4_to); continue; } var args = new TradeTransInfoArgsResult { type = TradeTransInfoTypes.TT_BR_ORDER_OPEN, cmd = (short)trade.cmd, orderby = mt4_to, price = trade.open_price, symbol = trade.symbol, volume = volume, comment = "copy", }; var result = api.TradeTransaction(ref args); if (result == RET_CODE.RET_OK) { var sql = "INSERT INTO copy_order(mt4_from, mt4_to, order_from, order_to," + "direction, volume, source) VALUES(@mt4_from, @mt4_to, @order_from," + "@order_to, @direction, @volume, @source)"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@mt4_from", mt4_from); cmd.Parameters.AddWithValue("@mt4_to", mt4_to); cmd.Parameters.AddWithValue("@order_from", trade.order); cmd.Parameters.AddWithValue("@order_to", args.order); cmd.Parameters.AddWithValue("@direction", args.cmd); cmd.Parameters.AddWithValue("@volume", volume); cmd.Parameters.AddWithValue("@source", source); cmd.ExecuteNonQuery(); } Utils.CommonLog.Info("将[MT4:{0}]的订单{1}复制给[MT4:{2}],复制成功", mt4_from, trade.order, mt4_to); } else { Utils.CommonLog.Warn("将[MT4:{0}]的订单{1}复制给[MT4:{2}],复制结果失败,原因:{5}", mt4_from, trade.order, mt4_to, result); } } catch (Exception e) { Utils.CommonLog.Error("Copy订单{0}复制给MT4[{1}]出现问题{2},{3}", trade.order, mt4_to, e.Message, e.StackTrace); } } }
private static void CopyBalanceTrade(TradeRecordResult trade, int mt4_from, IEnumerable <dynamic> items, MT4Wrapper api, DockServer dock, int source) { var key = string.Empty; foreach (var i in items) { var copy_order = 0; try { copy_order = i.order_to; var volume = i.volume; var to_source = i.source == 0 ? "real" : "demo"; var mt4_to = i.mt4_to; Utils.CommonLog.Info("自动平掉复制订单{0}的copy订单{1},成交量{2},位置{3}", trade.order, copy_order, volume, to_source); var args = new TradeTransInfoArgsResult { type = TradeTransInfoTypes.TT_BR_ORDER_CLOSE, cmd = (short)trade.cmd, order = copy_order, price = trade.close_price, volume = volume, }; var result = api.TradeTransaction(ref args); if (result == RET_CODE.RET_OK) { var sql = string.Empty; sql = "INSERT INTO pre_delete(order_from) VALUES(@order_from)"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@order_from", trade.order); cmd.ExecuteNonQuery(); } double amount = 0.0; sql = "SELECT amount FROM copy WHERE from_mt4 = @mt4_from AND to_mt4 = @mt4_to"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@mt4_from", mt4_from); cmd.Parameters.AddWithValue("@mt4_to", mt4_to); var amount_obj = cmd.ExecuteScalar(); if (amount_obj == null) { Utils.CommonLog.Warn("收到一个很奇怪的需要结算盈利的copy单,找不到copy表记录" + "单号{0}, MT4{1}", trade.order, trade.login); continue; } else { amount = Convert.ToDouble(amount_obj); } } //算钱模式 var order = api.AdmTradesRequest(copy_order, false); if (order.profit + order.storage + amount < 0) { amount = 0.0; } else { amount += trade.profit + trade.storage; } sql = "UPDATE copy SET amount=@amount WHERE from_mt4=@mt4_from AND to_mt4=@mt4_to"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@mt4_from", mt4_from); cmd.Parameters.AddWithValue("@mt4_to", mt4_to); cmd.Parameters.AddWithValue("@amount", amount); cmd.ExecuteNonQuery(); } sql = "SELECT user_code FROM user WHERE mt4=@mt4_id"; using (var cmd = new SQLiteCommand(sql, dock.CopySource)) { cmd.Parameters.AddWithValue("@mt4_id", mt4_to); var user_code_obj = cmd.ExecuteScalar(); if (user_code_obj != null) { key = string.Format(RedisCopyActivityTemplate, trade.login); dock.RedisCopy.ZAdd(key, TimeServer.Now.ToTime32().ToString(), user_code_obj.ToString()); Utils.CommonLog.Info("自动平掉复制订单{0}的copy订单{1}成功", trade.order, copy_order); } else { Utils.CommonLog.Info("Copy平仓复制订单{0}的copy订单{1}无法反查邀请码信息,MT4账号{2}", trade.order, copy_order, mt4_to); } } } else { Utils.CommonLog.Warn("自动平掉复制订单{0}的copy订单{1}失败,原因{2}", trade.order, copy_order, result); } } catch (Exception e) { Utils.CommonLog.Error("子订单{0}平仓出现问题{1},{2}", copy_order, e.Message, e.StackTrace); } } }
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)); }