Exemple #1
0
        protected virtual void PlaceSellOrder(TradingData trade, bool forReal)
        {
            if (trade.CoinQuantityToTrade == 0)
            {
                throw new Exception("CoinQuantityToTrade is not set!");
            }

            decimal fees = _client.GetTradeFee(trade.CoinPair);

            decimal totalReceived = trade.CoinQuantityToTrade * trade.Price / (1 + fees);

            var sellOrder = forReal ? _client.PlaceSellOrder(trade) : _client.PlaceTestSellOrder(trade);

            if (sellOrder)
            {
                trade.SellPriceAfterFees = totalReceived / trade.CoinQuantityToTrade;
                trade.LastAction         = OrderSide.Sell;
                Bot.WriteLog(trade.ToStringSold());
                if (trade.BuyPriceAfterFees > 0)
                {
                    if (forReal)
                    {
                        _settings.TotalProfit += trade.Profit;
                    }
                    else
                    {
                        _settings.TotalProfitSimulation += trade.Profit;
                    }
                }
                OnOrderSucceeded(trade);
                Sleep();
            }
        }
        public override void Trade(List <TradingData> tradesList)
        {
            // Check USDT and BTC balances
            decimal coins     = _client.GetBalance(_settings.CoinPair.Pair1);
            decimal fiatValue = _client.GetBalance(_settings.CoinPair.Pair2);

            // Check if user has more USDT or more BTC
            decimal coinsValue = coins * _client.GetPrice(_settings.CoinPair);

            // cleanup
            tradesList.RemoveAll(trade => trade.BuyOrderID > -1 && trade.SellOrderID > -1);

            // If no buy or sell orders for the required coin pair, then place an order
            TradingData tdSearch = tradesList.Find(x => x.CoinPair.Pair1 == _settings.CoinPair.Pair1);

            if (tdSearch == null)
            {
                // buy or sell?
                if (fiatValue > _settings.InvestmentMin)
                {
                    // buy
                    PlaceBuyOrder(GetNewTradingData(), _settings.TradingDataList, _settings.ProductionMode);
                }
                else
                {
                    // sell
                    TradingData trade0 = GetNewTradingData();
                    trade0.CoinQuantity = Math.Round(coins / _settings.HydraFactor, 5);
                    tradesList.Add(trade0); // Add because this is the seed
                    PlaceSellOrder(trade0, forReal: _settings.ProductionMode);
                }
            }

            // monitor market price for price changes
            Bot.WriteConsole();

            foreach (TradingData trade in tradesList)
            {
                if (trade.UpdateMarketPrice(_client.GetPrice(trade.CoinPair)))
                {
                    trade.SetPriceChangePercentage(trade.Price);
                    Bot.WriteConsole(trade.ToStringPriceCheck());
                    OnTradeListItemHandled(trade);
                    // sell if positive price change
                    if (trade.PriceChangePercentage > Math.Abs(_settings.PriceChangePercentageUp))
                    {
                        PlaceSellOrder(trade, forReal: _settings.ProductionMode);
                    }
                    Sleep();
                }
            }

            TradingData lastTrade = tradesList.Last <TradingData>();

            if (lastTrade.PriceChangePercentage < Math.Abs(_settings.PriceChangePercentageDown) * -1)
            {
                // buy more if negative price change
                PlaceBuyOrder(GetNewTradingData(), _settings.TradingDataList, _settings.ProductionMode);
            }
        }
Exemple #3
0
 private void Strategy_OrderSuccess(TradingData trade)
 {
     this.InvokeSafe(() =>
     {
         niTray.ShowBalloonTip(5000, Application.ProductName, trade.ToString(), ToolTipIcon.Info);
     });
 }
Exemple #4
0
        protected override void PlaceBuyOrder(TradingData trade, List <TradingData> tradesList, bool forReal)
        {
            decimal fiatValue = _client.GetBalance(trade.CoinPair.Pair2);

            decimal capitalCost = fiatValue / _settings.HydraFactor;

            if (trade.UpdateMarketPrice(_client.GetPrice(trade.CoinPair)))
            {
                Bot.WriteConsole();

                decimal fees         = _client.GetTradeFee(trade.CoinPair);
                decimal myInvestment = capitalCost / (1 + fees);

                if (trade.CoinQuantity == 0)
                {
                    trade.CoinQuantity = myInvestment / trade.Price;
                }

                var buyOrder = forReal ? _client.PlaceBuyOrder(trade) : _client.PlaceTestBuyOrder(trade);
                if (buyOrder)
                {
                    trade.BuyPriceAfterFees = capitalCost / trade.CoinQuantity;
                    trade.ID         = tradesList.Count;
                    trade.LastAction = OrderSide.Buy;
                    tradesList.Add(trade);
                    Bot.WriteLog(trade.ToStringBought());
                    OnOrderSucceeded(trade);
                }
            }
        }
