Thanks Tooz! Never occurred to me that the values could have more decimal places than my actual data, which only goes to four. But that was in fact the issue.
--- In [email protected], "tuzo_wilson" <j.tuzo.wil...@...> wrote: > > --- In [email protected], "ozzyapeman" <zoopfree@> wrote: > > > > Tuzo, > > > > Thanks for the cleaner code and division by 0 catch (and for staying up > > late!) > > I was up anyway. :) > > > I assume that this part: "if ( PairFrequency != 0 )..." should be part > > of the barcount loop. But either way, it does not work. > > In your first example the avg calculation was in the loop so the avg > was only calculated if there was a buy signal so you would never have > a division by zero error. But, you don't need to calculate the > average every iteration -- just at the end. > > > There is still a mysterious bug. Now all values of DistanceMin are 0, > > even though by definition they have to be greater than 0. > > I think the logic is OK. Your issue is formatting related. In the line: > > StrFormat( "%.0f,%.0f,%.0f,%.4f,%.4f\n", PairFrequency, Fast, Slow, > DistanceMin, DistanceAvg ) > > You are only printing out the first 4 decimal places (rounded). So if > your min is small (e.g. 0.00002) then it will show as zero. Remove > the formatting and change it to: > > StrFormat( "%.0f,%.0f,%.0f,%f,%f\n", PairFrequency, Fast, Slow, > DistanceMin, DistanceAvg ) > > and you should see the correct values. Here is what I get: > > 798,5,15,0.000020,0.056575 > > Good luck...remember that _TRACE is your friend! > > > Tuzo > > > > The code logic seems so straightforward, it's hard to figure out why > > this isn't working just as is. > > > > Anyone? > > > > > > > > --- In [email protected], "tuzo_wilson" <j.tuzo.wilson@> > > wrote: > > > > > > --- In [email protected], "ozzyapeman" zoopfree@ wrote: > > > > > > Ozzy, > > > > > > You've got a lot going on there. :) > > > > > > It's 1:30am here so I don't have time to go into it all but this > > should > > > hopefully do what you want. Take a look and see if it helps. > > > > > > > > > // > > > > > ----------------------------------------------------------------------- > > > > > > // SIMPLE TRADING SYSTEM > > > > > > // > > > > > ----------------------------------------------------------------------- > > > > > > > > > > > > BuyPrice = SellPrice = ShortPrice = CoverPrice = Close; > > > > > > > > > > > > > > > > > > Fast = Optimize( "fast", 5, 5, 10, 1 ); > > > > > > Slow = Optimize( "Slow", 15, 10, 15, 1 ); > > > > > > > > > > > > FastMA = MA( C, Fast ); > > > > > > SlowMA = MA( C, Slow ); > > > > > > > > > > > > Buy = Cross( Close, FastMA ); > > > > > > Sell = Cross( SlowMA, Close ); > > > > > > > > > > > > Short = Sell; > > > > > > Cover = Buy; > > > > > > > > > > > > > > > > > > // > > > > > ----------------------------------------------------------------------- > > > > > > // DUMP STATS TO FILE: Distance between the Close and FastMA @ Buy > > > > > > // > > > > > ----------------------------------------------------------------------- > > > > > > > > > > > > > > > > > > // For each Fast/Slow Pair buy, dump stats to a file. > > > > > > // Find the Minimum and Average Distances for each Pair. > > > > > > > > > > > > > > > > > > Distance = Close - FastMA; > > > > > > > > > > > > PairFrequency = 0; > > > > > > > > > > > > DistanceMin = DistanceSum = DistanceAvg = 0; > > > > > > > > > > > > for ( i = 0; i < BarCount - 1; i++ ) > > > > > > { > > > > > > if ( Buy[i] ) > > > > > > { > > > > > > // If current distance is less than the current min or this > > is > > > the first time > > > > > > // then set DistanceMin > > > > > > if ( Distance[i] < DistanceMin || PairFrequency == 0 ) > > > > > > { > > > > > > DistanceMin = Distance[i]; > > > > > > } > > > > > > > > > > > > PairFrequency++; > > > > > > > > > DistanceSum += Distance[i]; > > > > > > } > > > > > > } > > > > > > > > > > > > // Avoid division by zero error otherwise may show 1.#INF > > > > > > if ( PairFrequency != 0 ) > > > > > > { > > > > > > DistanceAvg = DistanceSum / PairFrequency; > > > > > > } > > > > > > > > > > > > fh = fopen( "C:\\DistanceStats.csv", "a" ); // a = appending, write > > our > > > stats to file > > > > > > > > > > > > if ( fh ) > > > > > > { > > > > > > fputs( StrFormat( "%.0f,%.0f,%.0f,%.4f,%.4f\n", PairFrequency, > > Fast, > > > Slow, DistanceMin, DistanceAvg ), fh ); > > > > > > fclose( fh ); > > > > > > } > > > > > > > > > > > > > > > > > > Tuzo > > > > > > > > > > > > > Hello, hoping someone can help spot the bug in this rather simple > > > code. > > > > I can't seem to find the flaw. > > > > > > > > All I am trying to do is optimize over a pair of variables, and dump > > a > > > > database to a file that contains some stats for each winning pair. > > > > Namely, I want to calculate the minimum distance between the Close > > and > > > > FastMA, as well as the average distance - over all the Buys for each > > > > pair of optimization variables. > > > > > > > > While everything appears to work fine, the problem is that sometimes > > > the > > > > minimum is larger than the average! And of course, that cannot be. > > If > > > > you run an optimization and open up the resulting CSV file, you will > > > see > > > > what I mean. > > > > > > > > I've been staring at this loop for hours, and just can't see how it > > > can > > > > be wrong. But of course it must be. It's probably something obvious > > > that > > > > my brain is overlooking. Any input much appreciated! > > > > > > > > > > > > // > > > > > > > > > ----------------------------------------------------------------------- > > > > // SIMPLE TRADING SYSTEM > > > > // > > > > > > > > > ----------------------------------------------------------------------- > > > > > > > > BuyPrice = SellPrice = ShortPrice = CoverPrice = Close; > > > > > > > > > > > > Fast = Optimize( "fast", 5, 5, 10, 1 ); > > > > Slow = Optimize( "Slow", 15, 10, 15, 1 ); > > > > > > > > FastMA = MA(C, Fast); > > > > SlowMA = MA(C, Slow); > > > > > > > > Buy = Cross( Close, FastMA); > > > > Sell = Cross( SlowMA, Close); > > > > > > > > Short = Sell; > > > > Cover = Buy; > > > > > > > > > > > > // > > > > > > > > > ----------------------------------------------------------------------- > > > > // DUMP STATS TO FILE: Distance between the Close and FastMA @ Buy > > > > // > > > > > > > > > ----------------------------------------------------------------------- > > > > > > > > > > > > // For each Fast/Slow Pair buy, dump stats to a file. > > > > // Find the Minimum and Average Distances for each Pair. > > > > > > > > > > > > Distance = Close - FastMA; > > > > > > > > PairFrequency = 0; > > > > > > > > DistanceMin = DistanceSum = DistanceAvg = DistanceOld = 0; > > > > > > > > for (i = 0; i < BarCount - 1; i++) > > > > { > > > > if(Buy[i]) > > > > { > > > > PairFrequency++; > > > > > > > > if(Distance[i] < DistanceOld) DistanceMin = Distance[i]; > > > > > > > > DistanceSum = DistanceSum + Distance[i]; > > > > DistanceAvg = DistanceSum/PairFrequency; > > > > > > > > DistanceOld = Distance[i]; > > > > } > > > > } > > > > > > > > fh = fopen( "C:\\DistanceStats.csv", "a" ); // a = appending, write > > > our > > > > stats to file > > > > > > > > if ( fh ) > > > > { > > > > fputs( StrFormat( "%.0f,%.0f,%.0f,%.4f,%.4f\n", PairFrequency, > > > Fast, > > > > Slow, DistanceMin, DistanceAvg), fh ); > > > > fclose( fh ); > > > > } > > > > > > > > > >
