Esempio n. 1
0
        static void tradeExecuted(ExecutedOrders newOrder)
        {
            double accountBalance;
            double requiredMargin;
            int    curQuantity;
            double price;
            double newPrice;


            XmlDocument doc = new XmlDocument();
            //String traderLog = Environment.CurrentDirectory.ToString() + "\\clearingLog.xml"; can do this but would have to put the xml in bin folder
            String traderLog = ConfigurationManager.AppSettings["ClearingTraderLogPath"].ToString();

            doc.Load(@traderLog);
            String ID = newOrder.CustomerID.ToString();

            XmlNode traderNode = doc.SelectSingleNode(@"ClearingCorpLog/Trader[@ID='" + ID + "']");



            if ((newOrder.OrderAction == "Delete" && newOrder.Status == "E") || newOrder.Status == "D") //E for executed D for denied
            {
                //remove order from trade log and update req margin
                curQuantity = Convert.ToInt32(traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.Instrument + "']/Quantity").InnerText);
                price       = Convert.ToDouble(traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.Instrument + "']/Price").InnerText);
                newPrice    = (price * curQuantity - newOrder.ExecutionQuantity * newOrder.LimitPrice) / (curQuantity - newOrder.ExecutionQuantity);

                traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.Instrument + "']/Price").InnerText = newPrice.ToString("#.##");
                requiredMargin = Convert.ToDouble(traderNode.SelectSingleNode("RequiredMargin").InnerText);
                //traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.ExecutionPrice + "']/Quantity").InnerText = (newOrder.Quantity + curQuantity).ToString();

                requiredMargin = (requiredMargin - (newOrder.LimitPrice * newOrder.ExecutionQuantity) * Convert.ToDouble(ConfigurationManager.AppSettings["maintMargin"]));
                traderNode.SelectSingleNode("RequiredMargin").InnerText = (requiredMargin).ToString("#.##");
            }
            else
            {
                accountBalance = Convert.ToDouble(traderNode.SelectSingleNode("Balance").InnerText);
                curQuantity    = Convert.ToInt32(traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.Instrument + "']/Quantity").InnerText);
                price          = Convert.ToDouble(traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.Instrument + "']/Price").InnerText);
                newPrice       = (price * curQuantity - newOrder.ExecutionQuantity * (newOrder.LimitPrice - newOrder.ExecutionPrice)) / (curQuantity);

                traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.Instrument + "']/Price").InnerText = newPrice.ToString("#.##");
                requiredMargin = Convert.ToDouble(traderNode.SelectSingleNode("RequiredMargin").InnerText);
                //traderNode.SelectSingleNode("Positions/Ticker[@Ticker='" + newOrder.ExecutionPrice + "']/Quantity").InnerText = (newOrder.Quantity + curQuantity).ToString();

                requiredMargin = (requiredMargin + (newPrice - price) * newOrder.ExecutionQuantity);
                traderNode.SelectSingleNode("RequiredMargin").InnerText = (requiredMargin).ToString("#.##");


                if (accountBalance < requiredMargin)
                {//\
                 // do something here, either cancel order or ask for a deposit
                }
            }
            doc.Save(@traderLog);
        }
Esempio n. 2
0
        void recordMathcedTrades(ExecutedOrders executedOrder)//need to put back in, or send order back to client and save there
        {
            //string filePath = ConfigurationManager.AppSettings["executionXMLPath"].ToString() + "orderID" + executedOrder.OrderID + ".xml";

            //System.Xml.Serialization.XmlSerializer writer =
            //    new System.Xml.Serialization.XmlSerializer(typeof(ExecutedOrders));

            //System.IO.StreamWriter file = new System.IO.StreamWriter(filePath);
            //writer.Serialize(file, executedOrder);
            //file.Close();
            // also need to send trade execution to trade generator and clearing corp
        }
Esempio n. 3
0
        void recordMathcedTrades(ExecutedOrders executedOrder)
        {
            string filePath = ConfigurationManager.AppSettings["executionXMLPath"].ToString() + "orderID" + executedOrder.OrderID + ".xml";

            System.Xml.Serialization.XmlSerializer writer =
                new System.Xml.Serialization.XmlSerializer(typeof(ExecutedOrders));

            System.IO.StreamWriter file = new System.IO.StreamWriter(filePath);
            writer.Serialize(file, executedOrder);
            file.Close();

            updateClearingCorp();
        }
