--- In [email protected], "ozzyapeman" <zoopf...@...> 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 ); > > > } > > > > > >