Exemple #5
0
 private void PlacePartialSellOrder(TradingData trade, bool forReal)
 {
     if (trade.CoinQuantity > trade.CoinOriginalQuantity * _settings.SellMaxQuantityPerc / 100)
     {
         trade.CoinQuantityToTrade = trade.CoinQuantity * _settings.SellQuantityPerc / 100;
         base.PlaceSellOrder(trade, forReal);
     }
 }
Exemple #6
0
 protected void PlaceCompleteSellOrder(TradingData trade, bool forReal)
 {
     if (trade.UpdateMarketPrice(Math.Round(_client.GetPrice(trade.CoinPair), 2)))
     {
         trade.CoinQuantityToTrade = trade.CoinQuantity;
         base.PlaceSellOrder(trade, forReal);
     }
 }
Exemple #7
0
        public void TradingData_is_singleton()
        {
            TradingData td  = TradingData.Instance;
            TradingData td2 = TradingData.Instance;

            Assert.IsNotNull(td);
            Assert.IsNotNull(td2);
            Assert.AreSame(td, td2);
        }
Exemple #8
0
        protected void OnOrderSucceeded(TradingData data)
        {
            OrderSucceeded?.Invoke(data);
#if DEBUG
            if (_settings.ProductionMode)
            {
                Bot.SaveSettings(_settings);
            }
#endif

#if RELEASE
            Bot.SaveSettings(_settings);
#endif
        }
        protected override void PlaceSellOrder(TradingData trade, bool forReal)
        {
            if (trade.UpdateMarketPrice(Math.Round(_client.GetPrice(trade.CoinPair), 2)))
            {
                if (trade.Price > trade.BuyPriceAfterFees)
                {
                    trade.CoinQuantityToTrade = trade.CoinQuantity; // trading the full amount

                    decimal dmReceived = trade.CoinQuantityToTrade * trade.Price;

                    if (dmReceived > _settings.InvestmentMin)
                    {
                        base.PlaceSellOrder(trade, forReal);
                    }
                }
            }
        }
Exemple #10
0
        private void Strategy_Handled(TradingData trade)
        {
            this.InvokeSafe(() =>
            {
                lvStatus.Items.Add(trade.ToListViewItem()); // this updates UI

                lvStatistics.Items.Clear();
                // Futures
                if (trade.PriceLongBelow > 0) // this does not update UI
                {
                    string orders = trade.ProfitTarget > 0 ? " for new orders" : "";
                    AddStatistic($"Long Below{orders}", trade.PriceLongBelow.ToString());
                    AddStatistic($"Short Above{orders}", trade.PriceShortAbove.ToString());
                }

                if (trade.ProfitTarget > 0)
                {
                    AddStatistic("Target Profit", trade.ProfitTarget.ToString());
                }
            });
        }