Esempio n. 4
0
        private void MatchBuyLogic(OrderEventArgs e)
        {
            foreach (Order curOrder in e.SellBook)
            {
                if (e.Order.OrderType == "Market" && e.Order.Quantity > 0)
                {
                    Console.WriteLine("Match found..Generate Market Order Trade..");
                    int quantity = Math.Min(e.Order.Quantity, curOrder.Quantity);     //need to check this
                    curOrder.Quantity = curOrder.Quantity - quantity;
                    e.Order.Quantity  = e.Order.Quantity - quantity;
                    Console.WriteLine(quantity.ToString() + " " + curOrder.Instrument.ToString() + " at " + curOrder.LimitPrice.ToString() + " order ID's " + curOrder.OrderID.ToString() + " & " + e.Order.OrderID.ToString());
                    // write executed orders to xml file
                    ExecutedOrders executedOrder1 = new ExecutedOrders(e.Order, quantity, curOrder.LimitPrice);
                    ExecutedOrders executedOrder2 = new ExecutedOrders(curOrder, quantity, curOrder.LimitPrice);
                    recordMathcedTrades(executedOrder1);
                    recordMathcedTrades(executedOrder2);     // saves as xml document also need to send execution notification back to client and clearing corp
                }

                else if (curOrder.LimitPrice <= e.Order.LimitPrice && e.Order.Quantity > 0)
                {
                    Console.WriteLine("Match found..Generate Trade..");
                    int quantity = Math.Min(e.Order.Quantity, curOrder.Quantity);
                    curOrder.Quantity = curOrder.Quantity - e.Order.Quantity;
                    e.Order.Quantity  = e.Order.Quantity - quantity;
                    Console.WriteLine(quantity.ToString() + " " + curOrder.Instrument.ToString() + " at " + curOrder.LimitPrice.ToString() + " order ID's " + curOrder.OrderID.ToString() + " & " + e.Order.OrderID.ToString());

                    ExecutedOrders executedOrder1 = new ExecutedOrders(e.Order, curOrder.Quantity, curOrder.LimitPrice);
                    ExecutedOrders executedOrder2 = new ExecutedOrders(curOrder, curOrder.Quantity, curOrder.LimitPrice);
                    recordMathcedTrades(executedOrder1);
                    recordMathcedTrades(executedOrder2);     // saves as xml document also need to send execution notification back to client and clearing corp
                }
                else
                {
                    break;
                }
            }
        }
