Exemplo n.º 1
0
        public void UpdateHp(long nowTime)
        {
            System.Console.WriteLine("Now UpdateHp.");

            int n = TestParameters2.nTpsl;

            if (m_simuStrategy != null)
            {
                SimulationData.Instance.OnNewData(nowTime);
            }

            var dt = Feng.Data.DbHelper.Instance.ExecuteDataTable(
                string.Format("SELECT TIME FROM {0}_M1 WHERE TIME NOT IN (SELECT TIME FROM {0}_HP) AND TIME <= {1} AND TIME > {2} AND {3}",
                              m_symbol, nowTime, nowTime - 60 * 60 * 24 * 7,
                              string.IsNullOrEmpty(TestParameters.DbSelectWhere) ? "1 = 1" : TestParameters.DbSelectWhere));
            var txn = Feng.Data.DbHelper.Instance.BeginTransaction();

            foreach (System.Data.DataRow row in dt.Rows)
            {
                long time     = (long)row["Time"];
                var  newHpSql = new SqlCommand(string.Format("IF NOT EXISTS (SELECT * FROM [{0}_HP] WHERE Time = {1}) INSERT INTO [{0}_HP] ([Time],[hp],[hp_date],[IsComplete]) VALUES ({1}, @hp, @hp_date, 0)", m_symbol, time));
                sbyte?[, ,] hps    = new sbyte?[Parameters.AllDealTypes.Length, TestParameters2.CandidateParameter.BatchTps.Length, TestParameters2.CandidateParameter.BatchSls.Length];
                long?[, ,] hpTimes = new long?[Parameters.AllDealTypes.Length, TestParameters2.CandidateParameter.BatchTps.Length, TestParameters2.CandidateParameter.BatchSls.Length];
                for (int k = 0; k < Parameters.AllDealTypes.Length; ++k)
                {
                    for (int i = 0; i < TestParameters2.CandidateParameter.BatchTps.Length; ++i)
                    {
                        for (int j = 0; j < TestParameters2.CandidateParameter.BatchSls.Length; ++j)
                        {
                            hps[k, i, j]     = null;
                            hpTimes[k, i, j] = null;
                        }
                    }
                }
                newHpSql.Parameters.AddWithValue("@hp", HpData.SerializeHp(hps));
                newHpSql.Parameters.AddWithValue("@hp_date", HpData.SerializeHpTimes(hpTimes));
                newHpSql.Transaction = txn as SqlTransaction;
                Feng.Data.DbHelper.Instance.ExecuteNonQuery(newHpSql);
            }

            try
            {
                Feng.Data.DbHelper.Instance.CommitTransaction(txn);
            }
            catch (Exception)
            {
                Feng.Data.DbHelper.Instance.RollbackTransaction(txn);
                throw;
            }

            dt = Feng.Data.DbHelper.Instance.ExecuteDataTable(string.Format("SELECT * FROM {0}_HP WHERE TIME <= {1} AND IsComplete = 0",
                                                                            m_symbol, nowTime));
            txn = Feng.Data.DbHelper.Instance.BeginTransaction();

            foreach (System.Data.DataRow row in dt.Rows)
            {
                if (m_simuStrategy == null)
                {
                    InitSimulationStrategys();
                }

                long     time = (long)row["Time"];
                DateTime date = WekaUtils.GetDateFromTime(time);

                sbyte?[, ,] hps    = HpData.DeserializeHp((byte[])row["hp"]);
                long?[, ,] hpTimes = HpData.DeserializeHpTimes((byte[])row["hp_date"]);

                if (date.Minute == 0 && date.Hour == 12)
                {
                    System.Console.WriteLine(string.Format("Now updatehp of {0}, {1}", date.ToString(Parameters.DateTimeFormat), m_symbol));
                }

                bool[] isComplete = new bool[Parameters.AllDealTypes.Length];
                for (int k = 0; k < Parameters.AllDealTypes.Length; ++k)
                {
                    isComplete[k] = true;

                    char dealType = Parameters.AllDealTypes[k];
                    for (int i = 0; i < TestParameters2.CandidateParameter.BatchTps.Length; ++i)
                    {
                        if (!isComplete[k])
                        {
                            break;
                        }
                        //if (i % n != n - 1)
                        //    continue;

                        for (int j = 0; j < TestParameters2.CandidateParameter.BatchSls.Length; ++j)
                        {
                            if (!isComplete[k])
                            {
                                break;
                            }
                            //if (j % n != n - 1)
                            //    continue;

                            if (hps[k, i, j].HasValue && hps[k, i, j].Value != -1)
                            {
                                continue;
                            }

                            ISimulateStrategy strategy = m_simuStrategy[i, j];

                            //if (j == 5 && i == 9 && date == new DateTime(2010, 6, 1, 0, 15, 0))
                            //{
                            //}

                            DateTime?closeDate;
                            bool?    hp;
                            if (dealType == 'B')
                            {
                                hp = strategy.DoBuy(date, -1, out closeDate);
                            }
                            else if (dealType == 'S')
                            {
                                hp = strategy.DoSell(date, -1, out closeDate);
                            }
                            else
                            {
                                throw new ArgumentException("Invalid dealtype of " + dealType);
                            }

                            if (hp.HasValue)
                            {
                                //WekaUtils.Instance.WriteLog(string.Format("Get Update Result of {0},{1},{2},{3} = {4},{5}",
                                //    time, dealType,
                                //    TestParameters.DefaultCandidateParameter.BatchTps[i], TestParameters.DefaultCandidateParameter.BatchSls[j],
                                //    hp.Value, closeDate.Value));

                                if (hp.Value)
                                {
                                    // tp
                                    for (int jj = j; jj < TestParameters2.CandidateParameter.BatchSls.Length; ++jj)
                                    {
                                        hps[k, i, jj]     = 1;
                                        hpTimes[k, i, jj] = WekaUtils.GetTimeFromDate(closeDate.Value);
                                    }
                                }
                                else
                                {
                                    for (int ii = i; ii < TestParameters2.CandidateParameter.BatchTps.Length; ++ii)
                                    {
                                        hps[k, ii, j]     = 0;
                                        hpTimes[k, ii, j] = WekaUtils.GetTimeFromDate(closeDate.Value);
                                    }
                                }
                            }
                            else
                            {
                                isComplete[k] = false;
                                break;
                            }
                        }
                    }
                }

                System.Data.SqlClient.SqlCommand updateCmd = new SqlCommand(string.Format("UPDATE [{0}_HP] SET [hp] = @hp,[hp_date] = @hp_date,[IsComplete] = @IsComplete WHERE [Time] = @Time", m_symbol));
                updateCmd.Parameters.AddWithValue("@hp", HpData.SerializeHp(hps));
                updateCmd.Parameters.AddWithValue("@hp_date", HpData.SerializeHpTimes(hpTimes));
                updateCmd.Parameters.AddWithValue("@IsComplete", WekaUtils.AndAll(isComplete));
                updateCmd.Parameters.AddWithValue("@Time", time);
                updateCmd.Transaction = txn as SqlTransaction;

                Feng.Data.DbHelper.Instance.ExecuteNonQuery(updateCmd);
            }

            try
            {
                Feng.Data.DbHelper.Instance.CommitTransaction(txn);
            }
            catch (Exception)
            {
                Feng.Data.DbHelper.Instance.RollbackTransaction(txn);
                throw;
            }
        }
