[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Testing the Range of an Array with an Optimization



PureBytes Links

Trading Reference Links

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 amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@xxx> wrote:
>
> Thanks Graham. Neat little solution, and much faster!
> 
> 
> --- In amibroker@xxxxxxxxxxxxxxx, 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 amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, "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;
> > >> > >
> > >> >
> > >>
> > >
> >
>



------------------------------------

**** IMPORTANT ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

*********************
TO GET TECHNICAL SUPPORT from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com
*********************

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html

*********************************
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/