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

[amibroker] Re: What is wrong with these 3 lines of code?



PureBytes Links

Trading Reference Links

Given that this same question gets asked over and over again, it might 
be worth adding an example to that tutorial explicitly illustrating 
what would happen in a self referencing calculation.

Yes, many people simply have not read the tutorial. But for those that 
have, it would seem that a significant percentage of readers still do 
not realize that a temporary array is being created in that situation.

Mike

--- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx> 
wrote:
>
> It is easy to understand, if only you READ THE
> tutorial section of the guide:
> 
> http://www.amibroker.com/guide/h_understandafl.html
> 
> All tutorial is must-read.
> =================
> 
> People are crying for help while in fact
> everything you need to read is in the TUTORIAL section
> of the guide.
> This single short section of the tutorial
> http://www.amibroker.com/guide/h_understandafl.html
> 
> is absolute must-read and should be read and repeated.
> 
> Best regards,
> Tomasz Janeczko
> amibroker.com
> ----- Original Message ----- 
> From: "ian_rosbif" <ian_rosbif@xxx>
> To: <amibroker@xxxxxxxxxxxxxxx>
> Sent: Tuesday, November 18, 2008 6:52 PM
> Subject: [amibroker] Re: What is wrong with these 3 lines of code?
> 
> 
> > You're not dumb, it is rather difficult to understand! Using your 
> > example and assuming 11 bars in each array:
> > Before the 1st statement, auxCrossedIntermed = "00000000000",
> > After the 1st statement, auxCrossedIntermed = "00000000010"
> > 
> > Before the 2nd statement, CrossedIntermed = "00000000000",
> > and Ref(CrossedIntermed, -1) = "0000000000"... Amibroker 
effectivley 
> > treats the Ref... part of the statement as if it was a temporary 
copy 
> > of the CrossedIntermed statement taken before the 2nd statement 
began 
> > execution (note that there are only 10 elements in this copy 
array).
> > Changes made to CrossIntermed during the 2nd statement by moving 
> > values from AuxCrossedIntermed are not reflected in the copy 
array. 
> > therefore the Ref... clause always copies zero in this scenario.
> > 
> > I hope this clarifies it, but as I said before, the same thing got 
me 
> > when I first started out with AB...took me a couple of weeks to 
> > finally realise what was going on.
> > 
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "nunopires2001" <nunopires2001@> 
> > wrote:
> >>
> >> Thanks for the answer.
> >> 
> >> To be honest, i am feeling really dumb, since i didn't understand 
> > the
> >> explanation.
> >> 
> >> Please suppose the following scenario:
> >> 
> >> Low[9]=950
> >> Intermed[9]=970
> >> High[9]=1000
> >> 
> >> auxCrossedIntermed=IIf(Low< Intermed AND High> Intermed,1,0);
> >> CrossedIntermed=auxCrossedIntermed OR Ref(CrossedIntermed,-1);
> >> 
> >> On the bar #10, how will Amibroker evaluate the second formula?
> >> During the evaluation, what will be the values for 
> > auxCrossedIntermed
> >>  and Ref(CrossedIntermed,-1) ?
> >> 
> >> 
> >> Best Regards!
> >> 
> >> 
> >> --- In amibroker@xxxxxxxxxxxxxxx, "ian_rosbif" <ian_rosbif@> 
wrote:
> >> >
> >> > Hi,
> >> > Are you trying use "...OR Ref(CrossedIntermed,-1);" to get the 
> > cross 
> >> > to persist in CrossedIntermed? In other words, if the cross 
> > occurs at 
> >> > 11:45, the following 15 elements of Crossintermed should be "1" 
> > until 
> >> > 12:01, when they should then all have "666" in them?
> >> > 
> >> > In which case, the problem lies with the "circular" nature of:
> >> > >>CrossedIntermed=auxCrossedIntermed OR Ref(CrossedIntermed,-
1);
> >> > 
> >> > auxCrossedIntermed will have a combination of 1s & 0s in it, 
but 
> >> > these aren't actually "moved" to Crossedintermed until the 
> > statement 
> >> > hase been fully evaluated. Therefore Ref(Crossedintermed, -1) 
> > will 
> >> > always evaluate to 0 at the time it's executed, even though the 
1 
> >> > appears in the array element representing the cross event after 
> > the 
> >> > statement has been executed.
> >> > 
> >> > This is something that drove me mad before I cottoned onto it.
> >> > maybe this would work:
> >> > 
> >> > // initialise final values
> >> > CrossedIntermed=IIf(TimeNum()>120000, 666, 0);
> >> > // set cross events
> >> > auxCrossedIntermed=IIf(Low< Intermed AND High> Intermed, 1, 0);
> >> > // cross persists for whole day after it occurs once
> >> > auxCrossedIntermed = Flip(auxCrossedIntermed, True==False);
> >> > // finalise values
> >> > CrossedIntermed=IIf(TimeNum()>120000, 666, auxCrossedIntermed);
> >> > 
> >> > If you want the "1" to persist after midday, change the last 
> >> > statement to:
> >> > CrossedIntermed=IIf(auxCrossedIntermed, auxCrossedIntermed, 
> >> > CrossedIntermed);
> >> > 
> >> > 
> >> > --- In amibroker@xxxxxxxxxxxxxxx, "nunopires2001" 
> > <nunopires2001@> 
> >> > wrote:
> >> > >
> >> > > Hello,
> >> > > 
> >> > > After a encouraging start with Amibroker, i am realizing that 
> >> > writing
> >> > > code on AFL is not all that simple...
> >> > > 
> >> > > Anyone can explain me what is wrong with these lines of code?
> >> > > 
> >> > >     CrossedIntermed=0;
> >> > >     auxCrossedIntermed=IIf(Low< Intermed AND High> 
> > Intermed,1,0);
> >> > >     CrossedIntermed=auxCrossedIntermed OR 
Ref(CrossedIntermed,-
> > 1);
> >> > >     
CrossedIntermed=IIf(TimeNum()>120000,666,CrossedIntermed);
> >> > > 
> >> > > I am working with intraday, 1min data. The market opens at 
> > 110000 
> >> > and
> >> > > closes at 193000.
> >> > > 
> >> > > I just want to check the CrossedIntermed Value after 12.00h, 
> > and the
> >> > > value returned should be:
> >> > > -> 1: If the security crossed Intermed
> >> > > -> 0: Otherwise
> >> > > -> 666: If TimeNum()>120000
> >> > > 
> >> > > 
> >> > > Thanks alot!
> >> > >
> >> >
> >>
> > 
> > 
> > 
> > ------------------------------------
> > 
> > **** 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
> > 
> > 
> >
>




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

**** 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/