/// <summary>
        /// Check if buying coins or not
        /// </summary>
        /// <param name="candleStick">current Candlestick object</param>
        /// <param name="previousStick">previous Candlestick object</param>
        /// <returns>Boolean if trade made</returns>
        private bool BuyCryptoCheck(BotStick candleStick, BotStick previousStick)
        {
            var tradeType = TankingCheck(candleStick, TradeType.BUY);

            if (tradeType != TradeType.NONE || _tradeNumber == 0)
            {
                //if (_tradeNumber == 0)
                //    tradeType = TradeType.BUY;

                var buyStatus = _trader.BuyCrypto(_moonTankPrice, tradeType);

                _lastBuy = _moonTankPrice;
                if (buyStatus)
                {
                    _lastBuy   = _moonTankPrice;
                    _tradeType = TradeType.SELL;
                    _lastTrade = tradeType;
                    _tradeNumber++;
                }
                return(buyStatus);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Run Trading Bot
        /// </summary>
        /// <param name="interval">Candlestick Interval</param>
        private void RunBot(Interval interval)
        {
            SetupRepository();
            tradeType = TradeType.BUY;
            var currentStick  = new BotStick();
            var previousStick = new BotStick();

            if (botSettings.tradingStatus == TradeStatus.PaperTrading)
            {
                SetPaperBalance();
            }

            while (currentlyTrading)
            {
                Task.WaitAll(Task.Delay(botSettings.priceCheck));
                var bbs = GetBollingerBands(interval);
                int i   = bbs.Length - 1;
                currentStick = bbs[i];

                if (previousStick.close == 0)
                {
                    previousStick = bbs[i];
                }
                var tradeMade = false;

                if (StoppedOutCheck(currentStick.close))
                {
                    tradeType = TradeType.BUY;
                }

                if (tradeType == TradeType.BUY)
                {
                    if (currentStick.bollingerBand.bottomBand > currentStick.close)
                    {
                        BuyCrypto(currentStick.close);
                        tradeMade = true;
                    }
                }
                else if (tradeType == TradeType.SELL)
                {
                    if (currentStick.bollingerBand.topBand < currentStick.close &&
                        lastSell < currentStick.close &&
                        GetPercent(currentStick.close) >= botSettings.sellPercent)
                    {
                        SellCrypto(currentStick.close);
                        tradeMade = true;
                    }
                }
                if (tradeMade)
                {
                    UpdateBalances();
                }
                previousStick = currentStick;
            }
        }
Exemple #3
0
        private BotStick[] KuCoinChartValueArrayToBotStickArray(ChartValue values)
        {
            var botStickList = new List <BotStick>();

            int i = values.close.Length;

            for (int j = 0; j < i; j++)
            {
                var iVal   = j;
                var volume = values.volume[iVal];
                var close  = values.close[j];
                if (close == 0)
                {
                    var k = j;
                    while (k < (i - 1))
                    {
                        k++;
                        close = values.close[k];
                        if (k < (i - 1) && close != 0)
                        {
                            iVal = k;
                        }
                    }
                    if (close == 0 && j > 0)
                    {
                        k     = j - 1;
                        close = values.close[k];
                        if (close != 0)
                        {
                            iVal = k;
                        }
                    }
                    volume = 0M;
                }
                if (values.close != null)
                {
                    var botStick = new BotStick
                    {
                        close     = values.close[iVal],
                        closeTime = values.timestamp[iVal],
                        high      = values.high[iVal],
                        low       = values.low[iVal],
                        open      = values.open[iVal],
                        volume    = volume
                    };

                    botStickList.Add(botStick);
                }
            }

            return(botStickList.ToArray());
        }
        /// <summary>
        /// Run Trading Bot
        /// </summary>
        /// <param name="interval">Candlestick Interval</param>
        /// <param name="cycles">Int of cycles to run (default -1, run infinitely)</param>
        /// <param name="tradingStatus">Bool of trading status (default null, use setting)</param>
        /// <returns>Boolean when complete</returns>
        public bool RunBot(Interval interval, int cycles = -1, bool?tradingStatus = null)
        {
            _trader.SetupRepository();
            _tradeType = TradeType.BUY;
            var  currentStick     = new BotStick();
            var  previousStick    = new BotStick();
            bool currentlyTrading = tradingStatus != null ? (bool)tradingStatus : _currentlyTrading;

            _trader.SetBalances();
            _tradeType = _trader.GetInitialTradeType();

            while (currentlyTrading)
            {
                Task.WaitAll(Task.Delay(_botSettings.priceCheck));
                if (cycles % 20 == 0)
                { // Every 10 cycles, reset balances and check bot settings file
                    _tradeType = _trader.GetTradingType();
                    _trader.UpdateBotSettings(_lastBuy, _lastSell);
                    SetBotSettings(_trader.GetBotSettings());
                }
                var candleStickArray = _trader.GetCandlesticks(_symbol, interval, 5);
                int i = candleStickArray.Length - 1;
                currentStick = candleStickArray[i];

                if (previousStick.close == 0)
                {
                    previousStick = candleStickArray[i];
                }

                StoppedOutCheck(currentStick.close);

                if (_tradeType == TradeType.BUY)
                {
                    cycles++;
                    BuyCryptoCheck(currentStick, previousStick);
                }
                else if (_tradeType == TradeType.SELL)
                {
                    cycles++;
                    SellCryptoCheck(currentStick, previousStick);
                }
                if (_tradeNumber >= cycles && cycles > 0)
                {
                    currentlyTrading = false;
                }
                previousStick = currentStick;
            }
            return(true);
        }
        public void MooningAndTankingCheck_Tanking_Test()
        {
            var interval = Interval.OneM;

            _settings.chartInterval      = interval;
            _settings.mooningTankingTime = 1;
            decimal lastPrice       = 0.00001M;
            var     tankingList     = _testObjs.GetTankingList();
            var     candlestickList = _testObjs.GetBotSticks();
            var     csI             = new BotStick[1] {
                tankingList[0]
            };
            var csII = new BotStick[1] {
                tankingList[1]
            };
            var csIII = new BotStick[1] {
                tankingList[2]
            };
            var csIV = new BotStick[1] {
                tankingList[3]
            };
            var csV = new BotStick[1] {
                tankingList[4]
            };
            var csVI = new BotStick[1] {
                tankingList[5]
            };
            var csVII = new BotStick[1] {
                tankingList[6]
            };

            _tradeBldr.SetupSequence(f => f.GetCandlesticks(It.IsAny <string>(), It.IsAny <Interval>(), It.IsAny <int>()))
            .Returns(csI)
            .Returns(csII)
            .Returns(csIII)
            .Returns(csIV)
            .Returns(csV)
            .Returns(csVI)
            .Returns(csVII);

            _bldr = new VolumeTradeBuilder(_tradeBldr.Object, _settings, lastPrice, lastPrice, TradeType.SELL);

            var result = _bldr.MooningAndTankingCheck(candlestickList[0], candlestickList[1], TradeType.SELL);

            Assert.True(result == TradeType.SELL);
        }
        /// <summary>
        /// Check if sellying coins or not
        /// </summary>
        /// <param name="candleStick">current Candlestick object</param>
        /// <param name="previousStick">previous Candlestick object</param>
        /// <returns>Boolean if trade made</returns>
        private bool SellCryptoCheck(BotStick candleStick, BotStick previousStick)
        {
            var tradeType = MooningAndTankingCheck(candleStick, TradeType.SELL);

            if (tradeType != TradeType.NONE)
            {
                _trader.SellCrypto(candleStick.close, tradeType);
                _lastSell  = candleStick.close;
                _tradeType = TradeType.BUY;
                _lastTrade = tradeType;
                _tradeNumber++;
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public void RunBot_3Cycles_Test()
        {
            var interval         = Interval.OneM;
            var candlestickArray = _testObjs.GetBotSticks().ToArray();

            _settings.chartInterval = interval;
            _tradeBldr.Setup(f => f.SetupRepository()).Returns(true);
            var csOne = new BotStick[1] {
                candlestickArray[0]
            };
            var csTwo = new BotStick[1] {
                candlestickArray[1]
            };
            var csThree = new BotStick[1] {
                candlestickArray[2]
            };

            _tradeBldr.SetupSequence(f => f.GetCandlesticks(It.IsAny <string>(), It.IsAny <Interval>(), It.IsAny <int>()))
            .Returns(csOne)
            .Returns(csTwo)
            .Returns(csThree);
            _tradeBldr.SetupSequence(t => t.StoppedOutCheck(It.IsAny <decimal>()))
            .Returns(null)
            .Returns(null)
            .Returns(null);
            _tradeBldr.SetupSequence(f => f.BuyCrypto(It.IsAny <decimal>(), It.IsAny <TradeType>(), It.IsAny <bool>(), It.IsAny <bool>()))
            .Returns(true)
            .Returns(true);
            _tradeBldr.Setup(f => f.SellCrypto(It.IsAny <decimal>(), It.IsAny <TradeType>(), It.IsAny <bool>()))
            .Equals(true);

            _bldr = new VolumeTradeBuilder(_tradeBldr.Object, _settings);
            //_bldr.SetBotSettings(_settings);

            var result = _bldr.RunBot(interval, 3, true);

            Assert.True(result);
        }
        /// <summary>
        /// Check if buying coins or not
        /// </summary>
        /// <param name="candleStick">current Candlestick object</param>
        /// <param name="previousStick">previous Candlestick object</param>
        /// <returns>Boolean if trade made</returns>
        private bool BuyCryptoCheck(BotStick candleStick, BotStick previousStick)
        {
            var tradeType = MooningAndTankingCheck(candleStick, TradeType.BUY);

            if (tradeType != TradeType.NONE || _tradeNumber == 0)
            {
                if (_tradeNumber == 0)
                {
                    tradeType = TradeType.BUY;
                }

                _trader.BuyCrypto(candleStick.close, tradeType);
                _lastBuy   = candleStick.close;
                _tradeType = TradeType.SELL;
                _lastTrade = tradeType;
                _tradeNumber++;
                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Check if sellying coins or not
        /// </summary>
        /// <param name="candleStick">current Candlestick object</param>
        /// <param name="previousStick">previous Candlestick object</param>
        /// <returns>Boolean if trade made</returns>
        private bool SellCryptoCheck(BotStick candleStick, BotStick previousStick)
        {
            var tradeType = MooningCheck(candleStick, TradeType.SELL);

            if (tradeType != TradeType.NONE)
            {
                var sellStatus = _trader.SellCrypto(_moonTankPrice, tradeType);

                _lastSell = _moonTankPrice;
                if (sellStatus)
                {
                    _lastSell  = _moonTankPrice;
                    _tradeType = TradeType.BUY;
                    _lastTrade = tradeType;
                    _tradeNumber++;
                }
                return(sellStatus);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Check if mooning or tanking
        /// </summary>
        /// <param name="candleStick">Current trading stick</param>
        /// <param name="tradeType">Trade Type</param>
        /// <returns>TradeType of result</returns>
        public TradeType MooningAndTankingCheck(BotStick candleStick, TradeType tradeType)
        {
            if (_botSettings.mooningTankingTime == 0)
            {
                return(tradeType);
            }

            _lastVolume = candleStick.volume;

            var latestStick = GetNextCandlestick();

            var volumePercentChange = _helper.GetPercent(_lastVolume, latestStick.volume) * 100;

            if (_tradeType == TradeType.BUY)
            {
                var buyPercentReached = BuyPercentReached(latestStick.close);

                if (candleStick.close > latestStick.close &&
                    buyPercentReached)
                {
                    // If current price is less than the previous check
                    //  (price is dropping)
                    // and buy percent reached
                    // keep checking if dropping more
                    MooningAndTankingCheck(latestStick, tradeType);
                }
                else
                {
                    if (_lastTrade == TradeType.VOLUMESELL &&
                        candleStick.close < latestStick.close &&
                        _lastSell > latestStick.close)
                    {
                        // If last trade was volume sell and current stick is greater than last,
                        // but less than last sell, probably reached ATL: BUY volume sell
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMESELLBUYOFF, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMESELLBUYOFF);
                    }
                    else if (volumePercentChange > _botSettings.mooningTankingPercent &&
                             candleStick.close < latestStick.close &&
                             _lastSell > latestStick.close) // TODO: may need to nix this line
                    {
                        // If volume increased more than 20% and Latest close is greater than previous close
                        // Probably a mini-moon: BUY
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMEBUY, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMEBUY);
                    }
                    else
                    {
                        // Else if not dropping in price from previous check
                        // or buy percent not reached
                        // return buy percent reached
                        if (buyPercentReached)
                        {
                            _trader.LogTradeSignal(SignalType.Percent, TradeType.BUY, latestStick.close, latestStick.volume);
                        }

                        return(buyPercentReached ? TradeType.BUY : TradeType.NONE);
                    }
                }
            }
            else
            {
                var sellPercentReached = SellPercentReached(latestStick.close);

                if (candleStick.close < latestStick.close &&
                    sellPercentReached)
                {
                    // If current price is greater than the previous check
                    //  (price is increasing)
                    // and sell percent reached
                    // keep checking if increasing more
                    MooningAndTankingCheck(latestStick, tradeType);
                }
                else
                {
                    if (_lastTrade == TradeType.VOLUMEBUY &&
                        candleStick.close > latestStick.close &&
                        _lastBuy < latestStick.close)
                    {
                        // If last trade was volume buy and current stick is less than last,
                        // but greater than last buy, probably reached ATH: SELL volume buy
                        _trader.LogTradeSignal(SignalType.Percent, TradeType.SELL, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMEBUYSELLOFF);
                    }
                    else if (volumePercentChange > _botSettings.mooningTankingPercent &&
                             candleStick.close > latestStick.close &&
                             _lastBuy < latestStick.close) // TODO: may need to nix this line
                    {
                        // If volume increased more than 20% and Latest close is less than previous close
                        // Probably a sell off: Sell
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMEBUYSELLOFF, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMESELL);
                    }
                    else
                    {
                        // Else if not increasing in price from previous check
                        // or sell percent not reached
                        // return sell percent reached
                        if (sellPercentReached)
                        {
                            _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMESELL, latestStick.close, latestStick.volume);
                        }

                        return(sellPercentReached ? TradeType.SELL : TradeType.NONE);
                    }
                }
            }

            return(tradeType);
        }
        /// <summary>
        /// Check if tanking
        /// </summary>
        /// <param name="startingStick">Starting BotStick</param>
        /// <param name="tradeType">Trade Type</param>
        /// <param name="prevStick">Previous BotStick (default null)</param>
        /// <param name="startingPrice">decimal of starting price</param>
        /// <param name="iteration">Int of iteration</param>
        /// <returns>TradeType of result</returns>
        public TradeType TankingCheck(BotStick startingStick
                                      , TradeType tradeType
                                      , BotStick prevStick    = null
                                      , decimal startingPrice = 0.00000000M
                                      , int iteration         = 0)
        {
            if (_botSettings.mooningTankingTime == 0)
            {
                //return tradeType;
            }

            var sticks = GetNextCandlestick();

            var currentStick = sticks[0];
            var lastStick    = sticks[1];

            if (prevStick == null)
            {
                prevStick = lastStick;
            }

            if (iteration == 0)
            {
                startingPrice = lastStick.close;
            }

            SetLocals(currentStick.close, iteration);

            _lastVolume = lastStick.volume;

            _moonTankPrice = currentStick.close;

            var volumePercentChange = _helper.GetPercent(_lastVolume, currentStick.volume) * 100;

            var buyPercentReached = BuyPercentReached(currentStick.close);

            if (currentStick.open > currentStick.close &&
                lastStick.close > currentStick.close &&
                prevStick.close > currentStick.close)
            //&& buyPercentReached && iteration < 10)
            {
                // If current price is less than the previous check
                //  (price is dropping)
                // and buy percent reached
                // keep checking if dropping more
                iteration++;
                TankingCheck(startingStick, tradeType, lastStick, startingPrice, iteration);
            }
            else if (buyPercentReached)
            {
                // Else if not dropping in price from previous check
                // or buy percent not reached
                // return buy percent reached
                _trader.LogTradeSignal(SignalType.Percent, TradeType.BUY, currentStick.close, currentStick.volume);

                return(TradeType.BUY);
            }
            else if (_botSettings.mooningTankingTime > 0)
            {
                if (_lastTrade == TradeType.VOLUMESELL &&
                    currentStick.open > currentStick.close &&
                    lastStick.close > currentStick.close &&
                    _lastSell > currentStick.close &&
                    _localLow < currentStick.close)
                {
                    // If last trade was volume sell and current stick is greater than last,
                    // but less than last sell, probably reached ATL: BUY volume sell
                    _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMESELLBUYOFF, currentStick.close, currentStick.volume);

                    return(TradeType.VOLUMESELLBUYOFF);
                }
                else if (volumePercentChange > _botSettings.mooningTankingPercent &&
                         currentStick.open < currentStick.close &&
                         lastStick.close < currentStick.close &&
                         _lastSell > currentStick.close)
                {
                    // If volume increased more than N% and Latest close is greater than previous close
                    // Probably a mini-moon: BUY
                    _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMEBUY, currentStick.close, currentStick.volume);

                    return(TradeType.VOLUMEBUY);
                }
                else
                {
                    return(TradeType.NONE);
                }
            }
            else
            {
                return(TradeType.NONE);
            }

            return(tradeType);
        }
        /// <summary>
        /// Check if mooning
        /// </summary>
        /// <param name="startingStick">Starting BotStick</param>
        /// <param name="tradeType">Trade Type</param>
        /// <param name="prevStick">Previous BotStick (default null)</param>
        /// <param name="startingPrice">decimal of starting price</param>
        /// <param name="iteration">Int of iteration</param>
        /// <returns>TradeType of result</returns>
        public TradeType MooningCheck(BotStick startingStick
                                      , TradeType tradeType
                                      , BotStick prevStick    = null
                                      , decimal startingPrice = 0.00000000M
                                      , int iteration         = 0)
        {
            if (_botSettings.mooningTankingTime == 0)
            {
                //return tradeType;
            }

            var sticks = GetNextCandlestick();

            var currentStick = sticks[0];
            var lastStick    = sticks[1];

            if (prevStick == null)
            {
                prevStick = lastStick;
            }

            if (iteration == 0)
            {
                startingPrice = lastStick.close;
            }

            _lastVolume = lastStick.volume;

            SetLocals(currentStick.close, iteration);

            _moonTankPrice = currentStick.close;

            var volumePercentChange = _helper.GetPercent(_lastVolume, currentStick.volume) * 100;

            var sellPercentReached = SellPercentReached(currentStick.close);

            if (currentStick.open < currentStick.close &&
                startingStick.close < currentStick.close &&
                prevStick.close < currentStick.close)
            //&& sellPercentReached && iteration < 10)
            {
                // TODO: set the latest price as the starting price to see if it is increasing during current candle
                // TODO: do same on tanking
                // If current price is greater than the previous check
                //  (price is increasing)
                // and sell percent reached
                // keep checking if increasing more
                iteration++;
                MooningCheck(startingStick, tradeType, lastStick, startingPrice, iteration);
            }
            else if (sellPercentReached)
            {
                // Else if not increasing in price from previous check
                // or sell percent not reached
                // return sell percent reached
                _trader.LogTradeSignal(SignalType.Percent, TradeType.SELL, currentStick.close, currentStick.volume);

                return(TradeType.SELL);
            }
            else if (_botSettings.mooningTankingTime > 0)
            {
                if (_lastTrade == TradeType.VOLUMEBUY &&
                    currentStick.open < currentStick.close &&
                    lastStick.close < currentStick.close &&
                    _lastBuy < currentStick.close &&
                    _localHigh > currentStick.close)
                {
                    // If last trade was volume buy and current stick is less than last,
                    // but greater than last buy, probably reached ATH: SELL volume buy
                    _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMEBUYSELLOFF, currentStick.close, currentStick.volume);

                    return(TradeType.VOLUMEBUYSELLOFF);
                }
                else if (volumePercentChange > _botSettings.mooningTankingPercent &&
                         currentStick.open > currentStick.close &&
                         lastStick.close > currentStick.close &&
                         _lastBuy < currentStick.close)
                {
                    // If volume increased more than N% and Latest close is less than previous close
                    // Probably a sell off: Sell
                    _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMESELL, currentStick.close, currentStick.volume);

                    return(TradeType.VOLUMESELL);
                }
                else
                {
                    return(TradeType.NONE);
                }
            }
            else
            {
                return(TradeType.NONE);
            }

            return(tradeType);
        }
        /// <summary>
        /// Check if mooning or tanking
        /// </summary>
        /// <param name="candleStick">Current trading stick</param>
        /// <param name="previousStick">Previous trading stick</param>
        /// <param name="tradeType">Trade Type</param>
        /// <param name="startingPrice">decimal of starting price</param>
        /// <param name="iteration">Int of iteration</param>
        /// <returns>TradeType of result</returns>
        public TradeType MooningAndTankingCheck(BotStick candleStick, BotStick previousStick,
                                                TradeType tradeType,
                                                decimal startingPrice = 0.00000000M,
                                                int iteration         = 0)
        {
            if (_botSettings.mooningTankingTime == 0)
            {
                //return tradeType;
            }

            if (iteration == 0)
            {
                startingPrice = candleStick.close;
            }

            _lastVolume = candleStick.volume;

            var sticks = GetNextCandlestick();

            var latestStick = sticks[0];

            candleStick   = sticks[1];
            previousStick = sticks[1];

            if (latestStick.closeTime == candleStick.closeTime)
            { // If latest stick has the same close time as current stick, make previous stick the current stick
                candleStick = previousStick;
            }

            _moonTankPrice = latestStick.close;

            var volumePercentChange = _helper.GetPercent(_lastVolume, latestStick.volume) * 100;

            if (_tradeType == TradeType.BUY)
            {
                var buyPercentReached = BuyPercentReached(latestStick.close);

                if (candleStick.close > latestStick.close &&
                    buyPercentReached && iteration < 10)
                {
                    // If current price is less than the previous check
                    //  (price is dropping)
                    // and buy percent reached
                    // keep checking if dropping more
                    iteration++;
                    MooningAndTankingCheck(latestStick, candleStick, tradeType, startingPrice, iteration);
                }
                else
                {
                    if (_lastTrade == TradeType.VOLUMESELL &&
                        candleStick.close < latestStick.close &&
                        _lastSell > latestStick.close &&
                        _botSettings.mooningTankingTime > 0)
                    {
                        // If last trade was volume sell and current stick is greater than last,
                        // but less than last sell, probably reached ATL: BUY volume sell
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMESELLBUYOFF, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMESELLBUYOFF);
                    }
                    else if (volumePercentChange > _botSettings.mooningTankingPercent &&
                             candleStick.close < latestStick.close &&
                             _botSettings.mooningTankingTime > 0)
                    {
                        // If volume increased more than N% and Latest close is greater than previous close
                        // Probably a mini-moon: BUY
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMEBUY, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMEBUY);
                    }
                    else
                    {
                        // Else if not dropping in price from previous check
                        // or buy percent not reached
                        // return buy percent reached
                        if (buyPercentReached)
                        {
                            _trader.LogTradeSignal(SignalType.Percent, TradeType.BUY, latestStick.close, latestStick.volume);

                            return(TradeType.BUY);
                        }
                        else
                        {
                            return(TradeType.NONE);
                        }
                    }
                }
            }
            else
            {
                var sellPercentReached = SellPercentReached(latestStick.close);

                if (candleStick.close < latestStick.close &&
                    sellPercentReached && iteration < 10)
                {
                    // If current price is greater than the previous check
                    //  (price is increasing)
                    // and sell percent reached
                    // keep checking if increasing more
                    iteration++;
                    MooningAndTankingCheck(latestStick, candleStick, tradeType, startingPrice, iteration);
                }
                else if (sellPercentReached)
                {
                    // Else if not increasing in price from previous check
                    // or sell percent not reached
                    // return sell percent reached
                    _trader.LogTradeSignal(SignalType.Percent, TradeType.SELL, latestStick.close, latestStick.volume);

                    return(TradeType.SELL);
                }
                else
                {
                    if (_lastTrade == TradeType.VOLUMEBUY &&
                        candleStick.close > latestStick.close &&
                        _lastBuy < latestStick.close &&
                        _botSettings.mooningTankingTime > 0)
                    {
                        // If last trade was volume buy and current stick is less than last,
                        // but greater than last buy, probably reached ATH: SELL volume buy
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMEBUYSELLOFF, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMEBUYSELLOFF);
                    }
                    else if (volumePercentChange > _botSettings.mooningTankingPercent &&
                             candleStick.close > latestStick.close &&
                             _botSettings.mooningTankingTime > 0)
                    {
                        // If volume increased more than N% and Latest close is less than previous close
                        // Probably a sell off: Sell
                        _trader.LogTradeSignal(SignalType.Volume, TradeType.VOLUMESELL, latestStick.close, latestStick.volume);

                        return(TradeType.VOLUMESELL);
                    }
                    else
                    {
                        return(TradeType.NONE);
                    }
                }
            }

            return(tradeType);
        }