奇怪的C#行为

时间:2016-05-07 22:10:36

标签: c#

我是一名业余爱好程序员 我尝试以非结构化的方式ask this question earlier(再次抱歉),现在我尝试以正确的方式询问。
我编写了以下似乎不可靠的代码 代码是这样编写的,原因有几个。我知道它很乱,但它应该仍然有用。解释为什么我这样写它会意味着我需要解释几个星期'相当广泛的工作。请接受这至少是我能想到的最糟糕的选择。在下面的示例中,我删除了重现错误所不需要的代码的所有部分 简而言之,这个项目的作用是什么:
目的是检查接收流数据的程序的大量参数组合。我模拟原始过程来测试参数组合 从表示记录的流数据的文件中读取第一数据 然后汇总数据 然后我构建一个要测试的参数列表 最后,我并行运行每个参数组合的代码。

在并行部分内部,我计算了一个名为布林带的财务指标。这是一个移动平均线,增加了+/-标准偏差。这意味着当变量bBandDelta = 0时,上面一行和下面一行应该相等。但有时候发生CandleList [slot,w] [ctr] .bollingerUp等于CandleList [slot,w] [ctr] .bollingerDown甚至当bBandDelta不是0时 因此,我不明白第277行是如何开始的。似乎有时程序无法写入CandleList [slot,w] [ctr]。但是这不可能,因为(1)我锁定列表和(2)我使用ConcurrentBag。我可以帮忙吗?

Source files are here.

代码是:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;

namespace Justfortest
{
    class tick : IComparable<tick>  //Data element to represent a tick
    {
        public string disp_name; //ticker ID
        public DateTime? trd_date; //trade date
        public TimeSpan? trdtim_1; //trade time
        public decimal trdprc_1; //price
        public int? trdvol_1; //tick volume

        public int CompareTo(tick other)
        {
            if (this.trdprc_1 == other.trdprc_1)
            {
                return other.trdprc_1.CompareTo(this.trdprc_1); //Return the later item

            }
            return this.trdprc_1.CompareTo(other.trdprc_1); //Return the earlier item
        }
    }

    class candle : IComparable<candle>  //Data element to represent a candle and all chart data calculated on candle level
    {
        public int id = 0;
        public DateTime? openDate;
        public TimeSpan? openTime;
        public DateTime? closeDate;
        public TimeSpan? closeTime;
        public decimal open = 0;
        public decimal high = 0;
        public decimal low = 0;
        public decimal close = 0;
        public int? volume = 0;
        public decimal totalPrice = 0;
        public decimal bollingerUp = 0;  //Bollinger upper line
        public decimal bollingerDown = 0;  //Bollinger below line

        public int CompareTo(candle other)
        {
            if (totalPrice == other.totalPrice)
            {
                return other.totalPrice.CompareTo(totalPrice); //Return the later item
            }
            return totalPrice.CompareTo(other.totalPrice); //Return the earlier item
        }
    }

    class param : IComparable<param>  //Data element represent a trade event signal
    {
        public int par1;
        public int bollPar;
        public int par2;
        public int par3;
        public int par4;
        public int par5;
        public int par6;
        public decimal par7;
        public decimal par8;
        public decimal par9;
        public decimal par10;