Exemple #11
0
        private static void Trade3()
        {
            // Settings
            BTCMarketsHelper.ProfitMargin = 0;

            // Get number of Open Orders
            OpenOrdersHistory = BTCMarketsHelper.OrderOpen(CURRENCY, INSTRUMENT, 10, "1");

            if (OpenOrdersHistory.success && OpenOrdersHistory.orders != null)
            {
                if (OpenOrdersHistory.orders.Length > 1)
                {
                    Console.WriteLine("Open orders are still active...");
                }
                else
                {
                    // get ETH/BTC market data i.e. instrument/currency
                    Console.WriteLine($"Previous Ask Price: {lastETH_BTC}");
                    MarketTickData marketData = BTCMarketsHelper.GetMarketTick($"{INSTRUMENT}/{CURRENCY}");
                    Console.WriteLine($"Current Ask Price: {marketData.bestAsk}");
                    lastETH_BTC = marketData.bestAsk;

                    // get trading data
                    TradingData tradingData = TradingHelper.GetTradingData(marketData);

                    if (lastETH_BTC > 0) // ensure first round is skipped when there is no history
                    {
                        if (marketData.bestAsk > lastETH_BTC)
                        {
                            Console.WriteLine($"Previous Volume (BTC): {lastBTC_Volume}");
                            if (tradingData.BuyVolume > lastBTC_Volume)
                            {
                                Console.WriteLine("ETH has gone stronger. Sell ETH.");
                            }
                        }
                        else if (marketData.bestAsk < lastETH_BTC)
                        {
                            Console.WriteLine("BTC has gone stronger. Buy ETH.");
                            Console.WriteLine($"Previous Buy Volume (ETH): {lastETH_Volume}");
                            Console.WriteLine($"Current Buy volume ({marketData.instrument}): {tradingData.BuyVolume}");
                        }
                    }

                    Console.WriteLine($"Buy price ({marketData.currency}): {tradingData.BuyPrice}");
                    Console.WriteLine($"Sell volume ({marketData.instrument}): {tradingData.SellVolume}");
                    Console.WriteLine($"Sell price ({marketData.currency}): {tradingData.SellPrice}");
                    Console.WriteLine($"Spend total ({marketData.currency}): {tradingData.SpendTotal}");

                    /*
                     * // create orders
                     * CreateOrderData buyOrder = BTCMarketsHelper.CreateNewOrder(marketData.currency, marketData.instrument,
                     *  (long)(tradingData.BuyPrice * ApplicationConstants.NUMERIC_MULTIPLIER),
                     *  (int)(tradingData.BuyVolume * ApplicationConstants.NUMERIC_MULTIPLIER),
                     *  "Bid", "Limit");
                     *
                     * if (buyOrder.success)
                     * {
                     *  CreateOrderData sellOrder = BTCMarketsHelper.CreateNewOrder(marketData.currency, marketData.instrument,
                     *   (long)(tradingData.SellPrice * ApplicationConstants.NUMERIC_MULTIPLIER),
                     *  (int)(tradingData.SellVolume * ApplicationConstants.NUMERIC_MULTIPLIER),
                     *   "Ask", "Limit");
                     *
                     *  if (sellOrder.success)
                     *  {
                     *      // append csv line
                     *      BotLogger.WriteLine($",{tradingData.BuyVolume.ToDecimalString(8)}, {marketData.instrument}, Balance (Unit 2), " +
                     *          $"{tradingData.BuyPrice.ToDecimalString(8)}, {marketData.currency}, {tradingData.SpendTotal.ToDecimalString(8)}, {BTCMarketsHelper.ProfitMargin}%, " +
                     *          $"{tradingData.SellVolume.ToDecimalString(8)}, {tradingData.SellPrice.ToDecimalString(8)}");
                     *  }
                     *  else
                     *  {
                     *      Console.WriteLine(sellOrder.errorMessage);
                     *  }
                     * }
                     * else
                     * {
                     *  Console.WriteLine(buyOrder.errorMessage);
                     * }
                     */
                }
            }
            else
            {
                Console.WriteLine(OpenOrdersHistory.errorMessage);
            }

            Console.WriteLine(CONSOLE_WAITING);
            Console.WriteLine();
        }
