I think that (at least part of) the issue with the original code is that
Range1 = Array > 0 AND Array <= 1.1000;
Range2 = Array > 1.1000 AND Array <= 1.2000;
Range3 = Array > 1.2000 AND Array <= 1.3000;
Range4 = Array > 1.3000;
Range1-4 are actually ARRAYS, but are subsequently treated as if they
were Scalars.
In my testing so far, treating an ARRAY like a scalar seems to
silently use the last value of the ARRAY - leading to no end of
confusion if you don't catch the original error in the first place!
--- In [email protected], "ozzyapeman" <zoopf...@...> wrote:
>
> Hello, hoping someone can point out the general flaw in logic here. Even
> though I've been working with AFL for six months now, array vs scalars
> can still be confusing. All I'm trying to do is pass an array to a
> function that tests it's range. The program then sets a Buy according
> to that range. An optimization is performed to find the "best" range
> for a given period.
>
> Of course this is not my actual trading system, but merely a test of
> concept for much a more complicated function.
>
> By definition, the Close price has to fall into one of the four ranges
> defined in the function. I am using Forex, but any symbol will do, and
> would fall into one of the four ranges. Therefore, running the
> Optimization should generate some trades, as the Buy condition will be
> true eventually, as we cycle through the "RangeTest" variable for each
> bar. But no trades are generated.
>
> Traces indicate that the Close array is not being cycled through.
>
> Shouldn't the following code work, without having to get into a Barcount
> loop? If not, where is the flaw? Any help much appreciated.
>
>
> RangeTest = Optimize("RangeTest", 1, 1, 4, 1);
>
>
> function RangeFind(Array)
> {
> ActualRange = 0;
>
> Range1 = Array > 0 AND Array <= 1.1000;
> Range2 = Array > 1.1000 AND Array <= 1.2000;
> Range3 = Array > 1.2000 AND Array <= 1.3000;
> Range4 = Array > 1.3000;
>
> for( n = 1; n <=4; n++)
> {
>
> RangeN = VarGet( "Range"+ NumToStr(n, 1.0,0) );
>
> if (RangeN) ActualRange = n;
>
> }
>
> return ActualRange;
> }
>
>
> Buy = RangeFind(Close) == RangeTest;
>
> Sell = BarsSince(Buy) > 6;
>