Exemplo n.º 2
0
        public static void UpdateAllHp3(string symbol, string where = null, bool updateUnComplete = false)
        {
            //where = " TIME % 1800 = 0 AND Time >= " + WekaUtils.GetTimeFromDate(new DateTime(2001, 4, 10, 0, 0, 0)) +
            //    " AND TIME < " + WekaUtils.GetTimeFromDate(new DateTime(2001, 4, 11));
            try
            {
                DbHelper.Instance.ExecuteNonQuery(string.Format("SELECT * FROM {0}_HP WHERE TIME = -1", symbol));
            }
            catch (Exception)
            {
                string sql = @"CREATE TABLE [dbo].[{0}_HP](
            [Time] [bigint] NOT NULL,
            [hp] [varbinary](max) NOT NULL,
            [hp_date] [varbinary](max) NOT NULL,
            [IsComplete] [bit] NOT NULL,
             CONSTRAINT [PK_{0}_HP] PRIMARY KEY CLUSTERED
            (
            [Time] ASC
            )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
            )";
                DbHelper.Instance.ExecuteNonQuery(string.Format(sql, symbol));
            }
            bool deleteFirst = false;
            if (deleteFirst)
            {
                string sql = string.Format("DELETE FROM {0}_HP WHERE {1}",
                                 symbol,
                                 string.IsNullOrEmpty(where) ? "1=1" : where);
                WekaUtils.Instance.WriteLog(sql);
                DbHelper.Instance.ExecuteNonQuery(sql);
            }

            System.Data.DataTable dt2 = new System.Data.DataTable();
            dt2.Columns.Add(new System.Data.DataColumn("Time", typeof(long)));
            dt2.Columns.Add(new System.Data.DataColumn("hp", typeof(byte[])));
            dt2.Columns.Add(new System.Data.DataColumn("hp_date", typeof(byte[])));
            dt2.Columns.Add(new System.Data.DataColumn("IsComplete", typeof(bool)));

            bool useAlreadHps = true;
            System.Data.DataTable dt = GetUpdateHpMainTable(symbol, where, TestParameters2.CandidateParameter.MainPeriod, useAlreadHps);

            //Dictionary<long, int> alreadyHps = new Dictionary<long, int>();
            //
            //if (useAlreadHps)
            //{
            //    System.Data.DataTable dtHp = DbHelper.Instance.ExecuteDataTable(string.Format("SELECT Time FROM {0}_HP WHERE IsComplete = 1", symbol));
            //    foreach (System.Data.DataRow row in dtHp.Rows)
            //    {
            //        long time = (long)row[0];
            //        alreadyHps[time] = 1;
            //    }
            //}

            var simulationData = SimulationData.Instance.Init(symbol);
            ISimulateStrategy[,] strategys = new ISimulateStrategy[TestParameters.CandidateParameter4Db.BatchTps.Length, TestParameters.CandidateParameter4Db.BatchSls.Length];
            for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
            {
                for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                {
                    int tp = TestParameters.CandidateParameter4Db.BatchTps[i];
                    int sl = TestParameters.CandidateParameter4Db.BatchSls[j];

                    strategys[i, j] = new TpSlM1SimulateStrategy(symbol, tp * 10, sl * 10, simulationData);
                }
            }

            try
            {
                if (TestParameters.EnableMultiThread)
                {
                    Parallel.ForEach<System.Data.DataRow>(dt.Rows.Cast<System.Data.DataRow>(), row =>
                        {
                            UpdateHpRow(row, symbol, strategys, dt2, updateUnComplete);
                        }
                     );
                }
                else
                {
                    foreach (System.Data.DataRow row in dt.Rows)
                    {
                        UpdateHpRow(row, symbol, strategys, dt2, updateUnComplete);
                    }
                }

                DbHelper.Instance.BulkCopy(dt2, string.Format("{0}_HP", symbol));
                dt2.Rows.Clear();
            }
            catch (ArgumentOutOfRangeException)
            {
            }
        }