        int IComparable<param>.CompareTo(param other)
        {
            throw new NotImplementedException();
        }
    }
    class programCLass
    {
        void myProgram()
        {
            Console.WriteLine("Hello");
            Console.WindowWidth = 180;
            string[] sources = new string[]
            {
                @"C:\test\source\sourceW1.csv",
                @"C:\test\source\sourceW2.csv",
            };
            List<candle>[] sourceCandleList = new List<candle>[sources.Count()];
            List<param> paramList = new List<param>(10000000);
            var csvAnalyzer = new StringBuilder();

            {
                List<tick>[] updatelist = new List<tick>[sources.Count()];
                Console.WriteLine("START LOAD");
                for (var i = 0; i < sources.Count(); i++)
                {
                    var file = sources[i];
                    updatelist[i] = new List<tick>();
                    // ---------- Read CSV file ----------
                    var reader = new StreamReader(File.OpenRead(file));
                    while (!reader.EndOfStream)
                    {
                        var line = reader.ReadLine();
                        var values = line.Split(',');

                        tick update = new tick();
                        update.disp_name = values[0].ToString();
                        update.trd_date = Convert.ToDateTime(values[1]);
                        update.trdtim_1 = TimeSpan.Parse(values[2]);
                        update.trdprc_1 = Convert.ToDecimal(values[3]);
                        update.trdvol_1 = Convert.ToInt32(values[4]);
                        updatelist[i].Add(update);
                    }
                    Console.WriteLine(i);
                }
                Console.WriteLine("END LOAD"); // All files are in the memory
                // Aggreagate
                Console.WriteLine("AGGREGATE START");
                int tickAggr = 500;

                for (var w = 0; w < sources.Count(); w++)
                {
                    sourceCandleList[w] = new List<candle>();
                    List<tick> FuturesList = new List<tick>();
                    foreach (var update in updatelist[w])
                    {
                        tick t = new tick();
                        t.disp_name = update.disp_name.ToString();
                        t.trd_date = update.trd_date;
                        t.trdtim_1 = update.trdtim_1;
                        t.trdprc_1 = Convert.ToDecimal(update.trdprc_1);
                        t.trdvol_1 = update.trdvol_1;

                        // Add new tick to the list
                        FuturesList.Add(t);
                        if (FuturesList.Count == Math.Truncate(FuturesList.Count / (decimal)tickAggr) * tickAggr)
                        {
                            candle c = new candle();
                            c.openDate = FuturesList[FuturesList.Count - tickAggr].trd_date;
                            c.openTime = FuturesList[FuturesList.Count - tickAggr].trdtim_1;
                            c.closeDate = FuturesList.Last().trd_date;
                            c.closeTime = FuturesList.Last().trdtim_1;
                            c.open = FuturesList[FuturesList.Count - tickAggr].trdprc_1;
                            c.high = FuturesList.GetRange(FuturesList.Count - tickAggr, tickAggr).Max().trdprc_1;
                            c.low = FuturesList.GetRange(FuturesList.Count - tickAggr, tickAggr).Min().trdprc_1;
                            c.close = FuturesList.Last().trdprc_1;
                            c.volume = FuturesList.GetRange(FuturesList.Count - tickAggr, tickAggr).Sum(tick => tick.trdvol_1);
                            c.totalPrice = (c.open + c.high + c.low + c.close) / 4;
                            sourceCandleList[w].Add(c);
                            if (sourceCandleList[w].Count == 1)
                            {
                                c.id = 0;
                            }
                            else
                            {
                                c.id = sourceCandleList[w][sourceCandleList[w].Count - 2].id + 1;
                            }

                        }
                    }
                    FuturesList.Clear();
                }
                Console.WriteLine("AGGREGATE END");
                for (var i = 0; i < sources.Count(); i++)
                {
                    updatelist[i].Clear();
                }
            }
            Console.WriteLine("BUILD PARAMLIST");
            for (int par1 = 8; par1 <= 20; par1 += 4) // parameter deployed
            {
                for (int bollPar = 10; bollPar <= 25; bollPar += 5) // parameter deployed
                {
                    for (int par2 = 6; par2 <= 18; par2 += 4) // parameter deployed
                    {
                        for (int par3 = 14; par3 <= 20; par3 += 3) // parameter deployed
                        {
                            for (int par4 = 10; par4 <= 20; par4 += 5) // parameter deployed
                            {
                                for (int par5 = 4; par5 <= 10; par5 += 2) // parameter deployed
                                {
                                    for (int par6 = 5; par6 <= 30; par6 += 5)
                                    {
                                        for (decimal par7 = 1.0005M; par7 <= 1.002M; par7 += 0.0005M)
                                        {
                                            for (decimal par8 = 1.002M; par8 <= 1.0048M; par8 += 0.0007M)
                                            {
                                                for (decimal par9 = 0.2M; par9 <= 0.5M; par9 += 0.1M)
                                                {
                                                    for (decimal par10 = 0.5M; par10 <= 2; par10 += 0.5M)
                                                    {
                                                        param p = new param();
                                                        p.par1 = par1;
                                                        p.bollPar = bollPar;
                                                        p.par2 = par2;
                                                        p.par3 = par3;
                                                        p.par4 = par4;
                                                        p.par5 = par5;
                                                        p.par6 = par6;
                                                        p.par7 = par7;
                                                        p.par8 = par8;
                                                        p.par9 = par9;
                                                        p.par10 = par10;
                                                        paramList.Add(p);
                                                    }

                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            Console.WriteLine("END BUILD PARAMLIST, scenarios to test:{0}", paramList.Count);
            var sourceCount = sources.Count();
            sources = null;

            Console.WriteLine("Start building pools");
            int maxThreads = 64;
            ConcurrentBag<int> pool = new ConcurrentBag<int>();
            List<candle>[,] CandleList = new List<candle>[maxThreads, sourceCount];
            for (int i = 0; i <= maxThreads - 1; i++)
            {
                pool.Add(i);
                for (int w = 0; w <= sourceCount - 1; w++)
                {
                    CandleList[i, w] = sourceCandleList[w].ConvertAll(p => p);
                }
            }

            Console.WriteLine("End building pools");

            int pItemsProcessed = 0;
            Parallel.ForEach(paramList,
                new ParallelOptions { MaxDegreeOfParallelism = maxThreads },
                p =>
                {
                    int slot = 1000;
                    while (!pool.TryTake(out slot));

                    var bollPar = p.bollPar;

                    decimal bollingerMiddle = 0;
                    double bBandDeltaX = 0;

                    for (var w = 0; w < sourceCount; w++)
                    {
                        lock (CandleList[slot, w])
                        {
                            for (var ctr = 0; ctr < CandleList[slot, w].Count; ctr++)
                            {
                                CandleList[slot, w][ctr].bollingerUp = 0;  //Bollinger upper line
                                CandleList[slot, w][ctr].bollingerDown = 0;  //Bollinger below line
                                //Bollinger Bands Calculation
                                if (ctr + 1 >= bollPar)
                                {
                                    bollingerMiddle = 0;
                                    bBandDeltaX = 0;
                                    for (int i = 0; i <= bollPar - 1; i++)
                                    {
                                        bollingerMiddle = bollingerMiddle + CandleList[slot, w][ctr - i].totalPrice;
                                    }
                                    bollingerMiddle = bollingerMiddle / bollPar; //average

                                    for (int i = 0; i <= bollPar - 1; i++)
                                    {
                                        bBandDeltaX = bBandDeltaX + (double)Math.Pow(System.Convert.ToDouble(CandleList[slot, w][ctr - i].totalPrice) - System.Convert.ToDouble(bollingerMiddle), 2);
                                    }
                                    bBandDeltaX = bBandDeltaX / bollPar;
                                    decimal bBandDelta = (decimal)Math.Sqrt(System.Convert.ToDouble(bBandDeltaX));
                                    CandleList[slot, w][ctr].bollingerUp = bollingerMiddle + 2 * bBandDelta;
                                    CandleList[slot, w][ctr].bollingerDown = bollingerMiddle - 2 * bBandDelta;
                                    if (CandleList[slot, w][ctr].bollingerUp == CandleList[slot, w][ctr].bollingerDown)
                                    {
                                        Console.WriteLine("?! Items processed=" + pItemsProcessed + " bollPar=" + bollPar + " ctr=" + ctr + " bollingerMiddle=" + bollingerMiddle + " bBandDeltaX=" + bBandDeltaX + " bBandDelta=" + bBandDelta + " bollingerUp=" + CandleList[slot, w][ctr].bollingerUp + " bollingerDown=" + CandleList[slot, w][ctr].bollingerDown);
                                    }
                                }
                                // REMOVED Further calculations happen here
                            }
                            // REMOVED Some evaluations happen here
                        }
                    }
                    // REMOVED Some more evaluations happen here
                    Interlocked.Increment(ref pItemsProcessed);
                    pool.Add(slot);
                });
        }
        static void Main(string[] args)
        {
            var P = new programCLass();
            P.myProgram();
        }
    }
}

0 个答案:

没有答案