/// <summary> /// Updates the journal data from the backtester /// </summary> private void UpdateJournalData() { if (!Data.IsResult) { return; } journalData = new string[positions, columns]; positionIcons = new Image[shownPos]; for (int pos = firstPos; pos < firstPos + shownPos; pos++) { int row = pos - firstPos; journalData[row, 0] = (StatsBuffer.PosNumb(SelectedBar, pos) + 1).ToString(CultureInfo.InvariantCulture); journalData[row, 1] = Language.T(StatsBuffer.PosTransaction(SelectedBar, pos).ToString()); journalData[row, 2] = Language.T(StatsBuffer.PosDir(SelectedBar, pos).ToString()); journalData[row, 3] = Configs.AccountInMoney ? (StatsBuffer.PosDir(SelectedBar, pos) == PosDirection.Short ? "-" : "") + (StatsBuffer.PosLots(SelectedBar, pos) * Data.InstrProperties.LotSize) : StatsBuffer.PosLots(SelectedBar, pos).ToString(CultureInfo.InvariantCulture); journalData[row, 4] = (StatsBuffer.PosOrdNumb(SelectedBar, pos) + 1).ToString(CultureInfo.InvariantCulture); journalData[row, 5] = StatsBuffer.PosOrdPrice(SelectedBar, pos).ToString(Data.Ff); journalData[row, 6] = StatsBuffer.PosPrice(SelectedBar, pos).ToString(Data.Ff); // Profit Loss if (StatsBuffer.PosTransaction(SelectedBar, pos) == Transaction.Close || StatsBuffer.PosTransaction(SelectedBar, pos) == Transaction.Reduce || StatsBuffer.PosTransaction(SelectedBar, pos) == Transaction.Reverse) { journalData[row, 7] = Configs.AccountInMoney ? StatsBuffer.PosMoneyProfitLoss(SelectedBar, pos).ToString("F2") : Math.Round(StatsBuffer.PosProfitLoss(SelectedBar, pos)) .ToString(CultureInfo.InvariantCulture); } else { journalData[row, 7] = "-"; } // Floating Profit Loss if (pos == positions - 1 && StatsBuffer.PosTransaction(SelectedBar, pos) != Transaction.Close) { // Last bar position only journalData[row, 8] = Configs.AccountInMoney ? StatsBuffer.PosMoneyFloatingPL(SelectedBar, pos).ToString("F2") : Math.Round(StatsBuffer.PosFloatingPL(SelectedBar, pos)) .ToString(CultureInfo.InvariantCulture); } else { journalData[row, 8] = "-"; } // Icons positionIcons[row] = Position.PositionIconImage(StatsBuffer.PosIcon(SelectedBar, pos)); } }
/// <summary> /// Calculates Data to draw in histogram /// </summary> private static void CalculateHistogramData() { // crummy way to get number of trades for init array // TBD -- find better property int ctr = 0; for (int bar = 0; bar < Data.Bars; bar++) { for (int pos = 0; pos < StatsBuffer.Positions(bar); pos++) { Transaction transaction = StatsBuffer.PosTransaction(bar, pos); if (transaction == Transaction.Close || transaction == Transaction.Reduce || transaction == Transaction.Reverse) { ctr++; } } } _tradeResults = new int[ctr]; ctr = 0; for (int bar = 0; bar < Data.Bars; bar++) { for (int pos = 0; pos < StatsBuffer.Positions(bar); pos++) { Transaction transaction = StatsBuffer.PosTransaction(bar, pos); if (transaction == Transaction.Close || transaction == Transaction.Reduce || transaction == Transaction.Reverse) { _tradeResults[ctr] = (int)StatsBuffer.PosProfitLoss(bar, pos); ctr++; } } } int min = 0; int max = 0; foreach (int result in _tradeResults) { if (min > result) { min = result; } if (max < result) { max = result; } } _tradeIndexes = new int[(max - min) + 1]; _tradeCounts = new int[(max - min) + 1]; _tradeCumulatives = new int[(max - min) + 1]; // fill _tradeIndexes with index values, then count how many in _tradeResults for (int ctr1 = 0; ctr1 < _tradeIndexes.Length; ctr1++) { _tradeIndexes[ctr1] = min + ctr1; int count = 0; for (int ctr2 = 0; ctr2 < _tradeResults.Length; ctr2++) { if (_tradeResults[ctr2] == _tradeIndexes[ctr1]) { count++; } } _tradeCounts[ctr1] = count; _tradeCumulatives[ctr1] = _tradeIndexes[ctr1] * count; } }
private static double GetProfit(int bar, int pos) { return(Configs.AccountInMoney ? StatsBuffer.PosMoneyProfitLoss(bar, pos) : StatsBuffer.PosProfitLoss(bar, pos)); }