Exemplo n.º 1
0
        //public List<CrossData> Getcrossings_Linq(List<SmaData> AllBuys, List<SmaData> AllSells)
        //{



        //    var crossList = new List<CrossData>();

        //    while (AllBuys.Count() > 0 || AllSells.Count() > 0)
        //    {

        //        if (AllBuys.Count() == 0)
        //        {
        //            var tempSingleSell = AllSells.First();
        //            var tempSingleSellData = new CrossData
        //            {
        //                Action = "sell",
        //                dt = tempSingleSell.Time,
        //                CrossingPrice = tempSingleSell.ActualPrice,
        //                smaValue = tempSingleSell.SmaValue
        //            };
        //            crossList.Add(tempSingleSellData);

        //            break;
        //        }

        //        if (AllSells.Count() == 0)
        //        {
        //            var tempSingleBuy = AllBuys.First();
        //            var tempSingleBuyData = new CrossData
        //            {
        //                Action = "buy",
        //                dt = tempSingleBuy.Time,
        //                CrossingPrice = tempSingleBuy.ActualPrice,
        //                smaValue = tempSingleBuy.SmaValue
        //            };
        //            crossList.Add(tempSingleBuyData);

        //            break;
        //        }



        //        var curBuy = AllBuys.First();
        //        var tempBuyData = new CrossData
        //        {
        //            Action = "buy",
        //            dt = curBuy.Time,
        //            CrossingPrice = curBuy.ActualPrice,
        //            smaValue = curBuy.SmaValue
        //        };
        //        crossList.Add(tempBuyData);


        //        var curSell = AllSells.First();
        //        var tempSellData = new CrossData
        //        {
        //            Action = "sell",
        //            dt = curSell.Time,
        //            CrossingPrice = curSell.ActualPrice,
        //            smaValue = curSell.SmaValue
        //        };
        //        crossList.Add(tempSellData);



        //        AllBuys = AllBuys.Where((d) => d.Time > curSell.Time).ToList();
        //        if (AllBuys.Count() > 0)
        //        {
        //            AllSells = AllSells.Where((d) => d.Time > AllBuys.First().Time).ToList();
        //        }
        //        else
        //        {
        //            break;
        //        }

        //    }



        //    //lock (cwWriteLock)
        //    //{
        //    //    Console.WriteLine("\t\t" + simStartDate.ToString() + "\t" + simEndDate.ToString() + "(" + crossList.Count() + ")\n");
        //    //}


        //    if (crossList.Count() > 0)
        //    {
        //        if (crossList.First().Action == "buy")
        //        {
        //            crossList.RemoveAt(0);
        //        }
        //    }


        //    return crossList;

        //}



        public List <CrossData> Getcrossings_Linq(IEnumerable <SmaData> macdDtPts, IEnumerable <SmaData> signalDtPts, DateTime simStartDate, DateTime simEndDate)
        {
            //int L_SIGNAL_LEN = smaOfSmaLen;// 2;//5;//10;
            //const int S_SIGNAL_LEN = 5;

            var strt = macdDtPts.First().Time;
            var end  = macdDtPts.Last().Time;

            var sigstrt = signalDtPts.First().Time;
            var sigend  = signalDtPts.Last().Time;

            var macdptsCount   = macdDtPts.Count();
            var signalPtCounts = signalDtPts.Count();

            //Console.WriteLine("\t\t" + strt.ToString() + "\t" + end.ToString() + "\n");

            //Console.WriteLine(smaDtPts.Count());
            ///macdDtPts = macdDtPts.Where(a => a.Time >= simStartDate && a.Time < simEndDate);
            //Console.WriteLine(smaDtPts.Count());



            //var bigSmaOfMacd = signalDtPts;//macdDtPts.Select(d => d.SmaValue).ToList().SMA(L_SIGNAL_LEN);
            //var smallSmaOfMacd = smaDtPts.Select(d => d.diff).ToList().SMA(S_SIGNAL_LEN);


            var crossList = new List <CrossData>();



            var allBuys = macdDtPts.Where((d, i) => d.SmaValue > signalDtPts.ElementAt(i).SmaValue).ToList();

            var allSells = macdDtPts.Where((d, i) => d.SmaValue < signalDtPts.ElementAt(i).SmaValue).ToList();


            while (allBuys.Count() > 0 || allSells.Count() > 0)
            {
                if (allBuys.Count() == 0)
                {
                    var tempSingleSell     = allSells.First();
                    var tempSingleSellData = new CrossData
                    {
                        Action        = "sell",
                        dt            = tempSingleSell.Time,
                        CrossingPrice = tempSingleSell.ActualPrice,
                        smaValue      = tempSingleSell.SmaValue
                    };
                    crossList.Add(tempSingleSellData);

                    break;
                }

                if (allSells.Count() == 0)
                {
                    var tempSingleBuy     = allBuys.First();
                    var tempSingleBuyData = new CrossData
                    {
                        Action        = "buy",
                        dt            = tempSingleBuy.Time,
                        CrossingPrice = tempSingleBuy.ActualPrice,
                        smaValue      = tempSingleBuy.SmaValue
                    };
                    crossList.Add(tempSingleBuyData);

                    break;
                }



                var curBuy      = allBuys.First();
                var tempBuyData = new CrossData
                {
                    Action        = "buy",
                    dt            = curBuy.Time,
                    CrossingPrice = curBuy.ActualPrice,
                    smaValue      = curBuy.SmaValue
                };
                crossList.Add(tempBuyData);


                var curSell      = allSells.First();
                var tempSellData = new CrossData
                {
                    Action        = "sell",
                    dt            = curSell.Time,
                    CrossingPrice = curSell.ActualPrice,
                    smaValue      = curSell.SmaValue
                };
                crossList.Add(tempSellData);



                allBuys = allBuys.Where((d) => d.Time > curSell.Time).ToList();
                if (allBuys.Count() > 0)
                {
                    allSells = allSells.Where((d) => d.Time > allBuys.First().Time).ToList();
                }
                else
                {
                    break;
                }
            }



            lock (cwWriteLock)
            {
                Console.WriteLine("\t\t" + simStartDate.ToString() + "\t" + simEndDate.ToString() + "(" + crossList.Count() + ")\n");
            }

            if (crossList.First().Action == "buy")
            {
                crossList.RemoveAt(0);
            }

            return(crossList);
        }