Esempio n. 5
0
        public void Buy(IPair SourceCandle, string TargetPair, OrderType TypeOforder, Guid Operation, decimal _quantity = 0)
        {
            Console.WriteLine("Order Management starting for : {0}", TargetPair);
            try
            {
                var pivotalbuy        = SourceCandle.Candle.Close.ChangeType <decimal>();
                var MySymbolConf      = this.Pairs.Where(y => y.Name == TargetPair).First();
                var MinimalLot        = MySymbolConf.Filters.OfType <BinanceSymbolLotSizeFilter>().FirstOrDefault();
                var minNotionalFilter = MySymbolConf.Filters.OfType <BinanceSymbolMinNotionalFilter>().SingleOrDefault();

                var PriceSize = MySymbolConf.Filters.OfType <BinanceSymbolPriceFilter>().FirstOrDefault();

                var AdjustedPrice   = BinanceHelpers.ClampPrice(PriceSize.MinPrice, PriceSize.MaxPrice, PriceSize.TickSize, pivotalbuy);
                var AdjustedLotSize = (MinimalLot.MinQuantity / BinanceHelpers.ClampQuantity(MinimalLot.MinQuantity, MinimalLot.MaxQuantity, MinimalLot.StepSize, _quantity));

                while ((_quantity - MinimalLot.MinQuantity) % MinimalLot.StepSize != 0)
                {
                    _quantity += MinimalLot.StepSize;
                }
                var test = (_quantity - MinimalLot.MinQuantity) % MinimalLot.StepSize == 0;

                while ((_quantity * AdjustedPrice) < minNotionalFilter.MinNotional)
                {
                    _quantity += MinimalLot.StepSize;
                }

                var Trade = new TradeItem
                {
                    BoughtPrice = AdjustedPrice,
                    Soldprice   = 0m,
                    Symbol      = TargetPair,
                    OperationID = Operation,
                    State       = OrderExecutionStatus.Ready,
                };
                var DenyOperation = ExecutedOrders.Count() > 1 && ExecutedOrders.Where(y => y.OperationID == Operation).ToList().Count() > 1;
                if (TypeOforder == OrderType.Limit && !DenyOperation)
                {
                    var result = this.Service.Client.PlaceOrder(TargetPair, OrderSide.Buy, OrderType.Limit, timeInForce: TimeInForce.GoodTillCancel, quantity: _quantity
                                                                , price: AdjustedPrice);
                    ExecutedOrders.Add(Trade);
                    if (!result.Success)
                    {
                        Console.WriteLine("Order not filled due to : {0}", result.Error.Message);
                        ExecutedOrders.Where(y => y.OperationID == Operation).First().State = OrderExecutionStatus.Error;
                    }
                    else
                    {
                        bool checker = false;
                        int  pass    = 0;
                        //Update order price
                        ExecutedOrders.Where(y => y.OperationID == Operation).First().BuyLinkedOrder = result.Data;
                        ExecutedOrders.Where(y => y.OperationID == Operation).First().BoughtPrice    = AdjustedPrice;
                        ExecutedOrders.Where(y => y.OperationID == Operation).First().OrderID        = result.Data.OrderId;
                        ExecutedOrders.Where(y => y.OperationID == Operation).First().State          = OrderExecutionStatus.Submited;
                        while (!checker)
                        {
                            ExecutedOrders.Where(y => y.OperationID == Operation).First().State = OrderExecutionStatus.Waiting;
                            pass++;
                            if (pass > 60)
                            {
                                this.Service.Client.CancelOrder(TargetPair, result.Data.OrderId);
                                ExecutedOrders.Where(y => y.OperationID == Operation).First().State = OrderExecutionStatus.Error;
                                checker = true;
                            }
                            Console.WriteLine("Checking if order filled for pair - {0}", Pairs);
                            var orderrslt = this.Service.Client.QueryOrder(TargetPair, result.Data.OrderId);
                            if (orderrslt.Data.Status == OrderStatus.Filled)
                            {
                                ExecutedOrders.Where(y => y.OperationID == Operation).First().State = OrderExecutionStatus.Filled;
                                Console.WriteLine("Pair {0} - Buy Order passed : {1} at quantity {2} price {3} ", TargetPair, result.Success, _quantity, AdjustedPrice);
                                Console.WriteLine("Order filled");
                                checker = true;
                            }
                            System.Threading.Thread.Sleep(5000);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Generate the Account Statistics in pips.
        /// </summary>
        static void GenerateAccountStats()
        {
            accountStatsParam = new string[26]
            {
                Language.T("Intrabar scanning"),
                Language.T("Interpolation method"),
                Language.T("Ambiguous bars"),
                Language.T("Profit per day"),
                Language.T("Tested bars"),
                Language.T("Account balance"),
                Language.T("Minimum account"),
                Language.T("Maximum account"),
                Language.T("Maximum drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Gross profit"),
                Language.T("Gross loss"),
                Language.T("Sent orders"),
                Language.T("Executed orders"),
                Language.T("Traded lots"),
                Language.T("Winning trades"),
                Language.T("Losing trades"),
                Language.T("Win/loss ratio"),
                Language.T("Time in position"),
                Language.T("Charged spread"),
                Language.T("Charged rollover"),
                Language.T("Charged commission"),
                Language.T("Charged slippage"),
                Language.T("Total charges"),
                Language.T("Balance without charges")
            };

            string unit = " " + Language.T("pips");

            accountStatsValue     = new string[26];
            accountStatsValue[0]  = isScanned ? Language.T("Accomplished") : Language.T("Not accomplished");
            accountStatsValue[1]  = InterpolationMethodShortToString();
            accountStatsValue[2]  = ambiguousBars.ToString();
            accountStatsValue[3]  = ProfitPerDay.ToString() + unit;
            accountStatsValue[4]  = (Bars - FirstBar).ToString();
            accountStatsValue[5]  = NetBalance.ToString() + unit;
            accountStatsValue[6]  = MinBalance.ToString() + unit;
            accountStatsValue[7]  = MaxBalance.ToString() + unit;
            accountStatsValue[8]  = MaxDrawdown.ToString() + unit;
            accountStatsValue[9]  = MaxEquityDrawdown.ToString() + unit;
            accountStatsValue[10] = EquityPercentDrawdown.ToString("F2") + " %";
            accountStatsValue[11] = GrossProfit.ToString() + unit;
            accountStatsValue[12] = GrossLoss.ToString() + unit;
            accountStatsValue[13] = SentOrders.ToString();
            accountStatsValue[14] = ExecutedOrders.ToString();
            accountStatsValue[15] = TradedLots.ToString("F2");
            accountStatsValue[16] = winningTrades.ToString();
            accountStatsValue[17] = losingTrades.ToString();
            accountStatsValue[18] = ((float)winningTrades / (winningTrades + losingTrades)).ToString("F2");
            accountStatsValue[19] = TimeInPosition.ToString() + " %";
            accountStatsValue[20] = Math.Round(TotalChargedSpread).ToString() + unit;
            accountStatsValue[21] = Math.Round(TotalChargedRollOver).ToString() + unit;
            accountStatsValue[22] = Math.Round(TotalChargedCommission).ToString() + unit;
            accountStatsValue[23] = TotalChargedSlippage.ToString("F2") + unit;
            accountStatsValue[24] = Math.Round(TotalChargedSpread + TotalChargedRollOver + TotalChargedSlippage).ToString() + unit;
            accountStatsValue[25] = Math.Round(NetBalance + TotalChargedSpread + TotalChargedRollOver + TotalChargedSlippage).ToString() + unit;

            accountStatsFlag    = new bool[26];
            accountStatsFlag[0] = ambiguousBars > 0 && !isScanned;
            accountStatsFlag[1] = interpolationMethod != InterpolationMethod.Pessimistic;
            accountStatsFlag[2] = ambiguousBars > 0;
            accountStatsFlag[5] = NetBalance < 0;
            accountStatsFlag[8] = MaxDrawdown > 500;

            return;
        }
Esempio n. 7
0
        /// <summary>
        /// Generate the Account Statistics in currency.
        /// </summary>
        static void GenerateAccountStatsInMoney()
        {
            accountStatsParam = new string[28]
            {
                Language.T("Intrabar scanning"),
                Language.T("Interpolation method"),
                Language.T("Ambiguous bars"),
                Language.T("Profit per day"),
                Language.T("Tested bars"),
                Language.T("Initial account"),
                Language.T("Account balance"),
                Language.T("Minimum account"),
                Language.T("Maximum account"),
                Language.T("Maximum drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Gross profit"),
                Language.T("Gross loss"),
                Language.T("Sent orders"),
                Language.T("Executed orders"),
                Language.T("Traded lots"),
                Language.T("Winning trades"),
                Language.T("Losing trades"),
                Language.T("Win/loss ratio"),
                Language.T("Time in position"),
                Language.T("Charged spread"),
                Language.T("Charged rollover"),
                Language.T("Charged commission"),
                Language.T("Charged slippage"),
                Language.T("Total charges"),
                Language.T("Balance without charges"),
                Language.T("Account exchange rate")
            };

            string unit = " " + Configs.AccountCurrency;

            accountStatsValue     = new string[28];
            accountStatsValue[0]  = isScanned ? Language.T("Accomplished") : Language.T("Not accomplished");
            accountStatsValue[1]  = InterpolationMethodShortToString();
            accountStatsValue[2]  = ambiguousBars.ToString();
            accountStatsValue[3]  = MoneyProfitPerDay.ToString("F2") + unit;
            accountStatsValue[4]  = (Bars - FirstBar).ToString();
            accountStatsValue[5]  = Configs.InitialAccount.ToString("F2") + unit;
            accountStatsValue[6]  = NetMoneyBalance.ToString("F2") + unit;
            accountStatsValue[7]  = MinMoneyBalance.ToString("F2") + unit;
            accountStatsValue[8]  = MaxMoneyBalance.ToString("F2") + unit;
            accountStatsValue[9]  = MaxMoneyDrawdown.ToString("F2") + unit;
            accountStatsValue[10] = MaxMoneyEquityDrawdown.ToString("F2") + unit;
            accountStatsValue[11] = MoneyEquityPercentDrawdown.ToString("F2") + " %";
            accountStatsValue[12] = GrossMoneyProfit.ToString("F2") + unit;
            accountStatsValue[13] = GrossMoneyLoss.ToString("F2") + unit;
            accountStatsValue[14] = SentOrders.ToString();
            accountStatsValue[15] = ExecutedOrders.ToString();
            accountStatsValue[16] = TradedLots.ToString("F2");
            accountStatsValue[17] = WinningTrades.ToString();
            accountStatsValue[18] = LosingTrades.ToString();
            accountStatsValue[19] = WinLossRatio.ToString("F2");
            accountStatsValue[20] = TimeInPosition.ToString() + " %";
            accountStatsValue[21] = TotalChargedMoneySpread.ToString("F2") + unit;
            accountStatsValue[22] = TotalChargedMoneyRollOver.ToString("F2") + unit;
            accountStatsValue[23] = TotalChargedMoneyCommission.ToString("F2") + unit;
            accountStatsValue[24] = TotalChargedMoneySlippage.ToString("F2") + unit;
            accountStatsValue[25] = (TotalChargedMoneySpread + TotalChargedMoneyRollOver + TotalChargedMoneyCommission + TotalChargedMoneySlippage).ToString("F2") + unit;
            accountStatsValue[26] = (NetMoneyBalance + TotalChargedMoneySpread + TotalChargedMoneyRollOver + TotalChargedMoneyCommission + TotalChargedMoneySlippage).ToString("F2") + unit;

            if (InstrProperties.PriceIn == Configs.AccountCurrency)
            {
                accountStatsValue[27] = Language.T("Not used");
            }
            else if (InstrProperties.InstrType == Instrumet_Type.Forex && Symbol.StartsWith(Configs.AccountCurrency))
            {
                accountStatsValue[27] = Language.T("Deal price");
            }
            else if (Configs.AccountCurrency == "USD")
            {
                accountStatsValue[27] = InstrProperties.RateToUSD.ToString("F4");
            }
            else if (Configs.AccountCurrency == "EUR")
            {
                accountStatsValue[27] = InstrProperties.RateToEUR.ToString("F4");
            }

            accountStatsFlag    = new bool[28];
            accountStatsFlag[0] = ambiguousBars > 0 && !isScanned;
            accountStatsFlag[1] = interpolationMethod != InterpolationMethod.Pessimistic;
            accountStatsFlag[2] = ambiguousBars > 0;
            accountStatsFlag[6] = NetMoneyBalance < Configs.InitialAccount;
            accountStatsFlag[9] = MaxDrawdown > Configs.InitialAccount / 2;

            return;
        }
Esempio n. 8
0
        /// <summary>
        ///     Generate the Account Statistics in points.
        /// </summary>
        private static void GenerateAccountStats()
        {
            AccountStatsParam = new[]
            {
                Language.T("Intrabar scanning"),
                Language.T("Interpolation method"),
                Language.T("Ambiguous bars"),
                Language.T("Profit per day"),
                Language.T("Sharpe ratio"),
                Language.T("Max consecutive losses"),
                Language.T("Tested bars"),
                Language.T("Account balance"),
                Language.T("Minimum account"),
                Language.T("Maximum account"),
                Language.T("Maximum drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Gross profit"),
                Language.T("Gross loss"),
                Language.T("Sent orders"),
                Language.T("Executed orders"),
                Language.T("Traded lots"),
                Language.T("Winning trades"),
                Language.T("Losing trades"),
                Language.T("Win/loss ratio"),
                Language.T("Time in position"),
                Language.T("Charged spread"),
                Language.T("Charged rollover"),
                Language.T("Charged commission"),
                Language.T("Charged slippage"),
                Language.T("Total charges"),
                Language.T("Balance without charges")
            };

            string unit = " " + Language.T("points");

            AccountStatsValue = new string[AccountStatsParam.Length];
            int i = 0;

            AccountStatsValue[i++] = IsScanPerformed ? Language.T("Accomplished") : Language.T("Not accomplished");
            AccountStatsValue[i++] = InterpolationMethodShortToString();
            AccountStatsValue[i++] = AmbiguousBars.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = ProfitPerDay + unit;
            AccountStatsValue[i++] = SharpeRatio.ToString("F2");
            AccountStatsValue[i++] = MaxConsecutiveLosses.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = (Bars - FirstBar).ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = NetBalance + unit;
            AccountStatsValue[i++] = MinBalance + unit;
            AccountStatsValue[i++] = MaxBalance + unit;
            AccountStatsValue[i++] = MaxDrawdown + unit;
            AccountStatsValue[i++] = MaxEquityDrawdown + unit;
            AccountStatsValue[i++] = EquityPercentDrawdown.ToString("F2") + " %";
            AccountStatsValue[i++] = GrossProfit + unit;
            AccountStatsValue[i++] = GrossLoss + unit;
            AccountStatsValue[i++] = SentOrders.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = ExecutedOrders.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = TradedLots.ToString("F2");
            AccountStatsValue[i++] = WinningTrades.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = LosingTrades.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = ((float)WinningTrades / (WinningTrades + LosingTrades)).ToString("F2");
            AccountStatsValue[i++] = TimeInPosition + " %";
            AccountStatsValue[i++] = Math.Round(TotalChargedSpread) + unit;
            AccountStatsValue[i++] = Math.Round(TotalChargedRollOver) + unit;
            AccountStatsValue[i++] = Math.Round(TotalChargedCommission) + unit;
            AccountStatsValue[i++] = TotalChargedSlippage.ToString("F2") + unit;
            AccountStatsValue[i++] = Math.Round(TotalChargedSpread + TotalChargedRollOver + TotalChargedSlippage) + unit;
            AccountStatsValue[i++] = Math.Round(NetBalance + TotalChargedSpread + TotalChargedRollOver + TotalChargedSlippage) + unit;

            AccountStatsFlags     = new bool[AccountStatsParam.Length];
            AccountStatsFlags[0]  = AmbiguousBars > 0 && !IsScanPerformed;
            AccountStatsFlags[1]  = InterpolationMethod != InterpolationMethod.Pessimistic;
            AccountStatsFlags[2]  = AmbiguousBars > 0;
            AccountStatsFlags[5]  = MaxConsecutiveLosses > 6;
            AccountStatsFlags[7]  = NetBalance < 0;
            AccountStatsFlags[10] = MaxDrawdown > 500;
        }
Esempio n. 9
0
        /// <summary>
        ///     Generate the Account Statistics in currency.
        /// </summary>
        private static void GenerateAccountStatsInMoney()
        {
            AccountStatsParam = new[]
            {
                Language.T("Intrabar scanning"),
                Language.T("Interpolation method"),
                Language.T("Ambiguous bars"),
                Language.T("Profit per day"),
                Language.T("Sharpe ratio"),
                Language.T("Max consecutive losses"),
                Language.T("Tested bars"),
                Language.T("Initial account"),
                Language.T("Account balance"),
                Language.T("Minimum account"),
                Language.T("Maximum account"),
                Language.T("Maximum drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Max equity drawdown"),
                Language.T("Gross profit"),
                Language.T("Gross loss"),
                Language.T("Sent orders"),
                Language.T("Executed orders"),
                Language.T("Traded lots"),
                Language.T("Winning trades"),
                Language.T("Losing trades"),
                Language.T("Win/loss ratio"),
                Language.T("Time in position"),
                Language.T("Charged spread"),
                Language.T("Charged rollover"),
                Language.T("Charged commission"),
                Language.T("Charged slippage"),
                Language.T("Total charges"),
                Language.T("Balance without charges"),
                Language.T("Account exchange rate")
            };

            string unit = " " + Configs.AccountCurrency;

            AccountStatsValue = new string[AccountStatsParam.Length];
            int i = 0;

            AccountStatsValue[i++] = IsScanPerformed ? Language.T("Accomplished") : Language.T("Not accomplished");
            AccountStatsValue[i++] = InterpolationMethodShortToString();
            AccountStatsValue[i++] = AmbiguousBars.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = MoneyProfitPerDay.ToString("F2") + unit;
            AccountStatsValue[i++] = SharpeRatio.ToString("F2");
            AccountStatsValue[i++] = MaxConsecutiveLosses.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = (Bars - FirstBar).ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = Configs.InitialAccount.ToString("F2") + unit;
            AccountStatsValue[i++] = NetMoneyBalance.ToString("F2") + unit;
            AccountStatsValue[i++] = MinMoneyBalance.ToString("F2") + unit;
            AccountStatsValue[i++] = MaxMoneyBalance.ToString("F2") + unit;
            AccountStatsValue[i++] = MaxMoneyDrawdown.ToString("F2") + unit;
            AccountStatsValue[i++] = MaxMoneyEquityDrawdown.ToString("F2") + unit;
            AccountStatsValue[i++] = MoneyEquityPercentDrawdown.ToString("F2") + " %";
            AccountStatsValue[i++] = GrossMoneyProfit.ToString("F2") + unit;
            AccountStatsValue[i++] = GrossMoneyLoss.ToString("F2") + unit;
            AccountStatsValue[i++] = SentOrders.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = ExecutedOrders.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = TradedLots.ToString("F2");
            AccountStatsValue[i++] = WinningTrades.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = LosingTrades.ToString(CultureInfo.InvariantCulture);
            AccountStatsValue[i++] = WinLossRatio.ToString("F2");
            AccountStatsValue[i++] = TimeInPosition + " %";
            AccountStatsValue[i++] = TotalChargedMoneySpread.ToString("F2") + unit;
            AccountStatsValue[i++] = TotalChargedMoneyRollOver.ToString("F2") + unit;
            AccountStatsValue[i++] = TotalChargedMoneyCommission.ToString("F2") + unit;
            AccountStatsValue[i++] = TotalChargedMoneySlippage.ToString("F2") + unit;
            AccountStatsValue[i++] =
                (TotalChargedMoneySpread + TotalChargedMoneyRollOver + TotalChargedMoneyCommission +
                 TotalChargedMoneySlippage).ToString("F2") + unit;
            AccountStatsValue[i++] =
                (NetMoneyBalance + TotalChargedMoneySpread + TotalChargedMoneyRollOver + TotalChargedMoneyCommission +
                 TotalChargedMoneySlippage).ToString("F2") + unit;

            if (InstrProperties.PriceIn == Configs.AccountCurrency)
            {
                AccountStatsValue[i++] = Language.T("Not used");
            }
            else if (InstrProperties.InstrType == InstrumetType.Forex && Symbol.StartsWith(Configs.AccountCurrency))
            {
                AccountStatsValue[i++] = Language.T("Deal price");
            }
            else if (Configs.AccountCurrency == "USD")
            {
                AccountStatsValue[i++] = InstrProperties.RateToUSD.ToString("F4");
            }
            else if (Configs.AccountCurrency == "EUR")
            {
                AccountStatsValue[i++] = InstrProperties.RateToEUR.ToString("F4");
            }

            AccountStatsFlags     = new bool[AccountStatsParam.Length];
            AccountStatsFlags[0]  = AmbiguousBars > 0 && !IsScanPerformed;
            AccountStatsFlags[1]  = InterpolationMethod != InterpolationMethod.Pessimistic;
            AccountStatsFlags[2]  = AmbiguousBars > 0;
            AccountStatsFlags[5]  = MaxConsecutiveLosses > 6;
            AccountStatsFlags[8]  = NetMoneyBalance < Configs.InitialAccount;
            AccountStatsFlags[11] = MaxDrawdown > Configs.InitialAccount / 2;
        }