PureBytes Links
Trading Reference Links
|
Take a look at message 2739 on
amibroker-beta.
Bill
----- Original Message -----
Sent: Monday, March 31, 2008 5:27
AM
Subject: Re: [amibroker] Re: Something is
different. But what ?
I see there are lots of misunderstandings Graham
... Please read my emails. I know that the rest of the elements will be filled
with zero's. But that's not the point. That's the first part of my email. In
the second part Element 2 and 3 of better LongPos[1] and LongPos[2] are
intentionally filled with zero's AND WHEN I AM TRYING TO REFERENCE TO THESE
ELEMENTS WITH THE STATEMENT IN THE LAST LINE IT'S IMPOSSIBLE ...
I also know that I should use a loop. It's
just all about that ... I even showed the loop in my first email. My problem
is that I can reference the elements in the loop where it's impossible to
reference them with the single statement. And you explained me why this is
impossible. So everything is under control now. Thanks again ...
Regards, Ton.
----- Original Message -----
Sent: Monday, March 31, 2008 10:40
AM
Subject: Re: [amibroker] Re: Something
is different. But what ?
I went back through some other emails and found this one with
LongPos[0] = 1000;
LongPos[1] = 0;
LongPos[2] = 0;
LongPos = Ref(LongPos,-1);
In the above you have defined the 1st 3 elements, but the
remaining elements (barindex()>2) in the array will I believe be filled
with null or zero, so it is already filled before you get to the line
LongPos =
Ref(LongPos,-1); ie LongPos[0] = 1000;
means all bars except first ==0 You should
use a loop for this type of referencing to previous value of the same
array -- Cheers Graham Kav AFL Writing Service http://www.aflwriting.com
On 31/03/2008, Ton
Sieverding <ton.sieverding@scarlet.be>
wrote:
That's the confusing part for me Bill. You
think it will work and it does not ...
Regards, Ton.
-----
Original Message -----
Sent:
Sunday, March 30, 2008 2:31 PM
Subject:
Re: [amibroker] Re: Something is different. But what ?
Nope, Ton, That must be wrong. I just
tried the compound and it did not work. Bill
-----
Original Message -----
Sent:
Sunday, March 30, 2008 7:56 AM
Subject:
Re: [amibroker] Re: Something is different. But what ?
Ton:
To complete the story in a limited
number of cases previous values of an array can be referenced to
produce the current value (e.g., AMA() and compound
operators).
Bill
-----
Original Message -----
Sent:
Sunday, March 30, 2008 4:25 AM
Subject:
Re: [amibroker] Re: Something is different. But what ?
Graham thanks. An interesting remark :
"You cannot define the value of an array by referencing its own
precious values". That's hard to accept, as I am doing this for
many years in many environments. Any way, so the following should not work :
longPos = 1000;
LongPos = Ref(LongPos,-1);
But it does and without any problem or
error message. I am getting an array LongPos filled with
1000's. Where the second line did reference to its own precious
values ...
Question is of course if the
initialization in the first line did not do the job already ?
By simply removing the second line I should get the answer on that
question. And the answer is : Yes it did. So the above example
tells me nothing ... Therefore
let's create an array with three elements and
initialize the first three elements and see if I still get an
array filled with 1000's as above :
LongPos[0] =
1000;
LongPos[1] = 0;
LongPos[2] = 0;
LongPos = Ref(LongPos,-1);
Answer is No. Only the first element is
1000 and the next two remain 0. So you remark is correct. I cannot
reference an array to it's own previous values. At least not in
AFL. And this of course also gives me an answer to my initial
question why my first statement does not work properly where a
'For Loop' does give me the correct answer ...
BTW my question was purely theoretical.
As you can see in an answer to Mike/Bill I am using the Flip()
function to get the answer to the question if I am Long, Short or
Flat. But l still have a hard time working with arrays in
AFL ... Even the basic principles remain confusing
...
Many thanks again ....
and regards, Ton.
-----
Original Message -----
Sent:
Saturday, March 29, 2008 4:24 AM
Subject:
Re: [amibroker] Re: Something is different. But what ?
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
? >>
> > >
No virus found in this incoming message. Checked by AVG.
Version: 7.5.519 / Virus Database: 269.22.1/1349 - Release Date:
3/29/2008 5:02 PM
No virus found in this incoming message. Checked by AVG.
Version: 7.5.519 / Virus Database: 269.22.1/1349 - Release Date:
3/29/2008 5:02 PM
No virus found in this incoming message. Checked by AVG.
Version: 7.5.519 / Virus Database: 269.22.1/1350 - Release Date: 3/30/2008
12:32 PM
__._,_.___
Please note that this group is for discussion between users only.
To get 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
__,_._,___
|
|