Пример #1
0
        public static void Go_run_sycle(bool With_indicators, bool Only_BUY, bool Only_SELL, bool interval_ECN_since_22_07_14)
        {
            string datastring = null;
            string[] dataArray;

            if (With_indicators == false) WorkClasses.base_file_name = "//Ticks_base.txt";
            if (With_indicators == true) WorkClasses.base_file_name = "//Ticks_base_indicator.txt";

            int BaseCount = 0;
            StreamReader baseFile_0 = new StreamReader(WorkClasses.dir_str + WorkClasses.base_file_name);
            for (int i = 0; ; i++)
            {
                datastring = baseFile_0.ReadLine();
                if (baseFile_0.EndOfStream == true) break;
                BaseCount++;
            }
            baseFile_0.Close();

            int jj;
            DateTime start_time1 = DateTime.Now;
            StreamReader baseFile_1 = new StreamReader(WorkClasses.dir_str + WorkClasses.base_file_name);
            datastring = baseFile_1.ReadLine();

            if (interval_ECN_since_22_07_14 == true)
            {
                int left = 14390211;
                BaseCount = BaseCount - left;
                for (int j = 0; j < left; j++)
                    datastring = baseFile_1.ReadLine();
            }
            else
            {
                for (jj = 0; jj < BaseCount - 10400000; jj++)
                {
                    datastring = baseFile_1.ReadLine();
                }
                BaseCount = BaseCount - jj - 10;
            }

            string[] CurTime = new string[BaseCount], Date_on_time = new string[BaseCount];
            double[] timeStep = new double[BaseCount], Ask = new double[BaseCount], Bid = new double[BaseCount], AskIncrement = new double[BaseCount], BidIncrement = new double[BaseCount];

            double[] StM5_733_0 = new double[BaseCount];
            double[] StM5_733_1 = new double[BaseCount];
            double[] StM5_733_2 = new double[BaseCount];
            double[] StM5_733_3 = new double[BaseCount];
            double[] StM5_733_4 = new double[BaseCount];

            for (int i = 0; i < BaseCount; i++)
            {
                datastring = baseFile_1.ReadLine();
                if (baseFile_1.EndOfStream == true) break;

                dataArray = datastring.Split(' ');
                Date_on_time[i] = dataArray[0];
                CurTime[i] = dataArray[1];
                timeStep[i] = Convert.ToDouble(dataArray[2]);
                Ask[i] = Convert.ToDouble(dataArray[3]);
                Bid[i] = Convert.ToDouble(dataArray[5]);
                AskIncrement[i] = Convert.ToDouble(dataArray[4]);
                BidIncrement[i] = Convert.ToDouble(dataArray[6]);

                if (With_indicators)
                {
                    StM5_733_0[i] = Convert.ToDouble(dataArray[7]);

                    if (i > 0)
                    {
                        StM5_733_4[i] = StM5_733_4[i - 1];
                        StM5_733_3[i] = StM5_733_3[i - 1];
                        StM5_733_2[i] = StM5_733_2[i - 1];
                        StM5_733_1[i] = StM5_733_1[i - 1];

                        if (StM5_733_1[i] != Convert.ToDouble(dataArray[8]))
                        {
                            StM5_733_4[i] = StM5_733_3[i - 1];
                            StM5_733_3[i] = StM5_733_2[i - 1];
                            StM5_733_2[i] = StM5_733_1[i - 1];
                            StM5_733_1[i] = Convert.ToDouble(dataArray[8]);
                        }
                    }
                }
            }
            baseFile_1.Close();
            DateTime start_end1 = DateTime.Now;

            Console.WriteLine(" ");
            Console.WriteLine((start_end1 - start_time1).ToString());
            Console.WriteLine(" ");

            double ticks_sum = 0, Last_MaxFALLbyOrder = 0;

            StreamWriter ResultFile = new StreamWriter(WorkClasses.dir_str + "//_Agregate_by_Cycle.txt");
            ResultFile.WriteLine("cnt_sell cnt_buy _out_sell _out_buy _in_sell _in_buy profit Add_Bal Add_BalDay MAX_FALL MAX_FALL_Day cnt_orders atitude_prcnt max_cnt_sell max_cnt_buy sth_low sth_max a BigMassCnt VolBMSELL_nega VolBMSELL_posi VolBMBUY_posi VolBMBUY_nega MAX_FALL_Round MNK MNM SELL_summ BUY_summ MaxCurProfitToClose_SELL MaxCurProfitToClose_BUY MaxCurStopLossToClose_SELL MaxCurStopLossToClose_BYU");

            //Сначала сканируем без BigMass. Затем начинаем варьировать.
            //лучше искать 1. по SELL, с найденным лучшим вариантом искать по 2.SELL+BUY. Затем можно воварьировать лучший найденный вариант

            int min_count_sell = 10, max_count_sell = 11, incr_count_sell = 1;
            int min_count_buy = 10, max_count_buy = 14, incr_count_buy = 1;
            int min_slice_sell = 10000, max_slice_sell = 10001, incr_slice_sell = 1;
            int min_slice_buy = 21, max_slice_buy = 31, incr_slice_buy = 3;
            int min_t_in_sell = 10000, max_t_in_sell = 10001, incr_t_in_sell = 10;
            int min_t_in_buy = 450, max_t_in_buy = 1051, incr_t_in_buy = 100;
            int min_sth_low = 190, max_sth_low = 191, incr_sth_low = 20;
            int min_sth_high = 860, max_sth_high = 861, incr_sth_high = 100;
            int min_max_ticks_activ_cnt = 10000, max_max_ticks_activ_cnt = 10001, incr_max_ticks_activ_cnt = 2000;
            int min_max_ticks_activ_cnt_buy = 0, max_max_ticks_activ_cnt_buy = 1, incr_max_ticks_activ_cnt_buy = 1000;
            int min_BigMassCnt = 0, max_BigMassCnt = 1, incr_BigMassCnt = 2;
            int min_VolBigMassSELL_negative = 0, max_VolBigMassSELL_negative = 1, incr_VolBigMassSELL_negative = 50;
            int min_VolBigMassSELL_positive = 0, max_VolBigMassSELL_positive = 1, incr_VolBigMassSELL_positive = 50;
            int min_VolBigMassBUY_positive = 0, max_VolBigMassBUY_positive = 1, incr_VolBigMassBUY_positive = 50;
            int min_VolBigMassBUY_negative = 0, max_VolBigMassBUY_negative = 1, incr_VolBigMassBUY_negative = 50;
            int min_MaxCurProfitToClose_BUY = 0, max_MaxCurProfitToClose_BUY = 501, incr_MaxCurProfitToClose_BUY = 100;
            int min_MaxCurProfitToClose_SELL = 10000, max_MaxCurProfitToClose_SELL = 10001, incr_MaxCurProfitToClose_SELL = 25;
            int min_MaxCurStopLossToClose_BUY = 0, max_MaxCurStopLossToClose_BUY = 501, incr_MaxCurStopLossToClose_BUY = 100;
            int min_MaxCurStopLossToClose_SELL = 10000, max_MaxCurStopLossToClose_SELL = 10001, incr_MaxCurStopLossToClose_SELL = 150;

            //flg_F_avg_6 = StrtStp.Start_and_Stop_FLG(TicksIn, TicksOut, 35, 0, flg_F_avg_6, 10, 0, 4.20, 0.0, 17E-5, 0E-5, 0, 0, 22, 82, "new", "new", 0, 250, 0, 0, 0, 0, 0); //(!)3334	18833	59525	-166	-96	39

            //Ask_F_avg_3
            for (int count_sell = min_count_sell; count_sell < max_count_sell; count_sell = count_sell + incr_count_sell)
            {
                for (int count_buy = min_count_buy; count_buy < max_count_buy; count_buy = count_buy + incr_count_buy)
                {
                    for (int slice_sell = min_slice_sell; slice_sell < max_slice_sell; slice_sell = slice_sell + incr_slice_sell)
                    {
                        for (int slice_buy = min_slice_buy; slice_buy < max_slice_buy; slice_buy = slice_buy + incr_slice_buy)
                        {
                            for (int t_in_sell = min_t_in_sell; t_in_sell < max_t_in_sell; t_in_sell = t_in_sell + incr_t_in_sell)
                            {
                                for (int t_in_buy = min_t_in_buy; t_in_buy < max_t_in_buy; t_in_buy = t_in_buy + incr_t_in_buy)
                                {
                                    for (int sth_low = min_sth_low; sth_low < max_sth_low; sth_low = sth_low + incr_sth_low)
                                    {
                                        for (int sth_high = min_sth_high; sth_high < max_sth_high; sth_high = sth_high + incr_sth_high)
                                        {
                                            for (int max_ticks_activ_cnt = min_max_ticks_activ_cnt; max_ticks_activ_cnt < max_max_ticks_activ_cnt; max_ticks_activ_cnt = max_ticks_activ_cnt + incr_max_ticks_activ_cnt)
                                            {
                                                //if (max_ticks_activ_cnt == 950)
                                                //    max_ticks_activ_cnt = 3350;

                                                for (int max_ticks_activ_cnt_buy = min_max_ticks_activ_cnt_buy; max_ticks_activ_cnt_buy < max_max_ticks_activ_cnt_buy; max_ticks_activ_cnt_buy = max_ticks_activ_cnt_buy + incr_max_ticks_activ_cnt_buy)
                                                {
                                                    for (int BigMassCnt = min_BigMassCnt; BigMassCnt < max_BigMassCnt; BigMassCnt = BigMassCnt + incr_BigMassCnt)
                                                    {
                                                        //---------------------
                                                        for (double VolBigMassSELL_negative = min_VolBigMassSELL_negative; VolBigMassSELL_negative < max_VolBigMassSELL_negative; VolBigMassSELL_negative = VolBigMassSELL_negative + incr_VolBigMassSELL_negative)
                                                        {
                                                            for (double VolBigMassSELL_positive = min_VolBigMassSELL_positive; VolBigMassSELL_positive < max_VolBigMassSELL_positive; VolBigMassSELL_positive = VolBigMassSELL_positive + incr_VolBigMassSELL_positive)//обычно заполняется нулем
                                                            {
                                                                for (double VolBigMassBUY_positive = min_VolBigMassBUY_positive; VolBigMassBUY_positive < max_VolBigMassBUY_positive; VolBigMassBUY_positive = VolBigMassBUY_positive + incr_VolBigMassBUY_positive)
                                                                {
                                                                    for (double VolBigMassBUY_negative = min_VolBigMassBUY_negative; VolBigMassBUY_negative < max_VolBigMassBUY_negative; VolBigMassBUY_negative = VolBigMassBUY_negative + incr_VolBigMassBUY_negative)//обычно заполняется нулем
                                                                    {
                                                        //---------------------
                                                                        //double SellCustomSthCorrection = 0.0;
                                                                        double SellCustomSthCorrection = 5.0;

                                                                        double SELL_SPREAD = 25;
                                                                        double BUY_SPREAD = 21;

                                                                        for (int MaxCurProfitToClose_BUY = min_MaxCurProfitToClose_BUY; MaxCurProfitToClose_BUY < max_MaxCurProfitToClose_BUY; MaxCurProfitToClose_BUY = MaxCurProfitToClose_BUY + incr_MaxCurProfitToClose_BUY)
                                                                        {
                                                                            for (int MaxCurProfitToClose_SELL = min_MaxCurProfitToClose_SELL; MaxCurProfitToClose_SELL < max_MaxCurProfitToClose_SELL; MaxCurProfitToClose_SELL = MaxCurProfitToClose_SELL + incr_MaxCurProfitToClose_SELL)
                                                                            {

                                                                                for (int MaxCurStopLossToClose_BUY = min_MaxCurStopLossToClose_BUY; MaxCurStopLossToClose_BUY < max_MaxCurStopLossToClose_BUY; MaxCurStopLossToClose_BUY = MaxCurStopLossToClose_BUY + incr_MaxCurStopLossToClose_BUY)
                                                                                {
                                                                                    for (int MaxCurStopLossToClose_SELL = min_MaxCurStopLossToClose_SELL; MaxCurStopLossToClose_SELL < max_MaxCurStopLossToClose_SELL; MaxCurStopLossToClose_SELL = MaxCurStopLossToClose_SELL + incr_MaxCurStopLossToClose_SELL)
                                                                                    {
                                                                                        DateTime start_time = DateTime.Now;

                                                                                        if (Last_MaxFALLbyOrder < -1500.0 || ticks_sum * 100000.0 < 500.0)
                                                                                        {
                                                                                            Last_MaxFALLbyOrder = 10000.0;
                                                                                            ticks_sum = 10000.0;

                                                                                            DateTime end_time1 = DateTime.Now;
                                                                                            Console.WriteLine("Skip iteration. " + (start_time - end_time1).ToString());

                                                                                            continue;
                                                                                        }

                                                                                        double t_divide_by = 100.0;
                                                                                        WorkClasses.Ticks_In TicksIn = new WorkClasses.Ticks_In();
                                                                                        WorkClasses.Ticks_Out TicksOut = new WorkClasses.Ticks_Out();
                                                                                        WorkClasses.Stat_Info StatInfo = new WorkClasses.Stat_Info();

                                                                                        TicksIn.flag_ByCycle = true;
                                                                                        TicksIn.SellCustomSthCorrection = SellCustomSthCorrection;

                                                                                        if (Only_BUY) TicksIn.Only_BUY_flg = true;
                                                                                        if (Only_SELL) TicksIn.Only_SELL_flg = true;

                                                                                        int dim = TicksIn.dim - 1;
                                                                                        for (int i = 0; i < dim + 1; i++) TicksIn.timeStep[i] = 1;

                                                                                        int flg_F_avg_6 = 0;
                                                                                        ticks_sum = 0;
                                                                                        double summ_dt_3;

                                                                                        double[] Last_N_profit = new double[20];
                                                                                        int count_for_Last_N_profit = 3, cnt_closed_orders = 0, cnt_negative_avg_Last_N_profit = 0;
                                                                                        int[] Counts_On_Close = new int[50000];

                                                                                        for (int i = 0; i < BaseCount; i++)
                                                                                        //for (int i = 4000000; i < BaseCount; i++)
                                                                                        {
                                                                                            TicksIn.Count = TicksIn.Count + 1;
                                                                                            TicksIn.CurTime = CurTime[i];
                                                                                            TicksIn.Date = Date_on_time[i];

                                                                                            for (int j = 0; j < dim; j++)
                                                                                            {
                                                                                                TicksIn.timeStep[j] = TicksIn.timeStep[j + 1];
                                                                                                TicksIn.Ask[j] = TicksIn.Ask[j + 1];
                                                                                                TicksIn.AskIncrement[j] = TicksIn.AskIncrement[j + 1];
                                                                                                TicksIn.Spread[j] = TicksIn.Spread[j + 1];

                                                                                                //TicksOut.AskSpeed[j] = TicksOut.AskSpeed[j + 1];
                                                                                                TicksOut.Ask_F_avg_6[j] = TicksOut.Ask_F_avg_6[j + 1];
                                                                                            }

                                                                                            TicksIn.timeStep[dim] = timeStep[i];
                                                                                            TicksIn.Ask[dim] = Ask[i];
                                                                                            TicksIn.Bid[dim] = Bid[i];
                                                                                            TicksIn.AskIncrement[dim] = AskIncrement[i];
                                                                                            TicksIn.Spread[dim] = Math.Abs(TicksIn.Ask[dim] - TicksIn.Bid[dim]) * 100000.0;

                                                                                            if (With_indicators == true)
                                                                                            {
                                                                                                TicksIn.StM5_733_0 = StM5_733_0[i];
                                                                                                TicksIn.StM5_733_1 = StM5_733_1[i];
                                                                                                TicksIn.StM5_733_2 = StM5_733_2[i];
                                                                                                TicksIn.StM5_733_3 = StM5_733_3[i];
                                                                                                TicksIn.StM5_733_4 = StM5_733_4[i];

                                                                                                TicksIn.Stohastic_Param = TicksIn.StM5_733_3;
                                                                                            }

                                                                                            //Вычисление индикаторов//

                                                                                            summ_dt_3 = TicksIn.timeStep[dim] + TicksIn.timeStep[dim - 1] + TicksIn.timeStep[dim - 2];

                                                                                            TicksOut.AskSpeed[dim] = TicksIn.AskIncrement[dim] / TicksIn.timeStep[dim];

                                                                                            TicksOut.Ask_F_avg_3[dim] = (TicksIn.AskIncrement[dim] + TicksIn.AskIncrement[dim - 1] + TicksIn.AskIncrement[dim - 2]) / Math.Pow(summ_dt_3, 2) * 100000.0;
                                                                                            TicksOut.Ask_F_avg_6[dim] = (TicksIn.AskIncrement[dim] + TicksIn.AskIncrement[dim - 1] + TicksIn.AskIncrement[dim - 2] + TicksIn.AskIncrement[dim - 3] + TicksIn.AskIncrement[dim - 4]
                                                                                                                        + TicksIn.AskIncrement[dim - 5]) / Math.Pow(summ_dt_3 + TicksIn.timeStep[dim - 3] + TicksIn.timeStep[dim - 4] + TicksIn.timeStep[dim - 5], 2) * 100000.0;

                                                                                            //Пропускаем мимо ситуации, когда ордер открыт в момент ГЭПа по времени.
                                                                                            if (WorkClasses.gaps_str.Contains(" " + Convert.ToString(TicksIn.Count) + " "))
                                                                                            {
                                                                                                if (Math.Abs(flg_F_avg_6) == 1)
                                                                                                {
                                                                                                    flg_F_avg_6 = 0;
                                                                                                    TicksOut.ticks_activ_cnt = 0;

                                                                                                    for (int j = 0; j < dim + 1; j++)
                                                                                                    {
                                                                                                        TicksOut.Ask_F_avg_3[j] = 0;
                                                                                                        //TicksOut.Ask_F_avg_4[j] = 0;
                                                                                                        //TicksOut.Ask_F_avg_5[j] = 0;
                                                                                                        TicksOut.Ask_F_avg_6[j] = 0;
                                                                                                        //TicksOut.Ask_F_avg_8[j] = 0;
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                            //----------------------

                                                                                            //------------//
                                                                                            //------------//

                                                                                            if (count_sell > TicksIn.dim) break;

                                                                                            if (flg_F_avg_6 == 1)
                                                                                            {
                                                                                                TicksOut.local_Open_vs_Cur = TicksIn.Bid[dim] - TicksOut.OpenASK;
                                                                                                if (StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] < TicksOut.local_Open_vs_Cur * 100000)
                                                                                                    StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;
                                                                                                TicksOut.ticks_activ_cnt++;
                                                                                                if (TicksOut.ticks_activ_cnt == 1)
                                                                                                {
                                                                                                    StatInfo.AskIncremBigMassSummNegative[cnt_closed_orders] = TicksIn.AskIncremBigMassSumm_Negative;
                                                                                                    StatInfo.AskIncremBigMassSummPositive[cnt_closed_orders] = TicksIn.AskIncremBigMassSumm_Positive;
                                                                                                }
                                                                                            }
                                                                                            else if (flg_F_avg_6 == -1)
                                                                                            {
                                                                                                TicksOut.local_Open_vs_Cur = TicksOut.OpenBID - TicksIn.Ask[dim];
                                                                                                if (StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] < TicksOut.local_Open_vs_Cur * 100000)
                                                                                                    StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;
                                                                                                TicksOut.ticks_activ_cnt++;

                                                                                                if (TicksOut.ticks_activ_cnt == 1)
                                                                                                {
                                                                                                    StatInfo.AskIncremBigMassSummNegative[cnt_closed_orders] = TicksIn.AskIncremBigMassSumm_Negative;
                                                                                                    StatInfo.AskIncremBigMassSummPositive[cnt_closed_orders] = TicksIn.AskIncremBigMassSumm_Positive;
                                                                                                }
                                                                                            }
                                                                                            else if (flg_F_avg_6 == 0)
                                                                                            {
                                                                                                TicksOut.local_Open_vs_Cur = 0;
                                                                                            }

                                                                                            flg_F_avg_6 = StrtStp.Start_and_Stop_FLG(TicksIn, TicksOut, SELL_SPREAD, BUY_SPREAD, flg_F_avg_6, count_sell, count_buy, t_in_sell / t_divide_by, t_in_buy / t_divide_by,
                                                                                                    slice_sell / 100000.0, slice_buy / 100000.0, max_ticks_activ_cnt, max_ticks_activ_cnt_buy, sth_low / 10.0, sth_high / 10.0, "new", "new",
                                                                                                    MaxCurProfitToClose_BUY, MaxCurProfitToClose_SELL, -MaxCurStopLossToClose_BUY, -MaxCurStopLossToClose_SELL,
                                                                                                    VolBigMassSELL_negative, VolBigMassSELL_positive, VolBigMassBUY_positive, VolBigMassBUY_negative, BigMassCnt);

                                                                                            if (Math.Abs(flg_F_avg_6) == 1 && TicksOut.ticks_activ_cnt == 0)
                                                                                                StatInfo.StartSpread[cnt_closed_orders] = TicksIn.Spread[dim];

                                                                                            count_for_Last_N_profit = 3;
                                                                                            if (Math.Abs(flg_F_avg_6) == 2)
                                                                                            {
                                                                                                if (flg_F_avg_6 == 2)
                                                                                                    TicksOut.local_Open_vs_Cur = TicksIn.Bid[dim] - TicksOut.OpenASK;
                                                                                                if (flg_F_avg_6 == -2)
                                                                                                    TicksOut.local_Open_vs_Cur = TicksOut.OpenBID - TicksIn.Ask[dim];

                                                                                                ticks_sum = ticks_sum + TicksOut.local_Open_vs_Cur;
                                                                                                TicksOut.Ticks_Sum_on_time[cnt_closed_orders] = ticks_sum * 100000;  //Присваиваем текущее значение профита для последующего МНК
                                                                                                TicksOut.Date_on_time[cnt_closed_orders] = TicksIn.Date;
                                                                                                TicksOut.Cur_Order_Profit[cnt_closed_orders] = (TicksOut.local_Open_vs_Cur) * 100000;
                                                                                                TicksOut.flg_F_avg_6[cnt_closed_orders] = flg_F_avg_6;
                                                                                                Counts_On_Close[cnt_closed_orders] = TicksIn.Count;

                                                                                                if (StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] < TicksOut.local_Open_vs_Cur * 100000)
                                                                                                    StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;

                                                                                                for (int j = 0; j < count_for_Last_N_profit - 1; j++)
                                                                                                    Last_N_profit[j] = Last_N_profit[j + 1];
                                                                                                Last_N_profit[count_for_Last_N_profit - 1] = (TicksOut.local_Open_vs_Cur) * 100000;

                                                                                                double avg_Last_N_profit = 0.0;
                                                                                                for (int j = 0; j < count_for_Last_N_profit; j++) avg_Last_N_profit += Last_N_profit[j];
                                                                                                avg_Last_N_profit = avg_Last_N_profit / count_for_Last_N_profit;
                                                                                                if (cnt_closed_orders < count_for_Last_N_profit) avg_Last_N_profit = 0;
                                                                                                if (avg_Last_N_profit < 0.0) cnt_negative_avg_Last_N_profit++;

                                                                                                cnt_closed_orders++;
                                                                                            }

                                                                                            if (flg_F_avg_6 == -2 || flg_F_avg_6 == 2)
                                                                                            {
                                                                                                flg_F_avg_6 = 0;
                                                                                                TicksOut.ticks_activ_cnt = 0;
                                                                                            }
                                                                                        }

                                                                                        DateTime end_time_mid = DateTime.Now;

                                                                                        if (cnt_closed_orders == 0) continue;

                                                                                        double atitude_pecents = Convert.ToDouble(cnt_negative_avg_Last_N_profit) / (cnt_closed_orders + 1) * 100.0;

                                                                                        if (cnt_closed_orders > 1000)
                                                                                        {
                                                                                            Console.WriteLine("cnt_closed_orders > 1000");
                                                                                            continue;
                                                                                        }

                                                                                        int cnt_of_start_last_date = 0;
                                                                                        double[] Cur_Day_Profit = new double[cnt_closed_orders], Ticks_Sum_on_Day = new double[cnt_closed_orders];
                                                                                        for (int i = 0; i < cnt_closed_orders; i++)
                                                                                        {
                                                                                            if (TicksOut.Date_on_time[i] == TicksOut.Date_on_time[cnt_closed_orders - 1])
                                                                                            {
                                                                                                cnt_of_start_last_date = i;
                                                                                                break;
                                                                                            }
                                                                                        }
                                                                                        for (int i = 0; i <= cnt_of_start_last_date; i++)
                                                                                        {
                                                                                            string temp_date = TicksOut.Date_on_time[i];
                                                                                            Cur_Day_Profit[i] = TicksOut.Cur_Order_Profit[i];
                                                                                            if (i == 0) Ticks_Sum_on_Day[i] = TicksOut.Cur_Order_Profit[i];
                                                                                            else Ticks_Sum_on_Day[i] = Ticks_Sum_on_Day[i - 1] + TicksOut.Cur_Order_Profit[i];

                                                                                            for (int j = i + 1; j < cnt_closed_orders; j++)
                                                                                            {
                                                                                                if (TicksOut.Date_on_time[j] != temp_date)
                                                                                                {
                                                                                                    for (int t = j - 1; t > i; t--) { Cur_Day_Profit[t] = Cur_Day_Profit[i]; Ticks_Sum_on_Day[t] = Ticks_Sum_on_Day[i]; }
                                                                                                    i = j - 1; break;
                                                                                                }

                                                                                                Cur_Day_Profit[i] += TicksOut.Cur_Order_Profit[j];
                                                                                                Ticks_Sum_on_Day[i] += TicksOut.Cur_Order_Profit[j];
                                                                                            }
                                                                                            if (i == cnt_of_start_last_date && cnt_of_start_last_date != (cnt_closed_orders - 1))
                                                                                            {
                                                                                                for (int j = cnt_of_start_last_date + 1; j < cnt_closed_orders; j++)
                                                                                                {
                                                                                                    Ticks_Sum_on_Day[j] = Ticks_Sum_on_Day[cnt_of_start_last_date];
                                                                                                }
                                                                                            }
                                                                                        }

                                                                                        //---Аппроксимируем прямой---
                                                                                        double[] residuals = new double[cnt_closed_orders];
                                                                                        double s_xy = 0.0, s_x = 0.0, s_y = 0.0, s_x2 = 0.0;
                                                                                        for (int i = 0; i < cnt_closed_orders; i++)
                                                                                        {
                                                                                            s_x += i + 1;
                                                                                            s_y += TicksOut.Ticks_Sum_on_time[i];
                                                                                            s_xy += TicksOut.Ticks_Sum_on_time[i] * (i + 1);
                                                                                            s_x2 += (i + 1) * (i + 1);
                                                                                        }
                                                                                        double a = (cnt_closed_orders * s_xy - s_x * s_y) / (cnt_closed_orders * s_x2 - s_x * s_x);
                                                                                        double b = (s_y - a * s_x) / (cnt_closed_orders);

                                                                                        double SELL_summ_slice = 0.0, BUY_summ_slice = 0.0;
                                                                                        double[] Max_FALL = new double[cnt_closed_orders * cnt_closed_orders], Max_FALL_byDay = new double[cnt_closed_orders * cnt_closed_orders];
                                                                                        for (int i = 0; i < cnt_closed_orders; i++)
                                                                                        {
                                                                                            StatInfo.residual_avg_MNK += Math.Abs((TicksOut.Ticks_Sum_on_time[i] - (a * (i + 1) + b)));
                                                                                            StatInfo.residual_avg_MNM += Math.Abs((TicksOut.Ticks_Sum_on_time[i] - (a * (i + 1) + b)) * Math.Cos(Math.Atan(a)));

                                                                                            if (TicksOut.flg_F_avg_6[i] == -2)
                                                                                                StatInfo.SELL_summ_slice += TicksOut.Cur_Order_Profit[i];
                                                                                            if (TicksOut.flg_F_avg_6[i] == 2)
                                                                                                StatInfo.BUY_summ_slice += TicksOut.Cur_Order_Profit[i];

                                                                                            for (int j = 0; j < i; j++)
                                                                                            {
                                                                                                Max_FALL[i * i + j] = TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - j - 1];
                                                                                                Max_FALL_byDay[i * i + j] = Ticks_Sum_on_Day[i] - Ticks_Sum_on_Day[i - j - 1];
                                                                                            }
                                                                                        }
                                                                                        StatInfo.MaxFALLbyOrder = Max_FALL.Min();
                                                                                        if (StatInfo.MaxFALLbyOrder > -0.1) StatInfo.MaxFALLbyOrder = 1;
                                                                                        StatInfo.MaxFALLbyDay = Max_FALL_byDay.Min();
                                                                                        if (StatInfo.MaxFALLbyDay > -0.1) StatInfo.MaxFALLbyDay = 1;

                                                                                        StatInfo.residual_avg_MNK = StatInfo.residual_avg_MNK / cnt_closed_orders;
                                                                                        StatInfo.residual_avg_MNM = StatInfo.residual_avg_MNM / cnt_closed_orders;

                                                                                        //StreamWriter helpFile = new StreamWriter(WorkClasses.dir_str + "////help_out.txt");
                                                                                        //Смотрим, сколько было бы "+" прибыли, если бы выставили как 10% от баланса по макс.падению
                                                                                        double Balance = 3000.0, Balance_Day = 3000.0;
                                                                                        for (int i = 0; i < cnt_closed_orders; i++)
                                                                                        {
                                                                                            residuals[i] = Math.Abs((TicksOut.Ticks_Sum_on_time[i] - (a * (i + 1) + b)));

                                                                                            if (i != 0) Balance_Day = Balance_Day + (TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - 1]) * Math.Min((0.10 * Balance_Day) / Math.Abs(StatInfo.MaxFALLbyDay), 100.0);
                                                                                            else Balance_Day = Balance_Day + (TicksOut.Ticks_Sum_on_time[i]) * (0.10 * Balance_Day) / Math.Abs(StatInfo.MaxFALLbyDay);

                                                                                            if (i != 0) Balance = Balance + (TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - 1]) * Math.Min((0.10 * Balance) / Math.Abs(StatInfo.MaxFALLbyOrder), 100.0);
                                                                                            else Balance = Balance + (TicksOut.Ticks_Sum_on_time[i]) * (0.10 * Balance) / Math.Abs(StatInfo.MaxFALLbyOrder);

                                                                                            //    helpFile.WriteLine((Counts_On_Close[i]).ToString() + " " + TicksOut.Date_on_time[i] + " " + TicksOut.flg_F_avg_6[i].ToString() + " " + TicksOut.Cur_Order_Profit[i].ToString() + " " + StatInfo.MaxLocalProfitInOrder[i].ToString() + " " + TicksOut.Ticks_Sum_on_time[i].ToString()
                                                                                            //+ " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(Balance_Day).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0]
                                                                                            //+ " " + cnt_closed_orders.ToString() + " " + (a * (i + 1) + b).ToString() + " " + residuals[i] + " " + a.ToString() + " " + StatInfo.residual_avg_MNK.ToString() + " " + StatInfo.residual_avg_MNM.ToString()
                                                                                            //+ " " + StatInfo.SELL_summ_slice.ToString() + " " + StatInfo.BUY_summ_slice.ToString()
                                                                                            //+ " " + (Math.Round(StatInfo.MaxFALLbyOrder / 1000.0, 1) * 1000.0).ToString());
                                                                                        }
                                                                                        //helpFile.Close();

                                                                                        //-------------------------

                                                                                        DateTime end_time = DateTime.Now;

                                                                                        Console.WriteLine((count_sell).ToString() + " " + (slice_sell / 100000.0).ToString() + " " + (slice_buy / 100000.0).ToString()
                                                                                            + " " + (t_in_sell / t_divide_by).ToString() + " " + (t_in_buy / t_divide_by).ToString()
                                                                                            + " " + max_ticks_activ_cnt.ToString() + " " + max_ticks_activ_cnt_buy.ToString()
                                                                                            + " " + atitude_pecents.ToString()
                                                                                            + " " + (start_time - end_time).ToString()
                                                                                            + " " + (start_time - end_time_mid).ToString());

                                                                                        //if (ticks_sum * 100000.0 > 100.0 && a > 5.0 && Max_FALL1 > -500.0 && atitude_pecents < 55.0
                                                                                        if (ticks_sum * 100000.0 > 10.0 && a > 0.0
                                                                                                && cnt_closed_orders > 10 && StatInfo.MaxFALLbyOrder > -3000.0
                                                                                            //            //&& atitude_pecents < 55.0 && StatInfo.residual_avg_MNK < 1000.0
                                                                                            //    //&& (Balance - 3000.0) > 1000.0
                                                                                            )
                                                                                        {
                                                                                            ResultFile.WriteLine((count_sell).ToString() + " " + (count_buy).ToString() + " " + slice_sell.ToString() + " " + slice_buy.ToString() + " " + (t_in_sell / t_divide_by).ToString()
                                                                                                     + " " + (t_in_buy / t_divide_by).ToString() + " " + (ticks_sum * 100000.0).ToString()
                                                                                                     + " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(Balance_Day).Split('.')[0]
                                                                                                     + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0] + " " + cnt_closed_orders.ToString() + " " + (atitude_pecents).ToString()
                                                                                                     + " " + max_ticks_activ_cnt.ToString() + " " + max_ticks_activ_cnt_buy.ToString()
                                                                                                     + " " + (sth_low / 10.0).ToString() + " " + (sth_high / 10.0).ToString() + " " + a.ToString()
                                                                                                     + " " + BigMassCnt + " " + VolBigMassSELL_negative + " " + VolBigMassSELL_positive + " " + VolBigMassBUY_positive + " " + VolBigMassBUY_negative
                                                                                                     + " " + (Math.Round(StatInfo.MaxFALLbyOrder / 1000.0, 1) * 1000.0).ToString()
                                                                                                     + " " + StatInfo.residual_avg_MNK.ToString() + " " + StatInfo.residual_avg_MNM.ToString()
                                                                                                     + " " + StatInfo.SELL_summ_slice.ToString() + " " + StatInfo.BUY_summ_slice.ToString()
                                                                                                     + " " + MaxCurProfitToClose_SELL.ToString() + " " + MaxCurProfitToClose_BUY.ToString()
                                                                                                     + " " + MaxCurStopLossToClose_SELL.ToString() + " " + MaxCurStopLossToClose_BUY.ToString()
                                                                                                     );
                                                                                        }

                                                                                        Last_MaxFALLbyOrder = StatInfo.MaxFALLbyOrder;
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }

                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }

                                }
                            }
                        }
                    }

                }
            }

            ResultFile.Close();
        }
Пример #2
0
        private void StartAnalyse_Click(object sender, EventArgs e)
        {
            string datastring = null;

            if (With_indicators.Checked == false) WorkClasses.base_file_name = "//Ticks_base.txt";
            if (With_indicators.Checked == true)
            {
                WorkClasses.base_file_name = "//Ticks_base_indicator.txt";

                if (this.UseShortFile.Checked == true)
                    WorkClasses.base_file_name = "//Ticks_base_indicator_Short.txt";

                //if (Ind_Local_file.Checked == true)
                //    WorkClasses.base_file_name = "//Ticks_base_ind_local.txt";
            }

            StreamWriter temp_help = new StreamWriter(WorkClasses.dir_str + "//_temp_help.txt");

            StreamReader baseFile = new StreamReader(WorkClasses.dir_str + WorkClasses.base_file_name);
            StreamWriter OutFile = new StreamWriter(WorkClasses.dir_str + "//_Ticks_all_processed.txt");
            StreamWriter ResultFile = new StreamWriter(WorkClasses.dir_str + "//_Agregate_by_Ind.txt");
            StreamWriter DetailResultFile = new StreamWriter(WorkClasses.dir_str + "//_Agregate_Detail_by_Ind.txt");

            //StreamReader stream = new StreamReader("D://Ticks//archive//_Bases//2013.11.01_Ticks_base.txt");
            //StreamReader stream = new StreamReader("D://Ticks//_Agregate_by_Cycle.txt");
            //string allstr = baseFile.ReadToEnd();
            //string[] ArrayOfAllString = allstr.Split('\n');
            //allstr.Remove(0);

            DetailResultFile.WriteLine("count Date CurTime AskIncrement flg_F_avg_6 Bid Ask ticks_activ_cnt ticks_active_time profit_step AskSpeed Ask_V_3 Ask_V_6 Ask_V_avg_3 Ask_V_avg_6 Ask_F_avg_3 Ask_F_avg_6");

            StreamWriter helpFile = new StreamWriter(WorkClasses.dir_str + "//_help_out.txt");
            StreamWriter helpFile_byDays = new StreamWriter(WorkClasses.dir_str + "//_help_out_by_days.txt");
            StreamWriter helpFile_byMonth = new StreamWriter(WorkClasses.dir_str + "//_help_out_by_month.txt");

            WorkClasses.Ticks_In TicksIn = new WorkClasses.Ticks_In();
            WorkClasses.Ticks_Out TicksOut = new WorkClasses.Ticks_Out();
            WorkClasses.Stat_Info StatInfo = new WorkClasses.Stat_Info();

            if (this.Only_BUY.Checked) TicksIn.Only_BUY_flg = true;
            if (this.Only_SELL.Checked) TicksIn.Only_SELL_flg = true;
            if (this.With_indicators.Checked) TicksIn.With_indicators = true;

            int dim = TicksIn.dim - 1;
            for (int i = 0; i < dim+1; i++) TicksIn.timeStep[i] = 1;

            int flg_F_avg_6 = 0;
            double ticks_sum = 0;

            int cnt_closed_orders = 0, cnt_negative_avg_Last_N_profit = 0;
            int[] Counts_On_Close = new int[50000], Counts_On_Open = new int[50000];
            double ticks_active_time = 0.0;
            string order_open_time = "";

            double[] Last_N_profit = new double[20];

            datastring = baseFile.ReadLine();
            OutFile.WriteLine("Count CurTime TimeInc Ask Bid AskIncrement flg_F ticks_activ_cnt ticks_active_time Bid-OpenASK OpenBID-Bid AskSpeed Ask_F_avg_3 Ask_F_avg_6 StM5_733_0 StM5_733_1 StM5_733_2 StM5_733_3");
            helpFile.WriteLine("OpenN CloseN Cur_Date flag_F MinLocal MaxLocal OpenSpread CloseSpread CurPointProfit AbsPointProfit Balance BalanceDay MaxFall MaxFallDay CntClosed BigMassNega BigMassPosi AskSpeed Ask_F_avg_3");

            DateTime start_time = DateTime.Now;
            double summ_dt_3;

            for (int i = 0; ; i++)
            {
                if (baseFile.EndOfStream == true || i >= BaseCount) break;

                if (this.only_full_part.Checked == true && i == 0)
                {
                    for (int j = 0; j < BaseCountToSkip; j++)
                    {
                        datastring = baseFile.ReadLine();
                        TicksIn.Count = TicksIn.Count + 1;
                        i++;
                    }
                }

                //datastring = baseFile.ReadLine();
                ////TicksIn.dataArray = datastring.Split(new Char[] {' '}, 10);
                //TicksIn.dataArray = datastring.Split(' ');

                TicksIn.Count = TicksIn.Count + 1;
                //TicksIn.Date = TicksIn.dataArray[0];
                //TicksIn.CurTime = TicksIn.dataArray[1];
                TicksIn.CurTime = CurTime[i];
                TicksIn.Date = Date_on_time[i];

                for (int j = 0; j < dim; j++)
                {
                    TicksIn.timeStep[j] = TicksIn.timeStep[j + 1];
                    TicksIn.Ask[j] = TicksIn.Ask[j + 1];
                    TicksIn.Bid[j] = TicksIn.Bid[j + 1];
                    TicksIn.AskIncrement[j] = TicksIn.AskIncrement[j + 1];
                    TicksIn.BidIncrement[j] = TicksIn.BidIncrement[j + 1];
                    TicksIn.Spread[j] = TicksIn.Spread[j + 1];
                    TicksOut.AskSpeed[j] = TicksOut.AskSpeed[j + 1];
                    TicksOut.Ask_F_avg_6[j] = TicksOut.Ask_F_avg_6[j + 1];
                }

                //TicksIn.timeStep[dim] = Convert.ToDouble(TicksIn.dataArray[2]);
                //TicksIn.Ask[dim] = Convert.ToDouble(TicksIn.dataArray[3]);
                //TicksIn.Bid[dim] = Convert.ToDouble(TicksIn.dataArray[5]);
                //TicksIn.AskIncrement[dim] = Convert.ToDouble(TicksIn.dataArray[4]);
                //TicksIn.BidIncrement[dim] = Convert.ToDouble(TicksIn.dataArray[6]);
                //TicksIn.Spread[dim] = Math.Abs(TicksIn.Ask[dim] - TicksIn.Bid[dim]) * 100000.0;

                TicksIn.timeStep[dim] = timeStep[i];
                TicksIn.Ask[dim] = Ask[i];
                TicksIn.Bid[dim] = Bid[i];
                TicksIn.AskIncrement[dim] = AskIncrement[i];
                TicksIn.BidIncrement[dim] = BidIncrement[i];
                TicksIn.Spread[dim] = Math.Abs(TicksIn.Ask[dim] - TicksIn.Bid[dim]) * 100000.0;

                if (With_indicators.Checked == true)
                {
                    //for (int j = TicksIn.StM1_733_0.Length - 1; j > 0; j--)
                    //{
                    //    TicksIn.StM1_733_0[j] = TicksIn.StM1_733_0[j - 1];
                    //}
                    //TicksIn.StM1_733_0[0] = Convert.ToDouble(TicksIn.dataArray[11]);

                    //TicksIn.StM5_733_0 = Convert.ToDouble(TicksIn.dataArray[7]);
                    //TicksIn.StM5_532_0 = Convert.ToDouble(TicksIn.dataArray[9]);
                    //TicksIn.DifOpenClose_0 = Convert.ToInt32(TicksIn.dataArray[13]);
                    //TicksIn.StdDevM5_40_0 = Convert.ToDouble(TicksIn.dataArray[15]);
                    //if (TicksIn.StM1_733_1 != Convert.ToDouble(TicksIn.dataArray[12]))
                    //{
                    //    TicksIn.StM1_733_4 = TicksIn.StM1_733_3;
                    //    TicksIn.StM1_733_3 = TicksIn.StM1_733_2;
                    //    TicksIn.StM1_733_2 = TicksIn.StM1_733_1;
                    //    TicksIn.StM1_733_1 = Convert.ToDouble(TicksIn.dataArray[12]);
                    //}
                    //if (TicksIn.StM5_733_1 != Convert.ToDouble(TicksIn.dataArray[8]))
                    //{
                    //    TicksIn.StM5_733_4 = TicksIn.StM5_733_3;
                    //    TicksIn.StM5_733_3 = TicksIn.StM5_733_2;
                    //    TicksIn.StM5_733_2 = TicksIn.StM5_733_1;
                    //    TicksIn.StM5_733_1 = Convert.ToDouble(TicksIn.dataArray[8]);
                    //    TicksIn.StM5_532_4 = TicksIn.StM5_532_3;
                    //    TicksIn.StM5_532_3 = TicksIn.StM5_532_2;
                    //    TicksIn.StM5_532_2 = TicksIn.StM5_532_1;
                    //    TicksIn.StM5_532_1 = Convert.ToDouble(TicksIn.dataArray[10]);
                    //    TicksIn.DifOpenClose_4 = TicksIn.DifOpenClose_3;
                    //    TicksIn.DifOpenClose_3 = TicksIn.DifOpenClose_2;
                    //    TicksIn.DifOpenClose_2 = TicksIn.DifOpenClose_1;
                    //    TicksIn.DifOpenClose_1 = Convert.ToInt32(TicksIn.dataArray[14]);
                    //    TicksIn.StdDevM5_40_4 = TicksIn.StdDevM5_40_3;
                    //    TicksIn.StdDevM5_40_3 = TicksIn.StdDevM5_40_2;
                    //    TicksIn.StdDevM5_40_2 = TicksIn.StdDevM5_40_1;
                    //    TicksIn.StdDevM5_40_1 = Convert.ToDouble(TicksIn.dataArray[16]);
                    //    TicksIn.iBullsM5_7_4 = TicksIn.iBullsM5_7_3;
                    //    TicksIn.iBullsM5_7_3 = TicksIn.iBullsM5_7_2;
                    //    TicksIn.iBullsM5_7_2 = TicksIn.iBullsM5_7_1;
                    //    TicksIn.iBullsM5_7_1 = Convert.ToDouble(TicksIn.dataArray[17]);
                    //    TicksIn.iBearM5_7_4 = TicksIn.iBearM5_7_3;
                    //    TicksIn.iBearM5_7_3 = TicksIn.iBearM5_7_2;
                    //    TicksIn.iBearM5_7_2 = TicksIn.iBearM5_7_1;
                    //    TicksIn.iBearM5_7_1 = Convert.ToDouble(TicksIn.dataArray[18]);
                    //}

                    TicksIn.StM5_733_0 = StM5_733_0[i];
                    TicksIn.StM5_733_1 = StM5_733_1[i];
                    TicksIn.StM5_733_2 = StM5_733_2[i];
                    TicksIn.StM5_733_3 = StM5_733_3[i];
                    TicksIn.StM5_733_4 = StM5_733_4[i];

                    TicksIn.Stohastic_Param = TicksIn.StM5_733_3;
                }

                //Вычисление индикаторов//
                summ_dt_3 = TicksIn.timeStep[dim] + TicksIn.timeStep[dim - 1] + TicksIn.timeStep[dim - 2];

                TicksOut.AskSpeed[dim] = TicksIn.AskIncrement[dim] / TicksIn.timeStep[dim];

                TicksOut.Ask_F_avg_3[dim] = (TicksIn.AskIncrement[dim] + TicksIn.AskIncrement[dim - 1] + TicksIn.AskIncrement[dim - 2]) / Math.Pow(summ_dt_3, 2) * 100000.0;
                TicksOut.Ask_F_avg_6[dim] = (TicksIn.AskIncrement[dim] + TicksIn.AskIncrement[dim - 1] + TicksIn.AskIncrement[dim - 2] + TicksIn.AskIncrement[dim - 3] + TicksIn.AskIncrement[dim - 4]
                                            + TicksIn.AskIncrement[dim - 5]) / Math.Pow(summ_dt_3 + TicksIn.timeStep[dim - 3] + TicksIn.timeStep[dim - 4] + TicksIn.timeStep[dim - 5], 2) * 100000.0;

                //Пропускаем мимо ситуации, когда ордер открыт в момент ГЭПа по времени.
                if (WorkClasses.gaps_str.Contains(" " + Convert.ToString(TicksIn.Count) + " "))
                {
                    if (Math.Abs(flg_F_avg_6) == 1)
                    {
                        flg_F_avg_6 = 0;
                        TicksOut.ticks_activ_cnt = 0;
                        ticks_active_time = 0.0;

                        for (int j = 0; j < dim+1; j++)
                        {
                            TicksOut.Ask_F_avg_3[j] = 0;
                            TicksOut.Ask_F_avg_4[j] = 0;
                            TicksOut.Ask_F_avg_5[j] = 0;
                            TicksOut.Ask_F_avg_6[j] = 0;
                            TicksOut.Ask_F_avg_7[j] = 0;
                            TicksOut.Ask_F_avg_8[j] = 0;
                        }
                    }
                }
                //-------------------

                if (TicksIn.Count == 8990286)
                    TicksIn.Count = TicksIn.Count;

                if (Math.Abs(flg_F_avg_6) == 1)
                {
                    if (flg_F_avg_6 == 1)
                        TicksOut.local_Open_vs_Cur = TicksIn.Bid[dim] - TicksOut.OpenASK;
                    if (flg_F_avg_6 == -1)
                        TicksOut.local_Open_vs_Cur = TicksOut.OpenBID - TicksIn.Ask[dim];

                    if (StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] < TicksOut.local_Open_vs_Cur * 100000)
                        StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;
                    if (StatInfo.MinLocalProfitInOrder[cnt_closed_orders] > TicksOut.local_Open_vs_Cur * 100000)
                        StatInfo.MinLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;

                    TicksOut.ticks_activ_cnt++;
                    ticks_active_time = ticks_active_time + TicksIn.timeStep[dim];

                    if (TicksOut.ticks_activ_cnt == 1)
                    {
                        StatInfo.AskIncremBigMassSummNegative[cnt_closed_orders] = TicksIn.AskIncremBigMassSumm_Negative;
                        StatInfo.AskIncremBigMassSummPositive[cnt_closed_orders] = TicksIn.AskIncremBigMassSumm_Positive;
                    }
                }
                else if (flg_F_avg_6 == 0)
                {
                    order_open_time = TicksIn.CurTime;
                    TicksOut.local_Open_vs_Cur = 0;
                }

                if (Math.Abs(TicksIn.Ask[dim] - TicksIn.Bid[dim]) * 100000.0 < 4.0)
                    //temp_help.WriteLine(TicksIn.Count + " " + TicksIn.Date + " " + TicksIn.CurTime + " " + (TicksIn.Ask[dim] - TicksIn.Bid[dim]).ToString());
                    temp_help.WriteLine(datastring);

            /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
                flg_F_avg_6 = ParamVariants.ChouseTheSet(flg_F_avg_6, TicksIn, TicksOut, BaseCountToSkip, this.only_full_part.Checked);
            /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

                if (Math.Abs(flg_F_avg_6) == 1 && TicksOut.ticks_activ_cnt == 0)
                {
                    Counts_On_Open[cnt_closed_orders] = TicksIn.Count;
                    StatInfo.StartSpread[cnt_closed_orders] = TicksIn.Spread[dim];
                    if (flg_F_avg_6 < 0) StatInfo.AskSpeedOpen[cnt_closed_orders] = -TicksOut.AskSpeed[TicksIn.dim - 1] * 100000.0;
                    else StatInfo.AskSpeedOpen[cnt_closed_orders] = TicksOut.AskSpeed[TicksIn.dim - 1] * 100000.0;
                    if (flg_F_avg_6 < 0) StatInfo.Ask_F_avg_3_Open[cnt_closed_orders] = -TicksOut.Ask_F_avg_3[TicksIn.dim - 1];
                    else StatInfo.Ask_F_avg_3_Open[cnt_closed_orders] = TicksOut.Ask_F_avg_3[TicksIn.dim - 1];
                }

                int count_for_Last_N_profit = 3;
                if (Math.Abs(flg_F_avg_6) == 2)
                {
                    if (flg_F_avg_6 == 2)
                        TicksOut.local_Open_vs_Cur = TicksIn.Bid[dim] - TicksOut.OpenASK;
                    if (flg_F_avg_6 == -2)
                        TicksOut.local_Open_vs_Cur = TicksOut.OpenBID - TicksIn.Ask[dim];

                    if (false)
                        TicksOut.local_Open_vs_Cur = TicksOut.local_Open_vs_Cur - 0.00010;

                    ticks_sum = ticks_sum + TicksOut.local_Open_vs_Cur;
                    TicksOut.Ticks_Sum_on_time[cnt_closed_orders] = ticks_sum * 100000;  //Присваиваем текущее значение профита для последующего МНК
                    TicksOut.Date_on_time[cnt_closed_orders] = TicksIn.Date;
                    TicksOut.Cur_Order_Profit[cnt_closed_orders] = (TicksOut.local_Open_vs_Cur) * 100000;
                    TicksOut.flg_F_avg_6[cnt_closed_orders] = flg_F_avg_6;
                    Counts_On_Close[cnt_closed_orders] = TicksIn.Count;

                    StatInfo.CloseSpread[cnt_closed_orders] = TicksIn.Spread[dim];

                    if (StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] < TicksOut.local_Open_vs_Cur * 100000)
                        StatInfo.MaxLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;
                    if (StatInfo.MinLocalProfitInOrder[cnt_closed_orders] > TicksOut.local_Open_vs_Cur * 100000)
                        StatInfo.MinLocalProfitInOrder[cnt_closed_orders] = TicksOut.local_Open_vs_Cur * 100000;

                    for (int j = 0; j < count_for_Last_N_profit - 1; j++)
                        Last_N_profit[j] = Last_N_profit[j + 1];
                    Last_N_profit[count_for_Last_N_profit - 1] = (TicksOut.local_Open_vs_Cur) * 100000;

                    double avg_Last_N_profit = 0.0;
                    for (int j = 0; j < count_for_Last_N_profit; j++) avg_Last_N_profit += Last_N_profit[j];
                    avg_Last_N_profit = avg_Last_N_profit / count_for_Last_N_profit;
                    if (cnt_closed_orders < count_for_Last_N_profit) avg_Last_N_profit = 0;
                    if (avg_Last_N_profit < 0.0) cnt_negative_avg_Last_N_profit++;

                    cnt_closed_orders++;

                    if (flg_F_avg_6 == 2)
                        ResultFile.WriteLine(TicksIn.Count.ToString() + " " + TicksIn.Date + " " + flg_F_avg_6.ToString() + " " + TicksIn.Bid[dim].ToString() + " " + TicksOut.OpenASK.ToString()
                                    + " " + TicksOut.ticks_activ_cnt.ToString() + " " + ticks_active_time.ToString() + " " + order_open_time + " " + (TicksOut.local_Open_vs_Cur * 100000).ToString()
                                    + " " + (ticks_sum * 100000).ToString() + " " + avg_Last_N_profit.ToString());

                    if (flg_F_avg_6 == -2)
                        ResultFile.WriteLine(TicksIn.Count.ToString() + " " + TicksIn.Date + " " + flg_F_avg_6.ToString() + " " + TicksOut.OpenBID.ToString() + " " + TicksIn.Ask[dim].ToString()
                                    + " " + TicksOut.ticks_activ_cnt.ToString() + " " + ticks_active_time.ToString() + " " + order_open_time + " " + (TicksOut.local_Open_vs_Cur * 100000).ToString()
                                    + " " + (ticks_sum * 100000).ToString() + " " + avg_Last_N_profit.ToString());
                }

                if ((TicksIn.Count > 10373200 && TicksIn.Count <= 10373383))
                {
                    OutFile.WriteLine(TicksIn.Count + " " + TicksIn.CurTime + " " + TicksIn.timeStep[dim] + " " + TicksIn.Ask[dim] + " " + TicksIn.Bid[dim] + " " + (TicksIn.AskIncrement[dim] * 100000)
                                        + " " + flg_F_avg_6 + " " + TicksOut.ticks_activ_cnt + " " + ticks_active_time
                                        + " " + ((TicksIn.Bid[dim] - TicksOut.OpenASK) * 100000) + " " + ((TicksOut.OpenBID - TicksIn.Bid[dim]) * 100000)
                                        + " " + TicksOut.AskSpeed[dim] + " " + TicksOut.Ask_F_avg_3[dim] + " " + TicksOut.Ask_F_avg_6[dim]
                                        + " " + TicksIn.StM5_733_0 + " " + TicksIn.StM5_733_1 + " " + TicksIn.StM5_733_2 + " " + TicksIn.StM5_733_3);
                }

                if (flg_F_avg_6 == -2 || flg_F_avg_6 == 2)
                {
                    flg_F_avg_6 = 0;
                    TicksOut.ticks_activ_cnt = 0;
                    ticks_active_time = 0.0;
                }

            }
            temp_help.Close();

            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

            int cnt_of_start_last_date = 0;
            double[] Cur_Day_Profit = new double[cnt_closed_orders], Ticks_Sum_on_Day = new double[cnt_closed_orders];
            for (int i = 0; i < cnt_closed_orders; i++)
            {
                if (TicksOut.Date_on_time[i] == TicksOut.Date_on_time[cnt_closed_orders - 1])
                {
                    cnt_of_start_last_date = i;
                    break;
                }
            }
            for (int i = 0; i <= cnt_of_start_last_date; i++)
            {
                string temp_date = TicksOut.Date_on_time[i];
                Cur_Day_Profit[i] = TicksOut.Cur_Order_Profit[i];
                if (i == 0) Ticks_Sum_on_Day[i] = TicksOut.Cur_Order_Profit[i];
                else Ticks_Sum_on_Day[i] = Ticks_Sum_on_Day[i - 1] + TicksOut.Cur_Order_Profit[i];

                for (int j = i + 1; j < cnt_closed_orders; j++)
                {
                    if (TicksOut.Date_on_time[j] != temp_date)
                    {
                        for (int t = j - 1; t > i; t--) { Cur_Day_Profit[t] = Cur_Day_Profit[i]; Ticks_Sum_on_Day[t] = Ticks_Sum_on_Day[i]; }
                        i = j - 1; break;
                    }

                    Cur_Day_Profit[i] += TicksOut.Cur_Order_Profit[j];
                    Ticks_Sum_on_Day[i] += TicksOut.Cur_Order_Profit[j];
                }
                if (i == cnt_of_start_last_date && cnt_of_start_last_date != (cnt_closed_orders - 1))
                {
                    for (int j = cnt_of_start_last_date+1; j < cnt_closed_orders; j++)
                    {
                        Ticks_Sum_on_Day[j] = Ticks_Sum_on_Day[cnt_of_start_last_date];
                    }
                }
            }

            //Аппроксимируем прямой
            double[] residuals = new double[cnt_closed_orders];
            double s_xy = 0.0, s_x = 0.0, s_y = 0.0, s_x2 = 0.0;
            for (int i = 0; i < cnt_closed_orders; i++)
            {
                s_x += i+1;
                s_y += TicksOut.Ticks_Sum_on_time[i];
                s_xy += TicksOut.Ticks_Sum_on_time[i] * (i + 1);
                s_x2 += (i + 1) * (i + 1);
            }
            double a = (cnt_closed_orders * s_xy - s_x * s_y) / (cnt_closed_orders * s_x2 - s_x * s_x);
            double b = (s_y - a * s_x) / (cnt_closed_orders);

            double[] Max_FALL = new double[cnt_closed_orders * cnt_closed_orders], Max_FALL_byDay = new double[cnt_closed_orders * cnt_closed_orders];
            for (int i = 0; i < cnt_closed_orders; i++)
            {
                StatInfo.residual_avg_MNK += Math.Abs((TicksOut.Ticks_Sum_on_time[i] - (a * (i + 1) + b)));
                StatInfo.residual_avg_MNM += Math.Abs((TicksOut.Ticks_Sum_on_time[i] - (a * (i + 1) + b)) * Math.Cos(Math.Atan(a)));

                if (TicksOut.flg_F_avg_6[i] == -2)
                    StatInfo.SELL_summ_slice += TicksOut.Cur_Order_Profit[i];
                if (TicksOut.flg_F_avg_6[i] == 2)
                    StatInfo.BUY_summ_slice += TicksOut.Cur_Order_Profit[i];

                for (int j = 0; j < i; j++)
                {
                    Max_FALL[i * i + j] = TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - j - 1];
                    Max_FALL_byDay[i * i + j] = Ticks_Sum_on_Day[i] - Ticks_Sum_on_Day[i - j - 1];
                }
            }
            StatInfo.MaxFALLbyOrder = Max_FALL.Min();
            if (StatInfo.MaxFALLbyOrder > -0.1) StatInfo.MaxFALLbyOrder = 1;
            StatInfo.MaxFALLbyDay = Max_FALL_byDay.Min();
            if (StatInfo.MaxFALLbyDay > -0.1) StatInfo.MaxFALLbyDay = 1;

            StatInfo.residual_avg_MNK = StatInfo.residual_avg_MNK / cnt_closed_orders;
            StatInfo.residual_avg_MNM = StatInfo.residual_avg_MNM / cnt_closed_orders;

            double Balance = 3000.0, Balance_Day = 3000.0;
            for (int i = 0; i < cnt_closed_orders; i++)
            {
                residuals[i] = Math.Abs((TicksOut.Ticks_Sum_on_time[i] - (a * (i + 1) + b)));

                if (i != 0) Balance_Day = Balance_Day + (TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - 1]) * Math.Min((0.10 * Balance_Day) / Math.Abs(StatInfo.MaxFALLbyDay), 100.0);
                else Balance_Day = Balance_Day + (TicksOut.Ticks_Sum_on_time[i]) * (0.10 * Balance_Day) / Math.Abs(StatInfo.MaxFALLbyDay);

                if (i != 0) Balance = Balance + (TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - 1]) * Math.Min((0.10 * Balance) / Math.Abs(StatInfo.MaxFALLbyOrder), 100.0);
                else Balance = Balance + (TicksOut.Ticks_Sum_on_time[i]) * (0.10 * Balance) / Math.Abs(StatInfo.MaxFALLbyOrder);

                helpFile.WriteLine((Counts_On_Open[i]) + " " + (Counts_On_Close[i]) + " " + TicksOut.Date_on_time[i]
                            + " " + TicksOut.flg_F_avg_6[i] + " " + StatInfo.MinLocalProfitInOrder[i] + " " + StatInfo.MaxLocalProfitInOrder[i]
                            + " " + StatInfo.StartSpread[i] + " " + StatInfo.CloseSpread[i] + " " + TicksOut.Cur_Order_Profit[i] + " " + TicksOut.Ticks_Sum_on_time[i]
                            + " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(Balance_Day).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0]
                            + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0] + " " + cnt_closed_orders
                            //+ " " + (a * (i + 1) + b) + " " + residuals[i] + " " + a + " " + StatInfo.residual_avg_MNK + " " + StatInfo.SELL_summ_slice + " " + StatInfo.BUY_summ_slice
                            + " " + StatInfo.AskIncremBigMassSummNegative[i] + " " + StatInfo.AskIncremBigMassSummPositive[i]
                            + " " + StatInfo.AskSpeedOpen[i] + " " + StatInfo.Ask_F_avg_3_Open[i]);
            }

            //---ПО ДНЯМ, МЕСЯЦАМ---//
            Balance = 3000.0;
            double profit_by_day = 0.0, profit_by_month = 0.0;
            for (int i = 0; i < cnt_closed_orders; i++)
            {

                if (i != 0) Balance = Balance + (TicksOut.Ticks_Sum_on_time[i] - TicksOut.Ticks_Sum_on_time[i - 1]) * Math.Min((0.10 * Balance_Day) / Math.Abs(StatInfo.MaxFALLbyDay), 100.0);
                else Balance = Balance + (TicksOut.Ticks_Sum_on_time[i]) * Math.Min((0.10 * Balance_Day) / Math.Abs(StatInfo.MaxFALLbyDay), 100.0);

                if (i != 0)
                {
                    if (TicksOut.Date_on_time[i] != TicksOut.Date_on_time[i - 1])
                    {
                        //if (i != cnt_closed_orders - 1)
                            helpFile_byDays.WriteLine((Counts_On_Close[i]).ToString() + " " + TicksOut.Date_on_time[i - 1] + " " + profit_by_day.ToString() + " " + TicksOut.Ticks_Sum_on_time[i - 1].ToString()
                                        + " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0]);

                        profit_by_day = 0.0;
                    }

                    if (TicksOut.Date_on_time[i].Split('.')[1] != TicksOut.Date_on_time[i - 1].Split('.')[1])
                    {
                        if (i != cnt_closed_orders - 1)
                            helpFile_byMonth.WriteLine((Counts_On_Close[i]).ToString() + " " + TicksOut.Date_on_time[i - 1].Split('.')[0] + "." + TicksOut.Date_on_time[i - 1].Split('.')[1]
                                        + " " + profit_by_month.ToString() + " " + TicksOut.Ticks_Sum_on_time[i - 1].ToString()
                                        + " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0]);

                        profit_by_month = 0.0;
                    }
                }

                profit_by_day += TicksOut.Cur_Order_Profit[i];
                profit_by_month += TicksOut.Cur_Order_Profit[i];

                if (i == cnt_closed_orders - 1)
                {
                    helpFile_byDays.WriteLine((Counts_On_Close[i]).ToString() + " " + TicksOut.Date_on_time[i] + " " + profit_by_day.ToString() + " " + TicksOut.Ticks_Sum_on_time[i].ToString()
                                    + " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0]);
                    helpFile_byMonth.WriteLine((Counts_On_Close[i]).ToString() + " " + TicksOut.Date_on_time[i].Split('.')[0] + "." + TicksOut.Date_on_time[i].Split('.')[1]
                                    + " " + profit_by_month.ToString() + " " + TicksOut.Ticks_Sum_on_time[i].ToString()
                                    + " " + Convert.ToString(Balance).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyOrder).Split('.')[0] + " " + Convert.ToString(StatInfo.MaxFALLbyDay).Split('.')[0]);
                }
            }

            helpFile_byMonth.Close();

            DateTime start_end = DateTime.Now;

            Console.WriteLine(" ");
            Console.WriteLine("Итог: " + (ticks_sum * 100000).ToString().Split('.')[0] + " time = " + (start_end - start_time).ToString());
            Console.WriteLine(" ");

            ResultFile.Close(); helpFile.Close(); helpFile_byDays.Close();
            OutFile.Close(); DetailResultFile.Close();
            //this.Close();
        }