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 <timesarrow@xxxxxxxxh.net>
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 -----
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
>
> 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 amibroker@xxxxxxxxxps.com, "wavemechanic" <timesarrow@x..>
>
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: amibroker@xxxxxxxxxps.com
>> 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: amibroker@xxxxxxxxxps.com
>> 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:
amibroker@xxxxxxxxxps.com
>> 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:
amibroker@xxxxxxxxxps.com
>>
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
amibroker@xxxxxxxxxps.com, "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
amibroker@xxxxxxxxxps.com, "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: amibroker@xxxxxxxxxps.com
>>
> > 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: amibroker@xxxxxxxxxps.com
>>
> > 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: <amibroker@xxxxxxxxxps.com>
>>
> > 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
?
>> > >
>