Exemple #12
0
        private static void Trade1()
        {
            // Settings
            BTCMarketsHelper.ProfitMargin = 2;

            // Get number of Open Orders
            OpenOrdersHistory = BTCMarketsHelper.OrderOpen(CURRENCY, INSTRUMENT, 10, "1");

            if (OpenOrdersHistory.success && OpenOrdersHistory.orders != null)
            {
                if (OpenOrdersHistory.orders.Length > 1)
                {
                    Console.WriteLine("Open orders are still active...");
                }
                else
                {
                    // get ETH/BTC market data i.e. instrument/currency
                    MarketTickData marketData = BTCMarketsHelper.GetMarketTick($"{INSTRUMENT}/{CURRENCY}");

                    // get trading data
                    TradingData tradingData = TradingHelper.GetTradingData(marketData, splitProfitMargin: true);

                    Console.WriteLine($"Buy volume ({marketData.instrument}): {tradingData.BuyVolume}");
                    Console.WriteLine($"Buy price ({marketData.currency}): {tradingData.BuyPrice}");
                    Console.WriteLine($"Sell volume ({marketData.instrument}): {tradingData.SellVolume}");
                    Console.WriteLine($"Sell price ({marketData.currency}): {tradingData.SellPrice}");
                    Console.WriteLine($"Spend total ({marketData.currency}): {tradingData.SpendTotal}");

                    // create orders
                    CreateOrderData buyOrder = BTCMarketsHelper.CreateNewOrder(marketData.currency, marketData.instrument,
                                                                               (long)(tradingData.BuyPrice * ApplicationConstants.NUMERIC_MULTIPLIER),
                                                                               (long)(tradingData.BuyVolume * ApplicationConstants.NUMERIC_MULTIPLIER),
                                                                               "Bid", "Limit");

                    if (buyOrder.success)
                    {
                        System.Threading.Thread.Sleep(rnd.Next(1, 10) * 1000);
                        CreateOrderData sellOrder = BTCMarketsHelper.CreateNewOrder(marketData.currency, marketData.instrument,
                                                                                    (long)(tradingData.SellPrice * ApplicationConstants.NUMERIC_MULTIPLIER),
                                                                                    (long)(tradingData.SellVolume * ApplicationConstants.NUMERIC_MULTIPLIER),
                                                                                    "Ask", "Limit");

                        if (sellOrder.success)
                        {
                            // append csv line
                            BotLogger.WriteLine($",{tradingData.BuyVolume}, {marketData.instrument}, Balance (Unit 2), " +
                                                $"{tradingData.BuyPrice}, {marketData.currency}, {tradingData.SpendTotal}, {BTCMarketsHelper.ProfitMargin}%, " +
                                                $"{tradingData.SellVolume}, {tradingData.SellPrice}");
                        }
                        else
                        {
                            Console.WriteLine(sellOrder.errorMessage);
                        }
                    }
                    else
                    {
                        Console.WriteLine(buyOrder.errorMessage);
                    }
                }
            }
            else
            {
                Console.WriteLine(OpenOrdersHistory.errorMessage);
            }

            Console.WriteLine(CONSOLE_WAITING);
            Console.WriteLine();
        }
 public TradingDataViewModel(TradingData data) : this()
 {
     Assign(data);
 }
Exemple #14
0
        public ChartDataset GetChartData(ChartSettings settings)
        {
            var chartDataset = new ChartDataset();

            chartDataset.Candles = _candleLoadingService.LoadCandles(
                settings.CurrencyPairId,
                settings.Period,
                settings.CandleRangeSize,
                settings.CurrentMoment).ToList();

            foreach (var indicatorSettings in settings.Indicators)
            {
                var indicatorDataset = new IndicatorDataset();
                indicatorDataset.Settings = indicatorSettings;

                var candles = indicatorSettings.CandlePeriod != settings.Period ?
                              _candleLoadingService.LoadCandles(
                    settings.CurrencyPairId,
                    indicatorSettings.CandlePeriod,
                    settings.CandleRangeSize,
                    settings.CurrentMoment).ToList() :
                              chartDataset.Candles;

                switch (indicatorSettings.Type)
                {
                case IndicatorType.HighestMaxPrice:
                    indicatorDataset.Values = _indicatorComputingService.ComputeHighestMaxPrices(
                        candles,
                        ((CommonIndicatorSettings)indicatorSettings).Period);
                    break;

                case IndicatorType.EMA:
                    indicatorDataset.Values = _indicatorComputingService.ComputeEMA(
                        candles,
                        ((CommonIndicatorSettings)indicatorSettings).Period);
                    break;

                case IndicatorType.MACD:
                    indicatorDataset.Values = _indicatorComputingService.ComputeMACD(
                        candles,
                        ((MACDSettings)indicatorSettings).EMAPeriod1,
                        ((MACDSettings)indicatorSettings).EMAPeriod2,
                        ((MACDSettings)indicatorSettings).SignalPeriod);
                    break;

                case IndicatorType.Stochastic:
                    indicatorDataset.Values = _indicatorComputingService.ComputeStochastic(
                        candles,
                        ((StochasticSettings)indicatorSettings).Period,
                        ((StochasticSettings)indicatorSettings).SMAPeriodK,
                        ((StochasticSettings)indicatorSettings).SMAPeriodD);
                    break;

                case IndicatorType.RelativeStrengthIndex:
                    indicatorDataset.Values = _indicatorComputingService.ComputeRelativeStrengthIndex(
                        candles,
                        ((CommonIndicatorSettings)indicatorSettings).Period);
                    break;

                case IndicatorType.AccumulationDistribution:
                    indicatorDataset.Values = _indicatorComputingService.ComputeAccumulationDistribution(
                        candles);
                    break;

                case IndicatorType.WilliamsR:
                    indicatorDataset.Values = _indicatorComputingService.ComputeWilliamsR(
                        candles,
                        ((CommonIndicatorSettings)indicatorSettings).Period);
                    break;

                case IndicatorType.ParabolicSAR:
                    indicatorDataset.Values = _indicatorComputingService.ComputeParabolicSAR(candles);
                    break;

                default:
                    throw new AnalysisException("Undefined indicator type");
                }
                chartDataset.IndicatorData.Add(indicatorDataset);
            }

            var defaultTradingSettings = _configurationService.GetTradingSettings();

            var tradingSettings = _configurationService.GetTradingSettings();

            tradingSettings.Period = settings.Period;
            tradingSettings.Moment = settings.CurrentMoment;
            _configurationService.UpdateTradingSettings(tradingSettings);

            foreach (var candle in chartDataset.Candles)
            {
                tradingSettings.Moment = candle.Moment;

                _configurationService.UpdateTradingSettings(tradingSettings);

                //var newPositionInfo = await _marketNewPositionAnalysisService.ProcessMarketPosition(settings.CurrencyPairId);

                var tradingData = new TradingData
                {
                    Moment = candle.Moment
                };

                //switch (newPositionInfo.PositionType)
                //{
                //	case NewMarketPositionType.Buy:
                //		tradingData.BuyPrice = candle.ClosePrice;
                //		break;
                //}
                chartDataset.TradingData.Add(tradingData);
            }

            _configurationService.UpdateTradingSettings(defaultTradingSettings);

            return(chartDataset);
        }
