You cannot define the value of an array by referencing its own previous
values, ie this formula is wrong InLongPos =
IIf(Buy==1,1000,IIf(Sell==1,0,Ref(InLongPos,-1)));
You need to do this within a loop or by totally different method
here is loop for it:
InLongPos[0] = 0;
for ( i=1; i<BarCount; i++ )
{
if (Buy[i]) InLongPos[i] = 1000;
else if (Sell[i]) InLongPos[i] = 0;
else InLongPos[i] = InLongPos[i-1];
}
OR an alternative loop if you do not like using tons of else statements and
xxx[i]=xxx[i-1]
InLongPos = inLong = 0;
for ( i=1; i<BarCount; i++ )
{
if (Buy[i]) InLong = 1000;
if (Sell[i]) InLong = 0;
InLongPos[i] = InLong;
}
Alternatively for possibly the simplest solution:
InLongPos = flip(buy,sell) * 1000;
There are of course many other ways tog et same result, these above are just
a couple
--
Cheers
Graham Kav
AFL Writing Service
http://www.aflwriting.com
On 29/03/2008, wavemechanic <[EMAIL PROTECTED]> wrote:
>
> *Mike:*
> **
> *I don't think I'm off the mark but perhaps you did not follow what I
> said. Of course Buy (and Sell) is an array (who said it wasn't) and it is
> generated by something such as a function that returns an array or by
> specifying conditions (e.g., stateA and stateB). In the absence of the
> code that generated Buy (and Sell) I assumed that it was generated by a
> function that returned an array.*
> **
> *Ton stated "I want to get 1000 in inLongPos after Buy and before Sell".
> In other words he wants the inLongPos array to be filled with 1000 between
> the Buy bar and the bar before the Sell bar and the other bars are 0. IIF()
> correctly puts 1000 in the inLongPos at the Buy bar and 0 at the Sell
> bar. However, Ref() does not fill inLongPos with 1000 before the Sell.
> The inLongPos array cannot be changed but a new array can be created (which
> I think is what you are saying with your Temp array). Hence, as I said
> before to understand what is going on in answer to Ton's "Why not" it is
> necessary to read up on arrays and to do what Ton wants with IIF()
> additional code is needed to generate an array that is 1000 between Buy and
> the bar before Sell and 0 elsewhere.*
> **
> *I think we are on the same wavelength but would agree that things can get
> muddled in these types of messages where stuff is quickly knocked out (at
> least in my case). I suppose all messages in this type of forum should have
> the standard congressional caveat about reserving the right to revise and
> extend remarks - including this message. ;-)*
> **
> *Bill*
> * *
> *----- Original Message ----- * *From: "Mike" <[EMAIL PROTECTED]<[EMAIL
> PROTECTED]>
> *>*
> *To: <[EMAIL PROTECTED] <[email protected]>*>*
> *Sent: Friday, March 28, 2008 5:16 PM*
> *Subject: [amibroker] Re: Something is different. But what ?*
> *
> *
> *> Bill,
> >
> > You're comments appear to be off the mark. You already know that:
> >
> > 1. Buy is a special array declared by AmiBroker. So it is always an
> > array.
> > 2. Tomasz advises "If you're having trouble coding AFL I
> > suggest you generate the arrays in the example in Excel for
> > yourself."
> > **http://www.amibroker.com/guide/h_understandafl.html*<http://www.amibroker.com/guide/h_understandafl.html>
> *>
> > Following Ton's thread, I believe that he is saying that given:
> >
> > Buy = 0,1,0,0,...
> > Sell= 0,0,0,1,...
> >
> > In accordance with the User's Guide, he expects his IIF statement to
> > perform the following logic for his InLongPos array:
> >
> > InLongPos[0] is null due to Ref(InLongPos, -1) being undefined.
> > InLongPos[1] is 1000 due to Buy[1] being 1.
> > InLongPos[2] is 1000 due to Ref(InLongPos, -1) being 1000 as just
> > calculated above.
> > InLongPos[3] is 0 due to Sell being 1.
> > ...
> >
> > Ton, is this what you are trying to express?
> >
> > Perhaps the reason you are not seeing the expected results is because
> > the new values for InLongPos are being calculated in a temporary
> > array, then reassigned to the old InLongPos variable as follows (this
> > is just speculation, I haven't tried it):
> >
> > InLongPos = 0,0,0,0 // After your first initialization to zero.
> >
> > Temp[0] is null due to Ref(InLongPos, -1) being undefined.
> > Temp[1] is 1000 due to Buy[1] being 1.
> > Temp[2] is 0 due to Ref(InLongPos, -1) being 0.
> > Temp[3] is 0 due to Sell being 1.
> >
> > InLongPos = Temp;
> >
> > Would that explain what you are seeing?
> >
> > Mike
> >
> > --- In [EMAIL PROTECTED] <[email protected]>*,
> "wavemechanic" <[EMAIL PROTECTED]>
> > wrote:
> >>
> >> So what if that's what you did with Excel. I don't know how
> > Excel "thinks" but it makes no difference because all that you have
> > to worry about is AFL. I assume that Buy (and consequently
> > inLongPos) is an array that was generated by a function that returns
> > an array (e.g., Cross(), MA(), etc.) in which case no matter what you
> > do you will have to deal with that fact. If it is not an array why
> > did you use Ref() which operates on arrays? Forget about what you
> > did in Excel and ask yourself if you did or did not generate Buy with
> > a function that returns an array? If you conclude that Buy is an
> > array then deal with it as such because nothing else will work,
> > including
> >>
> >> Bill
> >> ----- Original Message -----
> >> From: Ton Sieverding
> >> To: [EMAIL PROTECTED] <[email protected]>*
> >> Sent: Friday, March 28, 2008 11:45 AM
> >> Subject: Re: [amibroker] Re: Something is different. But what ?
> >>
> >>
> >> Bill that's what I have done in Excel. And Ref(-1) show me the
> > previous cell. So if the
> >> previous cell shows 1.000 then the actual cell should also be
> > 1.000 if there is no Sell. Please look what the statement says :
> >>
> >> 1. If Buy let the actual cell be 1.000
> >> 2. If Sell let the actual cell be 0.
> >> 3. Otherwise Cell(-1) = Cell(0) ...
> >>
> >> Regards, Ton.
> >>
> >> ----- Original Message -----
> >> From: wavemechanic
> >> To: [EMAIL PROTECTED] <[email protected]>*
> >> Sent: Friday, March 28, 2008 2:57 PM
> >> Subject: Re: [amibroker] Re: Something is different. But what ?
> >>
> >>
> >>
> >> To understand "why not" take a look at the array discussion in
> > the Users Guide and think about what the inlongpos array looks like
> > at each bar and what ref(..., -1) is looking at.
> >>
> >> Bill
> >> ----- Original Message -----
> >> From: Ton Sieverding
> >> To: [EMAIL PROTECTED] <[email protected]>*
> >> Sent: Friday, March 28, 2008 5:52 AM
> >> Subject: Re: [amibroker] Re: Something is different. But
> > what ?
> >>
> >>
> >> Mike/Bill thanks for the answers. Mike I am already using
> > Flip for LongPos and ShortPos. This works fine for me ( LongPos = Flip
> > (Buy,Sell) and ShortPos=Flip(Short,Cover) ). So that's not my
> > problem. My problem is that I still do not see the difference between
> > the two statements I have given and would like to know why there is a
> > difference. Bill in the first statement your should get same result
> > as with the For Loop. So LongPos will become '1000' as soon as we
> > have a Buy and will switch to '0' again with a 'Sell'. Assume T-1 had
> > a Buy then LongPos(T-1) = 1000. Therefore LongPos(T) will be set
> > to '1000' also. But you're right. This is not what is happening. And
> > I still do not understand why not ...
> >>
> >> Regards, Ton.
> >>
> >> ----- Original Message -----
> >> From: Mike
> >> To: [EMAIL PROTECTED] <[email protected]>*
> >> Sent: Friday, March 28, 2008 12:33 AM
> >> Subject: [amibroker] Re: Something is different. But what ?
> >>
> >>
> >> Sorry,
> >>
> >> That should probably read Flip(ExRem(Buy, Sell), Sell) *
> > 1000;
> >> And maybe not much easier after all ;)
> >>
> >> Mike
> >>
> >> --- In [EMAIL PROTECTED] <[email protected]>
> *, "Mike" <sfclimbers@>
> > wrote:
> >> >
> >> > You could probably leverage the Flip function to make
> > this easier
> >> on
> >> > yourself.
> >> >
> >> > e.g.
> >> >
> >> > Buy = ...
> >> > Sell = ...
> >> > InLongPos = Flip(ExRem(Buy, Sell)) * 1000;
> >> >
> >> > Mike
> >> >
> >> > --- In [EMAIL PROTECTED]<[email protected]>
> *, "wavemechanic"
> > <timesarrow@>
> >> > wrote:
> >> > >
> >> > > The iif() does not give the same result because ref
> > (inlongpos, -
> >> 1)
> >> > == 0 except when the previous bar is a buy. You can see
> > exactly
> >> what
> >> > is happening graphically with
> >> > >
> >> > > buy =
> >> > > sell =
> >> > > inlongpos = iif(...
> >> > > plot(c, "", iif(buy, colorred, iif(sell, coloryellow,
> >> > colorpalegreen)), stylebar);
> >> > > title = "inlongpos = " + inlongpos + " ref
> > (inlongpos..." + ref
> >> > (inlongpos...) + " buy = " + buy + " sell =" + sell
> >> > >
> >> > > If you want the iif() approach to hold either a buy or
> > sell value
> >> > for each bar additional code is needed to create this
> > condition.
> >> > >
> >> > > Bill
> >> > >
> >> > >
> >> > > ----- Original Message -----
> >> > > From: Ton Sieverding
> >> > > To: [EMAIL PROTECTED]<[email protected]>
> *
> >> > > Sent: Thursday, March 27, 2008 8:10 AM
> >> > > Subject: Re: [amibroker] Something is different. But
> > what ?
> >> > >
> >> > >
> >> > > Sure. This of course if part of an AFL with Buy and
> > Sell
> >> defined.
> >> > Also an init for InLongPos
> >> > > being set to zero as a starter. Again the ForLoop works
> > fine. I
> >> > checked that with following statement : AddColumn
> >> > (InLongPos,"Long",1);
> >> > > My problem is that I do not understand why the first
> > statement
> >> > does not give me the correct answer where the second
> > does ...
> >> > >
> >> > > Regards, Ton.
> >> > >
> >> > > ----- Original Message -----
> >> > > From: wavemechanic
> >> > > To: [EMAIL PROTECTED]<[email protected]>
> *
> >> > > Sent: Thursday, March 27, 2008 12:55 PM
> >> > > Subject: Re: [amibroker] Something is different. But
> > what ?
> >> > >
> >> > >
> >> > >
> >> > > Is there more to the code? Are you getting a
> >> > syntax/initialization error? How are you handling the
> > case when i
> >> ==
> >> > 1?
> >> > >
> >> > > Bill
> >> > >
> >> > > ----- Original Message -----
> >> > > From: "amsiev" <ton.sieverding@>
> >> > > To: <[EMAIL PROTECTED]<[email protected]>
> *>
> >> > > Sent: Thursday, March 27, 2008 7:01 AM
> >> > > Subject: [amibroker] Something is different. But what ?
> >> > >
> >> > >
> >> > > > Why is following AFL statement :
> >> > > >
> >> > > > InLongPos = IIf(Buy==1,1000,IIf(Sell==1,0,Ref
> > (InLongPos,-
> >> 1)));
> >> > > >
> >> > > > giving me a different result as following ForLoop :
> >> > > >
> >> > > > for ( i=1; i<BarCount; i++ )
> >> > > > {
> >> > > > if (Buy[i]==1)
> >> > > > InLongPos[i] = 1000;
> >> > > > else
> >> > > > {
> >> > > > if (Sell[i]==1)
> >> > > > InLongPos[i] = 0;
> >> > > > else
> >> > > > InLongPos[i] = InLongPos[i-1];
> >> > > > }
> >> > > > }
> >> > > >
> >> > > > The result I am getting from the ForLoop is correct.
> > The
> >> first
> >> > > > statement gives me a wrong answer. I want to get 1000
> > in
> >> > InLongPos
> >> > > > after Buy and before Sell ... When testing the
> > statement in
> >> > Excel
> >> > > > it works fine with : =IF(A6=1;1000;IF(B6=1;0;C5)) ...
> >> > > >
> >> > > > What's wrong ?
> >> > > >
> *
>