예제 #1
0
        public void ComputeStrategy2(object selectedItem)
        {
            var candlesCount = Candles.Count;

            double[] maxes100 = new double[101];
            Parallel.For(1, 100, paramALength =>
            {
                var maxes = new List <double>(candlesCount)
                {
                    Candles.First().Close
                };
                var kon = candlesCount - 1;
                var localparamALength = paramALength;
                for (var i = 1; i < kon; i++)
                {
                    maxes.Add(GetCandlesRange(i, localparamALength).Min(candle => candle.Close));    //TODO: Change to High
                }
                maxes100[localparamALength] = maxes[1000];
            });
            maxes100[0] = 1;
        }
예제 #2
0
        public void ComputeStrategy(object selectedItem)
        {
            string filename     = selectedItem + "." + ResultFileExtension;
            var    bestReturn   = -120.0;
            var    candlesCount = Candles.Count;
            //var bestCalmar = 0.0;
            //var bestMa = 0;
            //var bestparamAVolLength = 0;
            //var bestparamADuration = 0;
            //var bestparamABuffer = 0.0;
            //var bestparamAVolThreshold = 0.0;
            //var bestparamAsl = 0.0;
            const double spread = 0.00016;

            using (var writer = new StreamWriter(filename, false))
            {
                writer.WriteLine("results");
            }
            //paramALength: 9 paramAVolLength: 26 paramABuffer: -0.00416 paramAVolThreshold: 100 paramADuration: 16 paramASL: 0.00576 Calmar: 2.6312
            //const int paramALength=9;
            for (var paramALength = 9; paramALength <= 19; paramALength += 1)//liczba swiec wstecz do obliczenia maksimum
            {
                var maxes = new List <double>(candlesCount)
                {
                    Candles.First().Close
                };
                var kon = candlesCount - 1;
                for (var i = 1; i < kon; i++)
                {
                    maxes.Add(GetCandlesRange(i, paramALength).Max(candle => candle.Close));//TODO: Change to High
                }
                const int paramAVolLength = 26;
                //for (int paramAVolLength = 26; paramAVolLength <= 26/*38*/; paramAVolLength++)
                {
                    //CreateStatus("paramALength: {0}", paramALength);
                    //AppendStatus("  paramAVolLength: {0}\r\n", paramAVolLength);
                    var volAverages = new List <double>(candlesCount)
                    {
                        0
                    };
                    for (var i = 1; i < kon; i++)
                    {
                        volAverages.Add(GetCandlesRange(i, paramALength).Average(candle => candle.Volume) - Candles[i].Volume);
                    }
                    //const int paramADuration = 16;
                    for (var paramADuration = 6; paramADuration <= 16; paramADuration++)//liczba kroków wprzód do zamkniecia pozycji
                    {
                        //for (var paramAVolThreshold = -100; paramAVolThreshold <= 100; paramAVolThreshold += 100)//próg dla sredniego wolumenu
                        const int paramAVolThreshold = 100;
                        {
                            for (var paramABuffer = -spread * 28; paramABuffer <= spread; paramABuffer += spread)
                            //dla kwadrantu a i b szukamy ujemnych wartości, dla kwadrantów c i d dodatnich wartości bufora
                            //const double paramABuffer = -0.00416;
                            {
                                //const double paramAsl = 0.00576;
                                for (var paramAsl = spread * 35; paramAsl <= spread * 48; paramAsl += spread)//Stop Loss minimalnie może być równy 8*spread 0.00384%
                                {
                                    var sumRa        = new List <double>(candlesCount);
                                    var returnValues = new List <double>(candlesCount);
                                    var drawdowns    = new List <double>(candlesCount);
                                    var candlesBegin = Math.Max(paramAVolLength, paramALength) + 1;
                                    //var positionCount = 0; //liczba otwieranych pozycji
                                    //var stopLossCount = 0; //liczba stop lossów
                                    var lastCandle = kon - Math.Max(paramALength, paramAVolLength) - paramADuration;
                                    for (int i = 0; i < candlesBegin; i++)
                                    {
                                        sumRa.Add(0);
                                        returnValues.Add(0);
                                    }
                                    for (int i = candlesBegin; i < lastCandle; i++)
                                    {
                                        returnValues.Add(0);
                                        if (maxes[i] + paramABuffer < Candles[i].Close && volAverages[i] < paramAVolThreshold)
                                        {
                                            returnValues[i] = Candles[i + paramADuration].Close - Candles[i + 1].Open - spread;
                                            //zysk z i-tej pozycji long zamykanej na zamknięciu po paramADuration kroku
                                            var minLow = Candles.GetRange(i + 1, paramADuration - 1).Min(candle => candle.Low);
                                            if ((-Candles[i + 1].Open + minLow) < -paramAsl)
                                            {
                                                returnValues[i] = -paramAsl;
                                                //stopLossCount++;
                                            }
                                            //positionCount++;
                                        }
                                        sumRa.Add(sumRa[i - 1] + returnValues[i]);  //krzywa narastania kapitału
                                    }


                                    var recordReturn   = 0.0; //rekord zysku
                                    var recordDrawdown = 0.0; //rekord obsuniecia
                                    for (int j = 0; j < lastCandle; j++)
                                    {
                                        if (sumRa[j] > recordReturn)
                                        {
                                            recordReturn = sumRa[j];
                                        }
                                        drawdowns.Add(sumRa[j] - recordReturn);//róznica pomiedzy bieżącą wartoscia kapitału skumulowanego a dotychczasowym rekordem
                                        if (drawdowns[j] < recordDrawdown)
                                        {
                                            recordDrawdown = drawdowns[j];  //obsuniecie maksymalne
                                        }
                                    }

                                    //wyniki końcowe
                                    var sumReturn = sumRa[lastCandle - 1];
                                    //var calmar = -sumReturn / recordDrawdown;  //wskaznik Calmara
                                    if (bestReturn < sumReturn)
                                    {
                                        bestReturn = sumReturn; //bestCalmar = calmar;
                                        //bestMa = paramALength;
                                        //bestparamAVolLength = paramAVolLength;
                                        //bestparamADuration = paramADuration;
                                        //bestparamABuffer = paramABuffer;
                                        //bestparamAVolThreshold = paramAVolThreshold;
                                        //bestparamAsl = paramAsl;
                                        //using (var writer = new StreamWriter(filename, true))
                                        //{
                                        //    writer.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}",
                                        //            getDouble(sumReturn), getDouble(paramALength),
                                        //            getDouble(paramAVolLength), getDouble(paramADuration), getDouble(paramAVolThreshold),
                                        //            getDouble(paramABuffer), getDouble(paramAsl), getDouble(calmar));
                                        //}
                                        //CreateStatus("  \r\nzysk: {0}", sumReturn);
                                        //AppendStatus("  paramALength: {0}", paramALength);
                                        //AppendStatus("  paramAVolLength: {0}", paramAVolLength);
                                        //AppendStatus("  paramADuration: {0}", paramADuration);
                                        //AppendStatus("  paramAVolThreshold: {0}", paramAVolThreshold);
                                        //AppendStatus("  paramABuffer: {0}", paramABuffer);
                                        //AppendStatus("  paramASL: {0}", paramAsl);
                                        //AppendStatus("  Calmar: {0}", calmar);
                                        //Application.DoEvents();
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //CreateStatus("zysk: {0}", 0);
            //AppendStatus("  paramALength: {0}", bestMa);
            //AppendStatus("  paramAVolLength: {0}", bestparamAVolLength);
            //AppendStatus("  paramABuffer: {0}", bestparamABuffer);
            //AppendStatus("  paramAVolThreshold: {0}", bestparamAVolThreshold);
            //AppendStatus("  paramADuration: {0}", bestparamADuration);
            //AppendStatus("  paramASL: {0}", bestparamAsl);
            //AppendStatus("  Calmar: {0}", bestCalmar);
        }
예제 #3
0
파일: S1a.cs 프로젝트: piotrbla/tewi-wizut
        public void ComputeStrategy(object selectedItem)
        {
            string filename     = selectedItem + "." + ResultFileExtension;
            var    bestReturn   = -120.0;
            var    candlesCount = Candles.Count;
            var    bestCalmar   = 0.0;
            var    bestMa       = 0;

            using (var writer = new StreamWriter(filename, false))
            {
                writer.WriteLine("results");
            }
            //paramALength: 9 paramAVolLength: 26 paramABuffer: -0.00416 paramAVolThreshold: 100 paramADuration: 16 paramASL: 0.00576 Calmar: 2.6312
            //const int paramALength=24;
            for (var paramALength = 10; paramALength <= 1000; paramALength += 1)//liczba swiec wstecz do obliczenia maksimum
            {
                var means = new List <double>(candlesCount)
                {
                    Candles.First().Close
                };
                var kon = candlesCount - 1;
                for (var i = 1; i < kon; i++)
                {
                    means.Add(GetCandlesRange(i, paramALength).Average(candle => candle.Close));
                }
                //CreateStatus("paramALength: {0}", paramALength);
                //AppendStatus("  paramAVolLength: {0}\r\n", paramAVolLength);
                var sumRa         = new List <double>(candlesCount);
                var returnValues  = new List <double>(candlesCount);
                var drawdowns     = new List <double>(candlesCount);
                var candlesBegin  = paramALength + 1;
                var positionCount = 0; //liczba otwieranych pozycji
                //var stopLossCount = 0; //liczba stop lossów
                var lastCandle = kon;
                for (int i = 0; i < candlesBegin; i++)
                {
                    sumRa.Add(0);
                    returnValues.Add(0);
                }
                for (int i = candlesBegin; i < lastCandle; i++)
                {
                    returnValues.Add(0);
                    if (means[i] < Candles[i].Close)
                    {
                        returnValues[i] = Candles[i + 1].Close - Candles[i + 1].Open;
                        //zysk z i-tej pozycji long zamykanej na zamknięciu po 1 kroku
                        positionCount++;
                    }
                    sumRa.Add(sumRa[i - 1] + returnValues[i]);  //krzywa narastania kapitału
                }


                var recordReturn   = 0.0; //rekord zysku
                var recordDrawdown = 0.0; //rekord obsuniecia
                for (int j = 0; j < lastCandle; j++)
                {
                    if (sumRa[j] > recordReturn)
                    {
                        recordReturn = sumRa[j];
                    }
                    drawdowns.Add(sumRa[j] - recordReturn);//róznica pomiedzy bieżącą wartoscia kapitału skumulowanego a dotychczasowym rekordem
                    if (drawdowns[j] < recordDrawdown)
                    {
                        recordDrawdown = drawdowns[j];  //obsuniecie maksymalne
                    }
                }

                //wyniki końcowe
                var sumReturn = sumRa[lastCandle - 1];
                var calmar    = -sumReturn / recordDrawdown; //wskaznik Calmara
                if (bestReturn < sumReturn)
                {
                    bestReturn = sumReturn; bestCalmar = calmar;
                    bestMa     = paramALength;
                    using (var writer = new StreamWriter(filename, true))
                    {
                        writer.WriteLine("{0}\t{1}\t{2}",
                                         GetDouble(sumReturn), GetDouble(paramALength),
                                         GetDouble(calmar));
                    }
                }
            }
            using (var writer = new StreamWriter(filename, true))
            {
                writer.WriteLine("{0}\t{1}\t{2}",
                                 GetDouble(bestReturn), GetDouble(bestMa),
                                 GetDouble(bestCalmar));
            }
        }
예제 #4
0
        public void ComputeStrategy(object selectedItem)
        {
            string filename     = selectedItem + "." + ResultFileExtension;
            var    bestReturn   = -120.0;
            var    candlesCount = Candles.Count;
            var    bestCalmar   = 0.0;
            var    bestMa       = 0;
            var    bestLa       = 0;

            using (var writer = new StreamWriter(filename, false))
            {
                writer.WriteLine("results");
            }
            Parallel.For(5, 100, paramALength =>
            {
                var localparamALength = paramALength;
                var means             = new List <double>(candlesCount)
                {
                    Candles.First().Close
                };
                var kon = candlesCount - 1;
                for (var i = 1; i < kon; i++)
                {
                    means.Add(GetCandlesRange(i, localparamALength).Average(candle => candle.Close));
                }
                //CreateStatus("paramALength: {0}", paramALength);
                //AppendStatus("  paramAVolLength: {0}\r\n", paramAVolLength);
                var sumRa         = new List <double>(candlesCount);
                var returnValues  = new List <double>(candlesCount);
                var drawdowns     = new List <double>(candlesCount);
                var candlesBegin  = localparamALength + 1;
                var positionCount = 0; //liczba otwieranych pozycji
                //var stopLossCount = 0; //liczba stop lossów
                var lastCandle = kon;
                for (int i = 0; i < candlesBegin; i++)
                {
                    sumRa.Add(0);
                    returnValues.Add(0);
                }
                for (int i = candlesBegin; i < lastCandle; i++)
                {
                    returnValues.Add(0);
                    if (ComputePredicate(means[i], Candles[i].Close))
                    {
                        returnValues[i] = ComputeProfit(i);
                        //zysk z i-tej pozycji long zamykanej na zamknięciu po 1 kroku
                        positionCount++;
                    }
                    sumRa.Add(sumRa[i - 1] + returnValues[i]); //krzywa narastania kapitału
                }


                var recordReturn   = 0.0; //rekord zysku
                var recordDrawdown = 0.0; //rekord obsuniecia
                for (int j = 0; j < lastCandle; j++)
                {
                    if (sumRa[j] > recordReturn)
                    {
                        recordReturn = sumRa[j];
                    }
                    drawdowns.Add(sumRa[j] - recordReturn);
                    //róznica pomiedzy bieżącą wartoscia kapitału skumulowanego a dotychczasowym rekordem
                    if (drawdowns[j] < recordDrawdown)
                    {
                        recordDrawdown = drawdowns[j]; //obsuniecie maksymalne
                    }
                }

                //wyniki końcowe
                var sumReturn = sumRa[lastCandle - 1];
                var calmar    = -sumReturn / recordDrawdown; //wskaznik Calmara
                if (bestReturn < sumReturn)
                {
                    bestReturn = sumReturn;
                    bestCalmar = calmar;
                    bestMa     = localparamALength;
                    bestLa     = positionCount;
                    using (var writer = new StreamWriter(filename + "_" + localparamALength, true))
                    {
                        writer.WriteLine("{0}\t{1}\t{2}",
                                         GetDouble(sumReturn), GetDouble(localparamALength),
                                         GetDouble(calmar));
                    }
                }
            });
            using (var writer = new StreamWriter(ResultFilename, false))
            {
                writer.WriteLine("{0}\t{1}\t{2}\t{3}",
                                 GetDouble(bestReturn), GetDouble(bestCalmar), GetDouble(bestMa), GetDouble(bestLa));
            }
        }