Exemplo n.º 2
0
        private void AddTakeProfitSales(ref List <CrossData> crossList, ref List <SmaData> actualPriceLine, decimal originalBuySellPrice, CrossData OriginalSMASellData)
        {
            var originalSell = OriginalSMASellData;

            //const decimal TAKE_PROFIT_PERCENTAGE = 0.10m;

            //const decimal TAKE_PROFIT_REBUY_PERCENTAGE = 0.02m;


            //const decimal STOP_LOSS_PERCENTAGE = 0.02m;//0.02m;

            //////all the buys that are earlier than the next sell
            //////      and higher than the last actual buy price + buffer
            ////var allStopLossBuys = AllBuys.Where(s => s.Time <= curSell.Time).Where(b => b.ActualPrice > curBuy.ActualPrice).ToList();

            //////all the buys that are earlier than the next sell
            //////      and lower than the last actual buy price - buffer
            ////var allStopLossSells = AllBuys.Where(s => s.Time <= curSell.Time).Where(b => b.ActualPrice < curBuy.ActualPrice).ToList();



            //sell if price above TAKE_PROFIT_PERCENTAGE of the original buy price
            var allTakeProfitSells = actualPriceLine
                                     .Where(b => b.ActualPrice > ((1 + TAKE_PROFIT_PERCENTAGE) * originalBuySellPrice)).ToList();


            //var originalSellPrice = allTakeProfitSells.First().ActualPrice;

            //rebuy if price is below TAKE_PROFIT_PERCENTAGE of the original buy price
            //var allTakeProfitReBuys = actualPriceLine
            //    .Where(b => b.ActualPrice > ((1 + TAKE_PROFIT_PERCENTAGE) * originalBuySellPrice)).ToList();

            var allTakeProfitReBuys = new List <SmaData>();


            while (allTakeProfitSells.Count() > 0)
            {
                var curSellSt      = allTakeProfitSells.First();
                var tempSellDataSt = new CrossData
                {
                    Action        = "sell",
                    comment       = "TAKE_PROFIT_SALE",
                    dt            = curSellSt.Time,
                    CrossingPrice = curSellSt.ActualPrice,
                    smaValue      = curSellSt.SmaValue
                };

                crossList.Add(tempSellDataSt);

                originalBuySellPrice = curSellSt.ActualPrice;

                allTakeProfitReBuys = actualPriceLine.Where(p => p.Time > curSellSt.Time).ToList()
                                      .Where(b => b.ActualPrice > ((1 + TAKE_PROFIT_REBUY_PERCENTAGE) * originalBuySellPrice)).ToList();

                if (allTakeProfitReBuys.Count() > 0)
                {
                    allTakeProfitSells = actualPriceLine.Where(p => p.Time > allTakeProfitReBuys.First().Time).ToList()
                                         .Where(b => b.ActualPrice < ((1 - STOP_LOSS_PERCENTAGE) * originalBuySellPrice)).ToList();
                }
                else
                {
                    break;
                }


                if (allTakeProfitSells.Count > 0)
                {
                    var curSell = allTakeProfitSells.First();
                    OriginalSMASellData = new CrossData
                    {
                        Action        = "sell",
                        dt            = curSell.Time,
                        CrossingPrice = curSell.ActualPrice,
                        smaValue      = curSell.SmaValue
                    };
                }
                else
                {
                    OriginalSMASellData = originalSell;
                }



                var curBuySt      = allTakeProfitReBuys.First();
                var tempBuyDataSt = new CrossData
                {
                    Action        = "buy",
                    comment       = "TAKE_PROFIT_REBUY",
                    dt            = curBuySt.Time,
                    CrossingPrice = curBuySt.ActualPrice,
                    smaValue      = curBuySt.SmaValue
                };

                crossList.Add(tempBuyDataSt);

                originalBuySellPrice = curBuySt.ActualPrice; //new buy at price after rebuy. set the new original buy at price to this new price


                allTakeProfitSells = actualPriceLine
                                     .Where(b => b.ActualPrice > ((1 + TAKE_PROFIT_PERCENTAGE) * originalBuySellPrice)).ToList();

                //if the price went down after buying
                //iterate recursvively until all of the take profits are hit
                //if (allTakeProfitSells.Count() > 0)
                //{
                //    AddTakeProfitSales(ref crossList, ref actualPriceLine, originalBuySellPrice, OriginalSMASellData);
                //}
            }

            if (allTakeProfitSells.Count() == 0)
            {
                crossList.Add(OriginalSMASellData);
                //break;
            }

            if (allTakeProfitReBuys.Count() == 0 && allTakeProfitSells.Count() == 0)
            {
                crossList.Add(OriginalSMASellData);
            }
        }
