Example #1
0
        protected bool signalBuy(TA.PriceVolumeSeries series, int idx, double diff, int days)
        {
            bool res = false;

            if (idx >= days)
            {
                TA.Candle candleCur  = (TA.Candle)series.Data[idx];
                TA.Candle candlePrev = (TA.Candle)series.Data[idx - days];
                res = (candleCur.high * diff > candlePrev.high);
            }

            return(res);
        }
Example #2
0
        /// <summary>
        /// Example
        /// Date,Open,High,Low,Close,Volume,Adj Close
        /// 2009-09-25,74.04,74.39,73.37,73.80,3470700,73.80
        /// </summary>
        static bool strToCandle(string str, out TA.Candle candle)
        {
            candle = null;
            int  start  = 0;
            int  end    = 0;
            bool result = true;

            // skip date
            end = str.IndexOf(',', start);
            if (end <= 1)             // no date ?
            {
                System.Console.WriteLine("242:Failed to parse candle data " + str);
                return(false);
            }
            start = end + 1;

            double open, close, max, min;
            int    volume;
            string strVal;

            // open
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start))             // no open ?
            {
                System.Console.WriteLine("255:Failed to parse candle data " + str);
                return(false);
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out open);
            if (!result)
            {
                System.Console.WriteLine("262:Failed to parse candle data " + str + "!" + strVal);
                return(false);
            }
            start = end + 1;

            // max
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start))             // no max ?
            {
                System.Console.WriteLine("271:Failed to parse candle data " + str);
                return(false);
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out max);
            if (!result)
            {
                System.Console.WriteLine("278:Failed to parse candle data " + str + "!" + strVal);
                return(false);
            }
            start = end + 1;

            // min
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start))             // no min ?
            {
                System.Console.WriteLine("287:Failed to parse candle data " + str);
                return(false);
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out min);
            if (!result)
            {
                System.Console.WriteLine("294:Failed to parse candle data " + str + "!" + strVal);
                return(false);
            }
            start = end + 1;


            // close
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start))             // no close ?
            {
                System.Console.WriteLine("304:Failed to parse candle data " + str);
                return(false);
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out close);
            if (!result)
            {
                System.Console.WriteLine("311:Failed to parse candle data " + str + "!" + strVal);
                return(false);
            }
            start = end + 1;

            // volume
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start))             // no open ?
            {
                System.Console.WriteLine("320:Failed to parse candle data " + str);
                return(false);
            }
            strVal = str.Substring(start, end - start);
            result = Int32.TryParse(strVal, out volume);
            if (!result)
            {
                System.Console.WriteLine("327:Failed to parse candle data " + str + "!" + strVal);
                return(false);
            }
            start = end + 1;

            candle = new TA.Candle(open, close, min, max, volume);

            return(true);
        }
Example #3
0
        /// <summary>
        /// Example
        /// Date,Open,High,Low,Close,Volume,Adj Close
        /// 2009-09-25,74.04,74.39,73.37,73.80,3470700,73.80
        /// </summary>
        static bool strToCandle(string str, out TA.Candle candle)
        {
            candle = null;
            int start = 0;
            int end = 0;
            bool result = true;

            // skip date
            end = str.IndexOf(',', start);
            if (end <= 1) // no date ?
            {
                System.Console.WriteLine("242:Failed to parse candle data " + str);
                return false;
            }
            start = end + 1;

            double open, close, max, min;
            int volume;
            string strVal;

            // open
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start)) // no open ?
            {
                System.Console.WriteLine("255:Failed to parse candle data " + str);
                return false;
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out open);
            if (!result)
            {
                System.Console.WriteLine("262:Failed to parse candle data " + str + "!" + strVal);
                return false;
            }
            start = end + 1;

            // max
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start)) // no max ?
            {
                System.Console.WriteLine("271:Failed to parse candle data " + str);
                return false;
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out max);
            if (!result)
            {
                System.Console.WriteLine("278:Failed to parse candle data " + str + "!" + strVal);
                return false;
            }
            start = end + 1;

            // min
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start)) // no min ?
            {
                System.Console.WriteLine("287:Failed to parse candle data " + str);
                return false;
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out min);
            if (!result)
            {
                System.Console.WriteLine("294:Failed to parse candle data " + str + "!" + strVal);
                return false;
            }
            start = end + 1;

            // close
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start)) // no close ?
            {
                System.Console.WriteLine("304:Failed to parse candle data " + str);
                return false;
            }
            strVal = str.Substring(start, end - start);
            result = Double.TryParse(strVal, out close);
            if (!result)
            {
                System.Console.WriteLine("311:Failed to parse candle data " + str + "!" + strVal);
                return false;
            }
            start = end + 1;

            // volume
            end = str.IndexOf(',', start);
            if ((end <= 1) || (end <= start)) // no open ?
            {
                System.Console.WriteLine("320:Failed to parse candle data " + str);
                return false;
            }
            strVal = str.Substring(start, end - start);
            result = Int32.TryParse(strVal, out volume);
            if (!result)
            {
                System.Console.WriteLine("327:Failed to parse candle data " + str + "!" + strVal);
                return false;
            }
            start = end + 1;

            candle = new TA.Candle(open, close, min, max, volume);

            return true;
        }