Exemple #15
0
 protected void OnTradeListItemHandled(TradingData data)
 {
     TradeListItemHandled?.Invoke(data);
 }
 public CompanyTradingDataViewModel(TradingData data, string companyName, int rise, double totalRise) : base(data)
 {
     CompanyName = companyName;
     TotalRise   = totalRise;
     Rise        = rise;
 }
 public TradingDataViewModel()
 {
     tradingData = new TradingData();
 }
Exemple #18
0
        public override void Trade(List <TradingData> tradesList)
        {
            if (tradesList.Count > 0)
            {
                // Check for stop losses
                foreach (TradingData trade in tradesList)
                {
                    OnTradeListItemHandled(trade);
                    if (trade.UpdateMarketPrice(_client.GetPrice(trade.CoinPair)))
                    {
                        // Update PriceChangePercentage
                        trade.SetPriceChangePercentage(trade.Price);

                        decimal stopLossPrice = trade.BuyPriceAfterFees * (1 - _settings.StopLossPerc / 100);
                        if (trade.Price < stopLossPrice)
                        {
                            PlaceCompleteSellOrder(trade, forReal: _settings.ProductionMode);
                        }
                    }
                }

                // cleanup
                tradesList.RemoveAll(td => td.BuyOrderID > -1 && td.SellOrderID > -1 && td.CoinQuantity == 0);
            }

            // Check for new email every second
            EmailHelper agent = new EmailHelper(_settings);

            // Check for new email
            if (!agent.NewMail)
            {
                Bot.WriteConsole($"{DateTime.Now} No new mail!");
                return;
            }

            // buy or sell signal
            if (!string.IsNullOrEmpty(agent.Subject))
            {
                if (!agent.Subject.Contains(_settings.SecretWord))
                {
                    return; // SPAM!
                }

                // Match coin pair
                CoinPair coinPair = new CoinPairHelper(_settings).GetCoinPair(agent.Subject);
                if (coinPair == null)
                {
                    Console.WriteLine("CoinPair not supported!");
                    return;
                }

                if (agent.Subject.Contains("Buy"))
                {
                    _signal = OrderSide.Buy;
                }
                else if (agent.Subject.Contains("Sell"))
                {
                    _signal = OrderSide.Sell;
                }

                // If no buy or sell orders for the required coin pair, then place an order
                TradingData tdSearch = tradesList.Find(x => x.CoinPair.Pair1 == coinPair.Pair1);

                if (tdSearch == null)
                {
                    TradingData trade = new TradingData(coinPair);
                    switch (_signal)
                    {
                    case OrderSide.Buy:
                        PlaceBuyOrder(trade, tradesList, forReal: _settings.ProductionMode);
                        break;
                    }
                }
                else // existing trades detected
                {
                    foreach (TradingData trade in tradesList)
                    {
                        if (_signal == OrderSide.Sell)
                        {
                            if (_settings.SellAllOnSellSignal)
                            {
                                PlaceCompleteSellOrder(trade, _settings.ProductionMode);
                            }
                            else
                            {
                                PlacePartialSellOrder(trade, forReal: _settings.ProductionMode);
                            }
                        }
                    }
                }
            }
        }
 public void Assign(TradingData data)
 {
     tradingData.Assign(data);
     OnPropertyChanged("Price");
     OnPropertyChanged("Volume");
 }
