Yes, my thanks also Graham. That's a paradigm I'm going to have to keep in my mind for AB - __
Instead of setting each cell in one array to one of N values, set each cell in N arrays to 1. Then, let Param() or Optimize() choose the active array via VarGet(). __ Would that there was a book, with one of these "AFL Pearls of Wisdom" on each page! --- In [email protected], "ozzyapeman" <zoopf...@...> wrote: > > Thanks Graham. Neat little solution, and much faster! > > > --- In [email protected], Graham <kavemanperth@> wrote: > > > > Here is another possible solution that should work > > > > RangeTest = param("RangeTest", 1, 1, 4, 1); > > array = c; > > 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; > > > > buy = varget( "Range"+rangetest ); > > > > > > -- > > Cheers > > Graham Kav > > AFL Writing Service > > http://www.aflwriting.com > > > > > > 2009/1/18 ozzyapeman <zoopfree@>: > > > Prog - thanks very much for the code. > > > > > > Very thorough with the traces, and gives me more insight into the > > > issues of arrays vs scalars. I will play around with this some more... > > > > > > > > > --- In [email protected], "progster01" <progster@> wrote: > > >> > > >> Accepting the use of a loop, here is a variation ala the original, > > >> that works as intended, but without using a function: > > >> > > >> { > > >> RangeLoopDemo_01.afl > > >> > > >> by Progster, responding to: > > >> http://finance.groups.yahoo.com/group/amibroker/message/134007 > > >> > > >> } > > >> > > >> RangeTest = Optimize("RangeTest", 1, 1, 4, 1); > > >> > > >> Array = Close; // choose an array for > division into ranges > > >> > > >> // ActualRange = 0; > > >> > > >> // Set some range division values. > > >> RDV1 = 3000; > > >> RDV2 = 3500; > > >> RDV3 = 4000; > > >> RDV4 = 4500; > > >> > > >> // Note: Range1-4 are ARRAYS, not Scalars > > >> Range1 = IIf(Array > 0 AND Array <= RDV1, 1, 0); > > >> Range2 = IIf(Array > RDV1 AND Array <= RDV2, 1, 0); > > >> Range3 = IIf(Array > RDV2 AND Array <= RDV3, 1, 0); > > >> Range4 = IIf(Array > RDV4, 1, 0); > > >> > > >> // Tracing an array is invalid, unless you are in a loop and > setting > > >> indexes > > >> /* > > >> _TRACE( "Array: " + NumToStr(Array, 1.1, 0) ) ; > > >> _TRACE( "Range1: " + NumToStr(Range1, 1.0, 0) ) ; > > >> _TRACE( "Range2: " + NumToStr(Range2, 1.0, 0) ) ; > > >> _TRACE( "Range3: " + NumToStr(Range3, 1.0, 0) ) ; > > >> _TRACE( "Range4: " + NumToStr(Range4, 1.0, 0) ) ; > > >> */ > > >> > > >> // This works as intended (but somewhat slow) > > >> for( idx = 0; idx < BarCount; idx++ ) > > >> { > > >> // These traces work. Uncomment to see it. > > >> /* > > >> _TRACE( "Array[" + NumToStr(idx, 1.0) + "]: " + > NumToStr(Array[idx], > > >> 1.2, 1) ) ; > > >> _TRACE( "Range1[" + NumToStr(idx, 1.0) + "]: " + > > >> NumToStr(Range1[idx], 1.2, 1) ) ; > > >> _TRACE( "Range2[" + NumToStr(idx, 1.0) + "]: " + > > >> NumToStr(Range2[idx], 1.2, 1) ) ; > > >> _TRACE( "Range3[" + NumToStr(idx, 1.0) + "]: " + > > >> NumToStr(Range3[idx], 1.2, 1) ) ; > > >> _TRACE( "Range4[" + NumToStr(idx, 1.0) + "]: " + > > >> NumToStr(Range4[idx], 1.2, 1) ) ; > > >> */ > > >> > > >> if (Range1[idx] == 1) ActualRange[idx] = 1; > > >> if (Range2[idx] == 1) ActualRange[idx] = 2; > > >> if (Range3[idx] == 1) ActualRange[idx] = 3; > > >> if (Range4[idx] == 1) ActualRange[idx] = 4; > > >> > > >> // _TRACE( "ActualRange[" + NumToStr(idx, 1.0) + "]: " + > > >> NumToStr(ActualRange[idx], 1.0, 1) ) ; > > >> > > >> } > > >> > > >> Short = Cover = 0 ; > > >> > > >> Buy = (ActualRange == RangeTest) ; > > >> > > >> Sell = BarsSince(Buy) > 3; > > >> > > >> > > >> > > >> > > >> --- In [email protected], "progster01" <progster@> wrote: > > >> > > > >> > 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" <zoopfree@> 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; > > >> > > > > >> > > > >> > > > > > >