Exemplo n.º 3
0
        private void AddStopLossSales(ref List <CrossData> crossList, ref List <SmaData> actualPriceLine, decimal originalBuyPrice, CrossData tempSellData)
        {
            //const decimal STOP_LOSS_PERCENTAGE = 0.02m;

            //////all the buys that are earlier than the next sell
            //////      and higher than the last actual buy price + buffer
            ////var allStopLossBuys = AllBuys.Where(s => s.Time <= curSell.Time).Where(b => b.ActualPrice > curBuy.ActualPrice).ToList();

            //////all the buys that are earlier than the next sell
            //////      and lower than the last actual buy price - buffer
            ////var allStopLossSells = AllBuys.Where(s => s.Time <= curSell.Time).Where(b => b.ActualPrice < curBuy.ActualPrice).ToList();



            //rebuy if price is above STOP_LOSS_PERCENTAGE of the original buy price
            var allStopLossBuys = actualPriceLine
                                  .Where(b => b.ActualPrice > ((1 + STOP_LOSS_PERCENTAGE) * originalBuyPrice)).ToList();

            //sell if price below STOP_LOSS_PERCENTAGE of the original buy price
            var allStopLossSells = actualPriceLine
                                   .Where(b => b.ActualPrice < ((1 - STOP_LOSS_PERCENTAGE) * originalBuyPrice)).ToList();



            while (allStopLossBuys.Count > 0 || allStopLossSells.Count() > 0)
            {
                if (allStopLossSells.Count() == 0)
                {
                    crossList.Add(tempSellData);
                    break;
                }
                var curSellSt      = allStopLossSells.First();
                var tempSellDataSt = new CrossData
                {
                    Action        = "sell",
                    comment       = "STOP_LOSS_SALE",
                    dt            = curSellSt.Time,
                    CrossingPrice = curSellSt.ActualPrice,
                    smaValue      = curSellSt.SmaValue
                };

                crossList.Add(tempSellDataSt);

                //originalBuyPrice = curSellSt.ActualPrice;

                allStopLossBuys = actualPriceLine.Where(p => p.Time > curSellSt.Time).ToList()
                                  .Where(b => b.ActualPrice > ((1 + STOP_LOSS_PERCENTAGE) * originalBuyPrice)).ToList();
                //d.Time > allStopLossBuys.First().Time
                if (allStopLossBuys.Count() > 0)
                {
                    allStopLossSells = actualPriceLine.Where(p => p.Time > allStopLossBuys.First().Time).ToList()
                                       .Where(b => b.ActualPrice < ((1 - STOP_LOSS_PERCENTAGE) * originalBuyPrice)).ToList();
                }
                else
                {
                    break;
                }


                var curBuySt      = allStopLossBuys.First();
                var tempBuyDataSt = new CrossData
                {
                    Action        = "buy",
                    comment       = "REBUY",
                    dt            = curBuySt.Time,
                    CrossingPrice = curBuySt.ActualPrice,
                    smaValue      = curBuySt.SmaValue
                };

                crossList.Add(tempBuyDataSt);

                originalBuyPrice = curBuySt.ActualPrice; //new buy at price after rebuy. set the new original buy at price to this new price
            }

            if (allStopLossBuys.Count == 0 && allStopLossSells.Count() == 0)
            {
                crossList.Add(tempSellData);
            }
        }
