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

Reply via email to