Example #4
0
        protected void signalPerformance(TA.PriceVolumeSeries series, double stopLoss, int maxDays, int idx, bool isBuy, double diffSell, double diffBuy, int sigDays, out Trade trade)
        {
            trade       = new Trade();
            trade.isBuy = isBuy;
            trade.idx   = idx;

            int count = series.Data.Count;

            TA.Candle candle = (TA.Candle)series.Data[idx];
            trade.candleEntry = candle;
            double entryPoint = candle.close;
            double close      = entryPoint;
            double bestClose  = close;
            bool   isSell     = !isBuy;
            int    i;
            int    days = 0;

            for (i = idx + 1; i < count; i++)
            {
                candle = (TA.Candle)series.Data[i];
                days++;
                if (signalStop(isBuy, stopLoss, maxDays, entryPoint, close, candle.close, days, bestClose))
                {
                    break;
                }
                if (isBuy && signalSell(series, idx, diffSell, sigDays))
                {
                    break;
                }
                if (isSell && signalBuy(series, idx, diffSell, sigDays))
                {
                    break;
                }
                close = candle.close;
                if (isBuy)
                {
                    if (bestClose < close)
                    {
                        bestClose = close;
                    }
                }
                else
                {
                    if (bestClose > close)
                    {
                        bestClose = close;
                    }
                }
            }
            double delta;

            delta = entryPoint - candle.close;
            if (isBuy)
            {
                delta = -delta;
            }

            double p = delta / entryPoint;

            trade.candleExit = candle;
            trade.entry      = entryPoint;
            trade.exit       = candle.close;
            trade.p          = p;
            trade.days       = days;
        }
Example #5
0
        protected void signalPerformanceOptimization(TA.PriceVolumeSeries series, double[] data, int windowSize,
                                                     double stopLoss,
                                                     int maxDays, double diffSell, double diffBuy, int days,
                                                     System.Collections.Generic.List <TradeSession> bestBlocks)
        {
            Trade trade;

            System.Collections.Generic.List <Trade> trades = new System.Collections.Generic.List <Trade>(10);
            int i = 0;

            while (i < (data.Length - 1))
            {
                int       idx    = i + windowSize;
                TA.Candle candle = (TA.Candle)series.Data[idx];
                double    p;
                if (signalSell(series, idx, diffSell, days))
                {
                    signalPerformance(series, stopLoss, maxDays, idx, false, diffSell, diffBuy, days, out trade);
                    if (trades.Count < 200)
                    {
                        trades.Add(trade);
                    }
                    else
                    {
                        break;
                    }
                    i += Math.Max(1, trade.days);
                    //                        System.Console.Write("\tSell at "+idx+" entry="+trade.entry+" exit="+trade.exit+" "+candle.ToString());
                    //                        System.Console.WriteLine(" p="+trade.p+", days="+trade.days+", exit at "+(idx+trade.days));
                }
                else if (signalBuy(series, idx, diffBuy, days))                  // buy condition and trigger
                {
                    signalPerformance(series, stopLoss, maxDays, idx, true, diffSell, diffBuy, days, out trade);
                    if (trades.Count < 200)
                    {
                        trades.Add(trade);
                    }
                    else
                    {
                        break;
                    }
                    i += Math.Max(1, trade.days);
                    //                        System.Console.Write("\tBuy at "+idx+" entry="+trade.entry+" exit="+trade.exit+" "+candle.ToString());
                    //                        System.Console.WriteLine(" p="+trade.p+", days="+trade.days+", exit at "+(idx+trade.days));
                }
                else
                {
                    i++;
                }
            }

            double pTotal;
            int    daysTotal;
            int    hits;
            double maxDrawDown;

            signalPerformanceGetTrades(trades, out daysTotal, out hits, out pTotal, out maxDrawDown);
            int misses = trades.Count - hits;

            if ((pTotal > 1.1) && (trades.Count > 5) && (bestBlocks.Count < 1000))
            {
                TradeSession ts = new TradeSession();
                ts.trades      = trades;
                ts.maxDays     = maxDays;
                ts.p           = pTotal;
                ts.days        = daysTotal;
                ts.hits        = hits;
                ts.stopLoss    = stopLoss;
                ts.sellSignal  = diffSell;
                ts.buySignal   = diffBuy;
                ts.maxDays     = maxDays;
                ts.maxDrawDown = maxDrawDown;
                bestBlocks.Add(ts);
                System.Console.Write("+");
                //                System.Console.WriteLine("p="+pTotal);
                //                signalPerformancePrintTrades(trades);
            }
            if ((pTotal > 2) && (trades.Count > 5) && (bestBlocks.Count > 1000))
            {
                System.Console.Write("-");
            }
            //            System.Console.Write("1");
        }