Exemplo n.º 4
0
        public List <CrossData> Getcrossings_Linq(List <SmaData> AllBuys, List <SmaData> AllSells, bool useRealTimeActualPrices = false)
        {
            //const decimal STOP_LOSS_PERCENTAGE = 0.1m;//0.1m;//0.02m;//0.02m;

            //const decimal TAKE_PROFIT_PERCENTAGE = 0.10m;

            var crossList = new List <CrossData>();


            if (AllBuys.Count == 0 || AllSells.Count() == 0)
            {
                return(crossList);
            }

            //var firstBuyDt = AllBuys.First().Time;
            AllSells = AllSells.Where(s => s.Time > AllBuys.First().Time).ToList();

            while (AllBuys.Count() > 0 || AllSells.Count() > 0)
            {
                if (AllBuys.Count() == 0)
                {
                    var tempSingleSell     = AllSells.First();
                    var tempSingleSellData = new CrossData
                    {
                        Action        = "sell",
                        dt            = tempSingleSell.Time,
                        CrossingPrice = tempSingleSell.ActualPrice,
                        smaValue      = tempSingleSell.SmaValue
                    };
                    crossList.Add(tempSingleSellData);

                    break;
                }

                if (AllSells.Count() == 0)
                {
                    var tempSingleBuy     = AllBuys.First();
                    var tempSingleBuyData = new CrossData
                    {
                        Action        = "buy",
                        dt            = tempSingleBuy.Time,
                        CrossingPrice = tempSingleBuy.ActualPrice,
                        smaValue      = tempSingleBuy.SmaValue
                    };
                    crossList.Add(tempSingleBuyData);

                    break;
                }



                var curBuy      = AllBuys.First();
                var tempBuyData = new CrossData
                {
                    Action        = "buy",
                    dt            = curBuy.Time,
                    CrossingPrice = curBuy.ActualPrice,
                    smaValue      = curBuy.SmaValue
                };

                crossList.Add(tempBuyData);


                var curSell      = AllSells.First();
                var tempSellData = new CrossData
                {
                    Action        = "sell",
                    dt            = curSell.Time,
                    CrossingPrice = curSell.ActualPrice,
                    smaValue      = curSell.SmaValue
                };



                //if its a stop loss sale
                //calucalte the intermediate buy sells in between
                //sell if price < (original buy price - stoploss%)
                //buy again in price > ((original buy price + stoploss%)
                //happens every sma interval and not on the minute timer

                //ExData

                List <SmaData> actualPriceLine = new List <SmaData>();

                if (useRealTimeActualPrices)
                {
                    var actualPriceLine_realtime = _RealTimePrice.Where(s => (s.Time >= AllBuys.First().Time) && (s.Time < curSell.Time)).ToList();
                    actualPriceLine.AddRange(actualPriceLine_realtime);
                }
                else
                {
                    var actualPriceLine_sma = AllBuys.Where(s => s.Time < curSell.Time).ToList();
                    actualPriceLine.AddRange(actualPriceLine_sma);
                }



                decimal originalBuyPrice = curBuy.ActualPrice;

                var priceBelowOriginalBuy = actualPriceLine.Where(p => p.ActualPrice < (1 - STOP_LOSS_PERCENTAGE) * originalBuyPrice).ToList();


                var priceAboveTakeprofitPercent = actualPriceLine.Where(b => b.ActualPrice > ((1 + TAKE_PROFIT_PERCENTAGE) * originalBuyPrice)).ToList();

                //if the price went down after buying

                //if (priceAboveTakeprofitPercent.Count() > 0)
                //{
                //    AddTakeProfitSales(ref crossList, ref actualPriceLine, originalBuyPrice, tempSellData);
                //}
                //else
                if (priceBelowOriginalBuy.Count() > 0)
                {
                    AddStopLossSales(ref crossList, ref actualPriceLine, originalBuyPrice, tempSellData);
                }
                else
                {
                    crossList.Add(tempSellData);
                }


                AllBuys = AllBuys.Where((d) => d.Time > curSell.Time).ToList();
                if (AllBuys.Count() > 0)
                {
                    AllSells = AllSells.Where((d) => d.Time > AllBuys.First().Time).ToList();
                }
                else
                {
                    break;
                }
            }



            //crossList.ForEach(a => Console.WriteLine(a.dt + "-" + a.Action));

            return(crossList);
        }