//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); }
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); } }
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); } }
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); }