static void Main(string[] args) { //Get Coinbase data List <DTO.Coinbase.GetPrice.RootObject> coinbaseMarketData = new List <DTO.Coinbase.GetPrice.RootObject>(); DTO.Coinbase.GetPrice.RootObject coinbaseBTC_MarketData = coinbase_GetSpotPrice("BTC"); coinbaseBTC_MarketData.data.symbol = "BTC"; DTO.Coinbase.GetPrice.RootObject coinbaseLTC_MarketData = coinbase_GetSpotPrice("LTC"); coinbaseLTC_MarketData.data.symbol = "LTC"; DTO.Coinbase.GetPrice.RootObject coinbaseETH_MarketData = coinbase_GetSpotPrice("ETH"); coinbaseETH_MarketData.data.symbol = "ETH"; coinbaseMarketData.Add(coinbaseBTC_MarketData); coinbaseMarketData.Add(coinbaseLTC_MarketData); coinbaseMarketData.Add(coinbaseETH_MarketData); //Store Date and Value of ATH for the main coins in a file (csv) List <DTO.Coinbase.DataBrief> coinbaseCSVData = getCSVCoinbaseData(coinbase_CSVPath); //If current value is > ATH, then set ATH coinbaseCSVData = updateATH(coinbaseCSVData, coinbaseMarketData); //At least 2 weeks removed from ATH :: preserve "coinbaseCSVData" variable for rewrite to CSV List <DTO.Coinbase.DataBrief> postFiltered_CoinbaseCSVData = filterTwoWeeksFromATH_Only(coinbaseCSVData); string createText = ""; if (postFiltered_CoinbaseCSVData.Count == 0) { //Write that there are no hot buys. Include historical? createText = createTextFileContents(); return; } else { //(Is down from 2 weeks ago, AND down from a week ago) OR (4 weeks ago was down from 5th week, 3 weeks ago was down from 4th week, 2 weeks ago was down from 3rd week, last week was up from 2nd, this week up from last week) List <DTO.Coinbase.DataBrief> hot_buys = rules_HotBuys(postFiltered_CoinbaseCSVData); //Rewrite coinbaseCSVData to CSV string wroteCSV = writeCSV(coinbaseCSVData); //Create Output for "hot buys" (or none) if (hot_buys.Count > 0) { createText = createTextFileContents(hot_buys); } else { createText = createTextFileContents(); } //Write to file File.WriteAllText(textFile_ResultsPath, createText); } }
/* * @desc Filters the options based on a made-up set of rules that would classify a coin as "hot" * @param List<DTO.Coinbase.DataBrief> briefs * @return List<DTO.Coinbase.DataBrief> hot : dataset after "hot" filtering * @status WORKING */ private static List <DTO.Coinbase.DataBrief> rules_HotBuys(List <DTO.Coinbase.DataBrief> briefs) { //(Is down from 2 weeks ago, AND down from a week ago) OR (4 weeks ago was down from 5th week, 3 weeks ago was down from 4th week, 2 weeks ago was down from 3rd week, last week was up from 2nd, this week up from last week) //Initialize for return List <DTO.Coinbase.DataBrief> hot = new List <DTO.Coinbase.DataBrief>(); //Get dates we'll need to use string date_FiveWeeksAgo = (DateTime.Today.AddDays(-35)).ToString("yyyy-MM-dd"); string date_FourWeeksAgo = (DateTime.Today.AddDays(-28)).ToString("yyyy-MM-dd"); string date_ThreeWeeksAgo = (DateTime.Today.AddDays(-21)).ToString("yyyy-MM-dd"); string date_TwoWeeksAgo = (DateTime.Today.AddDays(-14)).ToString("yyyy-MM-dd"); string date_OneWeeksAgo = (DateTime.Today.AddDays(-7)).ToString("yyyy-MM-dd"); //For each currency... for (int i = 0; i < briefs.Count; i++) { //get the value at each of these dates DTO.Coinbase.GetPrice.RootObject getPrice_5WeeksAgo = coinbase_GetSpotPrice(briefs[i].Abbrev, date_FiveWeeksAgo); DTO.Coinbase.GetPrice.RootObject getPrice_4WeeksAgo = coinbase_GetSpotPrice(briefs[i].Abbrev, date_FourWeeksAgo); DTO.Coinbase.GetPrice.RootObject getPrice_3WeeksAgo = coinbase_GetSpotPrice(briefs[i].Abbrev, date_ThreeWeeksAgo); DTO.Coinbase.GetPrice.RootObject getPrice_2WeeksAgo = coinbase_GetSpotPrice(briefs[i].Abbrev, date_TwoWeeksAgo); DTO.Coinbase.GetPrice.RootObject getPrice_1WeeksAgo = coinbase_GetSpotPrice(briefs[i].Abbrev, date_OneWeeksAgo); DTO.Coinbase.GetPrice.RootObject getPrice_current = coinbase_GetSpotPrice(briefs[i].Abbrev); //Rule #1 :: Is down from 2 weeks ago, AND down from a week ago, AND last week's is down from 2 weeks ago //tldr; has been down two consecutive weeks bool isRule1 = false; if ((Convert.ToDouble(getPrice_current.data.amount) < Convert.ToDouble(getPrice_2WeeksAgo.data.amount)) && (Convert.ToDouble(getPrice_current.data.amount) < Convert.ToDouble(getPrice_1WeeksAgo.data.amount)) && (Convert.ToDouble(getPrice_1WeeksAgo.data.amount) < Convert.ToDouble(getPrice_2WeeksAgo.data.amount))) { isRule1 = true; } //Rule #2 :: (4 weeks ago was down from 5th week, 3 weeks ago was down from 4th week, 2 weeks ago was down from 3rd week, last week was up from 2nd, this week up from last week) //tldr; was down for 3 consecutive weeks, and has now been up 2 weeks in a row so may be hot bool isRule2 = false; if ((Convert.ToDouble(getPrice_4WeeksAgo.data.amount) < Convert.ToDouble(getPrice_5WeeksAgo.data.amount)) && (Convert.ToDouble(getPrice_3WeeksAgo.data.amount) < Convert.ToDouble(getPrice_4WeeksAgo.data.amount)) && (Convert.ToDouble(getPrice_2WeeksAgo.data.amount) < Convert.ToDouble(getPrice_3WeeksAgo.data.amount)) && (Convert.ToDouble(getPrice_1WeeksAgo.data.amount) > Convert.ToDouble(getPrice_2WeeksAgo.data.amount)) && (Convert.ToDouble(getPrice_1WeeksAgo.data.amount) < Convert.ToDouble(getPrice_current.data.amount))) { isRule2 = true; } //Pass all rules? if (isRule1 && isRule2) { hot.Add(briefs[i]); } } return(hot); }