Example #1
0
        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();
                }
            }
        }
Example #3
0
 public SaveServer()
 {
     TradeSource = new DockServer();
     QuoteSource = new DockServer();
 }
Example #4
0
        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));
        }
Example #5
0
        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);
        }
Example #6
0
        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));
        }
Example #7
0
        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);
        }