Hello,

My function below is part of a program that compiles and runs. The core of the program is in the function below. The issue is that the variable named "PNL" below as well as "CumLoss" and "CumProfit" don't reset to 0 when the loop "L" restarts. So the output in the output file ends up being a cumulative PNL and cumulative CumLoss and CumProfit instead of the PNL for each individual run of Loop "L".

So the output looks like this:

262.75 60.7542 0.832699 1.28905
735.5 61.9823 0.875953 1.42811
1074.5 62.2238 0.857014 1.41165

Focus on the first column above only, which is the PNL column. What it should look like is this:

262.75
472.75 (which is 735.5 - 262.75)
339 (which is 1074.5 - 735.5)

So as you can see the current output is cumulative, instead of outputting each individual run of Loop L (I've set to 3 loops only here to simplify)

Any ideas what I've got wrong in the code below?

Thanks much!
TR

``````    int BackTest (PriceList& pl, std::vector <Metrics>& R, std::vector <unsigned>& ra, std::vector <unsigned>& h )

{

for( size_t i = 1; i < pl.size(); ++ i )

{
if (random conditions)
{
h.push_back (pl[i].Index);
}
}

int WinCount = 0;
int LossCount = 0;
double CumLoss = 0;
double CumProfit = 0;
double PNL = 0;

for (size_t L = 0; L < 3; ++L) // Monte Carlo loop starts

{
// set variables to 0 for each loop
PNL = 0;
CumLoss = 0;
CumProfit = 0;

//randomize the vector of prices
std::srand(std::time(0));

std::random_shuffle (h.begin(), h.end());

for (size_t r = 0; r < 717; ++ r )

{
ra.push_back (h[r]);
std::sort (ra.begin(), ra.end() );

}

for (std::size_t i=1; i< ra.size(); ++i)
{

unsigned r = ra[i];

for (unsigned z=1; z<6; ++z)

{

if ( r+z < pl.size() )

{
double SEntry = (pl[r-1].Low - 0.5);
double StopPrice = (pl[r-1].High + 0.5);

if (pl[r+z].High >= StopPrice)
{
++LossCount;
double Loss = SEntry - StopPrice;
CumLoss+= Loss;
break;

}

if(z!=5)

{
if((pl[r+z].High < StopPrice) && (abs(SEntry - pl[r+z].Close) >= 0) )
{
++z;
}
}

else // else 1
{
if((pl[r+z].High < StopPrice) && (abs(SEntry - pl[r+z].Close) >= 0) )

{
++WinCount;
double Profit = abs(SEntry - pl[r+z].Close);
CumProfit+= Profit;
break;
}

else // else 2
{
if( (pl[r+z].High > StopPrice) )

{
++LossCount;
double Loss = SEntry - StopPrice;
CumLoss+= Loss;
break;

}

} //else2

} //else1

} //if r+z

} //for (unsigned z=1; z<6; ++z)

} // for (std::size_t i=1; i< ra.size(); ++i)

PNL = CumLoss + CumProfit;
double numerator = (double) WinCount + LossCount;
double WinLoss =  (double) WinCount / numerator * 100;
double WL = (double) WinCount / numerator;
double AvgWin = CumProfit / WinCount;
double AvgLoss = abs(CumLoss / LossCount);
double Payoff = AvgWin/AvgLoss;
double ProfitFactor =( (WL*AvgWin)/ ((abs(1-WL))*AvgLoss) );

std::cout << PNL << std::endl;
std::cout << CumLoss << std::endl;
std::cout << CumProfit << std::endl;

R.push_back (Metrics ( PNL, WinLoss, Payoff, ProfitFactor));

std::ofstream fout( "BackTestResults.txt");

for( size_t i = 0; i < R.size(); ++ i )
{
fout << R[i].PNL << "\t" << R[i].WinLoss << "\t" << R[i].Payoff << "\t" << R[i].ProfitFactor << std::endl;
}

} //big Loop ends (intended for monte carlo sim)

return 0;
}
``````

I don't see anything that could cause the problem you describe. I'm wondering though if `CumLoss` is represented as a positive integer and then added to `CumProfit`, could that be skewing your results to give the effect you observe? If not, you'll most likely have to submit enough of the rest of your code so that someone else will be able to try and duplicate your results.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.