コード例 #1
0
ファイル: Program.cs プロジェクト: zzhenyanglu/Git
        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);
        }
コード例 #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
        }
コード例 #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();
        }
コード例 #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;
                }
            }
        }
コード例 #5
0
ファイル: Core.cs プロジェクト: weppyk/QuantResearchDev
        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)
            {
            }
        }
コード例 #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;
        }
コード例 #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;
        }
コード例 #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;
        }
コード例 #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;
        }