Пример #1
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));
        }
Пример #2
0
        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));
            }
        }