Exemple #20
0
        public override void Trade()
        {
            using (var tempClient = new BinanceFuturesClient())
            {
                var openOrders = tempClient.GetOpenOrders().Data;

                TradingData trade = new TradingData(new CoinPair("BTC", "USDT", 3));
                var         pos   = tempClient.GetOpenPositions().Data.Single(s => s.Symbol == trade.CoinPair.ToString());
                trade.UpdateMarketPrice(pos.MarkPrice);

                Console.WriteLine($"{DateTime.Now} Entry Price: {pos.EntryPrice} Unrealised PnL: {pos.UnrealizedPnL}");

                var dataLast24hr = tempClient.Get24HPrice(trade.CoinPair.ToString()).Data;

                decimal priceDiff = dataLast24hr.WeightedAveragePrice - dataLast24hr.LowPrice;

                if (_settings.IsAutoAdjustShortAboveAndLongBelow)
                {
                    trade.PriceLongBelow = Math.Round(dataLast24hr.WeightedAveragePrice - priceDiff * 0.618m, 2);
                    decimal entryPrice = pos.EntryPrice == 0 ? dataLast24hr.WeightedAveragePrice : pos.EntryPrice;
                    trade.PriceShortAbove = Math.Round(priceDiff * 0.618m + entryPrice, 2);
                }
                else
                {
                    trade.PriceLongBelow  = _settings.LongBelow;
                    trade.PriceShortAbove = _settings.ShortAbove;
                }

                if (_settings.IsAutoAdjustTargetProfit)
                {
                    trade.ProfitTarget = Math.Round(Math.Abs(pos.Quantity) / pos.Leverage * pos.EntryPrice * 0.618m, 2);
                }
                else
                {
                    trade.ProfitTarget = _settings.FuturesProfitTarget;
                }

                // If zero positions
                if (pos.EntryPrice == 0 && openOrders.Count() == 0)
                {
                    decimal investment = _client.GetBalance(trade.CoinPair.Pair2) / _settings.FuturesSafetyFactor; // 11 is to have the liquidation very low or high
                    trade.CoinQuantity = investment / trade.Price * pos.Leverage;                                  // 20x leverage

                    // Short above or Long below
                    if (trade.Price < trade.PriceLongBelow)
                    {
                        _client.PlaceBuyOrder(trade);
                    }
                    else if (trade.Price > trade.PriceShortAbove)
                    {
                        _client.PlaceSellOrder(trade);
                    }
                }

                // When there is an existing position
                else if (pos.EntryPrice > 0)
                {
                    if (pos.LiquidationPrice < pos.EntryPrice) // Long position
                    {
                        trade.LastAction = Binance.Net.Enums.OrderSide.Buy;
                    }
                    else
                    {
                        trade.LastAction = Binance.Net.Enums.OrderSide.Sell;
                    }

                    if (pos.UnrealizedPnL > 0)
                    {
                        trade.CoinQuantity = pos.Quantity;

                        bool success;
                        bool targetProfitMet = trade.ProfitTarget > 0 && pos.UnrealizedPnL > trade.ProfitTarget;

                        if (trade.LastAction == Binance.Net.Enums.OrderSide.Buy && (targetProfitMet || pos.MarkPrice > trade.PriceShortAbove)) // i.e. Long position
                        {
                            success = _client.PlaceSellOrder(trade, closePosition: true);
                        }
                        else if (trade.LastAction == Binance.Net.Enums.OrderSide.Sell && (targetProfitMet || pos.MarkPrice < trade.PriceLongBelow))
                        {
                            success = _client.PlaceBuyOrder(trade, closePosition: true);
                        }
                        else
                        {
                            success = false;
                        }

                        if (success)
                        {
                            _settings.TotalProfit += pos.UnrealizedPnL;
                        }
                    }
                }

                // Below is for statistics and to keep UI up-to-date
                trade.SetQuantity(pos.Quantity);
                trade.SellPriceAfterFees = trade.BuyPriceAfterFees = pos.EntryPrice;
                trade.SetPriceChangePercentage(pos.MarkPrice, isFutures: true);
                OnTradeListItemHandled(trade);
            }
        }