Exemplo n.º 3
0
        private static void UpdateHpRow(System.Data.DataRow row, string symbol, ISimulateStrategy[,] strategys, System.Data.DataTable dtDest, bool updateUnComplete)
        {
            DateTime date = (DateTime)row["Date"];
            if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
                return;
            long time = WekaUtils.GetTimeFromDate(date);
            //if (alreadyHps.ContainsKey(time))
            //    return;

            System.Console.WriteLine(string.Format("Now updatehp of {0}, {1}", date.ToString(Parameters.DateTimeFormat), symbol));

            sbyte?[, ,] hps;
            long?[, ,] hpTimes;

            var hpRow = DbHelper.Instance.ExecuteDataRow(string.Format("SELECT * FROM {0}_HP WHERE TIME = {1}", symbol, time));
            if (hpRow != null)
            {
                hps = HpData.DeserializeHp((byte[])hpRow["hp"]);
                hpTimes = HpData.DeserializeHpTimes((byte[])hpRow["hp_date"]);
            }
            else
            {
                hps = new sbyte?[Parameters.AllDealTypes.Length, TestParameters.CandidateParameter4Db.BatchTps.Length, TestParameters.CandidateParameter4Db.BatchSls.Length];
                hpTimes = new long?[Parameters.AllDealTypes.Length, TestParameters.CandidateParameter4Db.BatchTps.Length, TestParameters.CandidateParameter4Db.BatchSls.Length];
                for (int k = 0; k < Parameters.AllDealTypes.Length; ++k)
                {
                    for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
                    {
                        for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                        {
                            hps[k, i, j] = null;
                            hpTimes[k, i, j] = null;
                        }
                    }
                }
            }

            bool[] isComplete = new bool[Parameters.AllDealTypes.Length];
            for (int k = 0; k < Parameters.AllDealTypes.Length; ++k)
            {
                char dealType = Parameters.AllDealTypes[k];
                isComplete[k] = true;

                for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
                {
                    if (!isComplete[k])
                        break;
                    for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                    {
                        if (!isComplete[k])
                            break;

                        if (hps[k, i, j].HasValue && hps[k, i, j] != -1)
                            continue;

                        ISimulateStrategy strategy = strategys[i, j];

                        DateTime? closeDate;
                        bool? hp;
                        if (dealType == 'B')
                            hp = strategy.DoBuy(date, (double)row["Close"], out closeDate);
                        else if (dealType == 'S')
                            hp = strategy.DoSell(date, (double)row["Close"], out closeDate);
                        else
                            throw new ArgumentException("Invalid dealtype of " + dealType);

                        if (hp.HasValue)
                        {
                            if (hp.Value)
                            {
                                // tp
                                for (int jj = j; jj < TestParameters.CandidateParameter4Db.BatchSls.Length; ++jj)
                                {
                                    hps[k, i, jj] = 1;
                                    hpTimes[k, i, jj] = WekaUtils.GetTimeFromDate(closeDate.Value);
                                }
                            }
                            else
                            {
                                for (int ii = i; ii < TestParameters.CandidateParameter4Db.BatchTps.Length; ++ii)
                                {
                                    hps[k, ii, j] = 0;
                                    hpTimes[k, ii, j] = WekaUtils.GetTimeFromDate(closeDate.Value);
                                }
                            }
                        }
                        else
                        {
                            isComplete[k] = false;
                            //if (dealType == 'B')
                            //    hp = strategy.DoBuy(date, (double)row["Close"], out closeDate);
                            //else if (dealType == 'S')
                            //    hp = strategy.DoSell(date, (double)row["Close"], out closeDate);

                            //if (!updateUnComplete)
                            //{
                            //    lock (dtDest)
                            //    {
                            //        DbHelper.Instance.BulkCopy(dtDest, string.Format("{0}_HP", symbol));
                            //        dtDest.Rows.Clear();

                            //        throw new AssertException("hp should not be null");
                            //    }
                            //}
                        }
                    }
                }
            }
            if (hpRow != null)
            {
                System.Data.SqlClient.SqlCommand updateCmd = new SqlCommand(string.Format("UPDATE [{0}_HP] SET [hp] = @hp,[hp_date] = @hp_date,[IsComplete] = @IsComplete WHERE [Time] = @Time", symbol));
                updateCmd.Parameters.AddWithValue("@hp", HpData.SerializeHp(hps));
                updateCmd.Parameters.AddWithValue("@hp_date", HpData.SerializeHpTimes(hpTimes));
                updateCmd.Parameters.AddWithValue("@IsComplete", WekaUtils.AndAll(isComplete));
                updateCmd.Parameters.AddWithValue("@Time", time);

                Feng.Data.DbHelper.Instance.ExecuteNonQuery(updateCmd);
            }
            else
            {
                lock (dtDest)
                {
                    if (!updateUnComplete && (!isComplete[0] || !isComplete[1]))
                        return;

                    System.Data.DataRow row2 = dtDest.NewRow();
                    row2["Time"] = row["Time"];
                    row2["hp"] = HpData.SerializeHp(hps);
                    row2["hp_date"] = HpData.SerializeHpTimes(hpTimes);
                    row2["IsComplete"] = WekaUtils.AndAll(isComplete);
                    dtDest.Rows.Add(row2);

                    if (dtDest.Rows.Count >= 100)
                    {
                        DbHelper.Instance.BulkCopy(dtDest, string.Format("{0}_HP", symbol));
                        dtDest.Rows.Clear();
                    }
                }
            }
        }
Exemplo n.º 4
0
        public static void UpdateAllHp2(string symbol, string where = null)
        {
            bool deleteFirst = true;
            if (deleteFirst)
            {
                foreach (char dealType in Parameters.AllDealTypes)
                {
                    for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
                    {
                        for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                        {
                            string sql = string.Format("DELETE FROM {0}_HP WHERE {1} AND DealType = '{2}' AND Tp = '{3}' AND Sl = '{4}'",
                                symbol,
                                string.IsNullOrEmpty(where) ? "1=1" : where,
                                dealType, TestParameters.CandidateParameter4Db.BatchTps[i], TestParameters.CandidateParameter4Db.BatchSls[j]);
                            WekaUtils.Instance.WriteLog(sql);
                            DbHelper.Instance.ExecuteNonQuery(sql);
                        }
                    }
                }
            }

            System.Data.DataTable dt2 = new System.Data.DataTable();
            dt2.Columns.Add(new System.Data.DataColumn("Time", typeof(long)));
            dt2.Columns.Add(new System.Data.DataColumn("DealType", typeof(string)));
            dt2.Columns.Add(new System.Data.DataColumn("Tp", typeof(int)));
            dt2.Columns.Add(new System.Data.DataColumn("Sl", typeof(int)));
            dt2.Columns.Add(new System.Data.DataColumn("hp", typeof(int)));
            dt2.Columns.Add(new System.Data.DataColumn("hp_date", typeof(DateTime)));

            System.Data.DataTable dt = GetUpdateHpMainTable(symbol, where);

            var simulationData = SimulationData.Instance.Init(symbol);
            ISimulateStrategy[,] strategys = new ISimulateStrategy[TestParameters.CandidateParameter4Db.BatchTps.Length, TestParameters.CandidateParameter4Db.BatchSls.Length];
            for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
            {
                for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                {
                    int tp = TestParameters.CandidateParameter4Db.BatchTps[i];
                    int sl = TestParameters.CandidateParameter4Db.BatchSls[j];

                    strategys[i, j] = new TpSlM1SimulateStrategy(symbol, tp * 0.0001, sl * 0.0001, simulationData);
                }
            }
            foreach (System.Data.DataRow row in dt.Rows)
            {
                DateTime date = (DateTime)row["Date"];
                System.Console.WriteLine(string.Format("Now updatehp of {0}", date.ToString(Parameters.DateTimeFormat)));

                foreach (char dealType in Parameters.AllDealTypes)
                {
                    int?[,] hps = new int?[TestParameters.CandidateParameter4Db.BatchTps.Length, TestParameters.CandidateParameter4Db.BatchSls.Length];
                    DateTime?[,] hpDates = new DateTime?[TestParameters.CandidateParameter4Db.BatchTps.Length, TestParameters.CandidateParameter4Db.BatchSls.Length];
                    for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
                    {
                        for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                        {
                            hps[i, j] = -1;
                        }
                    }

                    for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
                    {
                        for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                        {
                            if (hps[i, j] != -1)
                                continue;

                            ISimulateStrategy strategy = strategys[i, j];

                            DateTime? closeDate;
                            bool? hp;
                            if (dealType == 'B')
                                hp = strategy.DoBuy(date, (double)row["Close"], out closeDate);
                            else if (dealType == 'S')
                                hp = strategy.DoSell(date, (double)row["Close"], out closeDate);
                            else
                                throw new ArgumentException("Invalid dealtype of " + dealType);

                            if (hp.HasValue)
                            {
                                if (hp.Value)
                                {
                                    // tp
                                    for (int jj = j; jj < TestParameters.CandidateParameter4Db.BatchSls.Length; ++jj)
                                    {
                                        hps[i, jj] = 1;
                                        hpDates[i, jj] = closeDate.Value;
                                    }
                                }
                                else
                                {
                                    for (int ii = i; ii < TestParameters.CandidateParameter4Db.BatchTps.Length; ++ii)
                                    {
                                        hps[ii, j] = 0;
                                        hpDates[ii, j] = closeDate.Value;
                                    }
                                }
                            }
                            else
                            {
                                for (int ii = i; ii < TestParameters.CandidateParameter4Db.BatchTps.Length; ++ii)
                                    for (int jj = j; jj < TestParameters.CandidateParameter4Db.BatchSls.Length; ++jj)
                                    {
                                        hps[ii, jj] = null;
                                        hpDates[ii, jj] = null;
                                    }
                            }
                        }
                    }

                    for (int i = 0; i < TestParameters.CandidateParameter4Db.BatchTps.Length; ++i)
                    {
                        for (int j = 0; j < TestParameters.CandidateParameter4Db.BatchSls.Length; ++j)
                        {
                            System.Data.DataRow row2 = dt2.NewRow();
                            row2["Time"] = row["Time"];
                            row2["DealType"] = dealType;
                            row2["Tp"] = TestParameters.CandidateParameter4Db.BatchTps[i];
                            row2["Sl"] = TestParameters.CandidateParameter4Db.BatchSls[j];
                            row2["hp"] = hps[i, j] == null ? (object)System.DBNull.Value : hps[i, j].Value;
                            row2["hp_date"] = hpDates[i, j] == null ? (object)System.DBNull.Value : hpDates[i, j].Value;
                            dt2.Rows.Add(row2);
                        }
                    }
                }

                if (dt2.Rows.Count > 50000)
                {
                    DbHelper.Instance.BulkCopy(dt2, string.Format("{0}_HP", symbol));
                    dt2.Rows.Clear();
                }
            }
            DbHelper.Instance.BulkCopy(dt2, string.Format("{0}_HP", symbol));
            dt2.Rows.Clear();
        }