PureBytes Links
Trading Reference Links
|
"It gets worse the farther back in time I go. I'll have to study
the problem some more."
It sounds like you might be seeing a
back-adjusted data problem. I would really like to have the fundamental data of
QP3, but I think it's more important to have access to ACTUAL PRICES and
EXTINCT STOCKS so my back-tested trades in 1995 will appear realistic. I.e., I
will buy stocks based on their "real" price at the time and I will not
have survivorship bias in my tests (buying only stocks that are still in
business today because the database no longer has the old stocks - most data
vendors seem to think this is a "benefit" as their databases are not
"cluttered" with all the dead stocks). So I use CSI Data and give up
on the fundamental info.
Also check how your data is exported.
CSI allows exports to be proportionally back-adjusted for dividends and splits.
This method corrects for splits, dividends and capital gains and never allows
the prices to go negative (which AB doesn't like). By adjusting for both dividends
and capital gains you don't get false signals on your indicators when the price
drops by the amount of the dividend.
-----Original Message-----
From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf Of Jeff Springer
Sent: Tuesday, March
21, 2006 00:28
To: amibroker@xxxxxxxxxxxxxxx
Subject: RE: [amibroker] Re:
Single Value from Array
I want to thank you for the time you put into
educating me. I learned a lot. I rewrote my code using what you taught me and
everything worked out as it should. It was much faster, and much cleaner.
Unfortunately, I haven't thought this through enough. It's looking more and
more like what I want to do will simply not be possible. The code returns
different values from the array, but several vary from what QP3's own software
is telling me the earnings should be; even on the last earnings reported (which
should be barcount-0). It gets worse the farther back in time I go. I'll have
to study the problem some more. At least I learned a lot about loops and
arrays!
Cato
Terry
<MagicTH@xxxxxxxxxxx> wrote:
EPS
is an array. AB let's you access individual array elements, called bars (bar =
day in a daily database), with [brackets]. So, EPS[i] is just one of the days in the database for
the symbol in use. You were correct in your original assumption on that count.
What you're missing is the necessity of breaking those out into separate
elements since EPS already contains the values you want. Maybe an example is in
order:
Buy
= C > 10 AND ESP > 20; //A simple example that buys if Price is > $10
and EPS > 20
A
backtest evaluates each bar (or the range of bars you select as dates to test)
and it knows on each day (bar) what the values are. The EPS will change
quarterly as it should. You don't really need to do anything special to make
this happen.
-----Original Message-----
From: amibroker@xxxxxxxxxxxxxxx
[mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf
Of Jeff Springer
Sent: Monday, March
20, 2006 18:49
To: amibroker@xxxxxxxxxxxxxxx
Subject: RE: [amibroker] Re:
Single Value from Array
Thank you for your excellent reply. I think you pegged
me right on. I was under the impression that the [] subscript referenced only a
single number from that array. But you're telling me that EPS[x] is
an array as well, albeit an array with the same number repeated for however
many bars. So, if I can rephrase what you wrote, I don't need EPSx, I just
need EPS with the various values for i to pull the number I want to manipulate
out? I can understand that, and see that what I really need is to discover the
values for "i" at each change. Do I understand you correctly?
If so, do you have any recommendations for discovering
the values for "i"? Would it be much like your first post? I imagine
I would use different variables for each occurrence of a change, but I probably
shouldn't start assuming again.
Again, your reply was very clear and clarifies a lot
of questions I had. Thank you, again.
Cato
Terry
<MagicTH@xxxxxxxxxxx> wrote:
I don't have QP3 so I can't get too specific, but I
think you have a basic misunderstanding on how Amibroker is supposed to work.
It's very common for people with coding experience to want AB to work with
single values. If I'm way off on understanding your issue, my apologies!
AB is an array processing system. For example, you
shouldn't mix arrays and single values as you have done in your Do loop. You
have assigned a single value to an array with EPS0 = EPS[b-1]. So, you have
assigned the same value to the entire EPS0 array. This array is the same
size array as the ticker you are working with. Now you have 4 arrays, all
barcount long, with the same value in each one. I think you are thinking you
have an array that is one-quarter long (about 66 days), but it is not. Besides,
you already have all the data in the original EPS array and it's already
arranged by quarter. In abbreviated form you have this:
EPS
11111111111111122222222222222233333333333333334444444444444444
EPS0 11111111111111111111111111111111111111111111111111111111111111
EPS1
22222222222222222222222222222222222222222222222222222222222222
EPS2
33333333333333333333333333333333333333333333333333333333333333
EPS3
44444444444444444444444444444444444444444444444444444444444444
You need to get comfortable with data being in arrays
and each bar simply represents the status "as of that bar". It really
works well this way. Your EPS has a value everyday. If it doesn't change for an
entire quarter, you simply have the same value everyday. Then, on the day it
changes, you'll have the new value for the next 66 days. On any given day you
can simply refer to your EPS or Sales array and you will have the correct
value. AB "knows" which day you are "on". Same answer for
your original question about Ref(). It does refer to a single value -x bars in
the past, it's just an array of single references so on any given day, the
array "knows" the answer -x bars previously.
Again, sorry if I am explaining something you already
know.
Thank you very much for replying, Terry. That's pretty
much what I discovered over the weekend. Would you mind looking at my response
to Bill Barnard and providing your input?
Terry
<MagicTH@xxxxxxxxxxx> wrote:
Try this:
i = 0; //Start at beginning of array
do i++; while (myArray[i-1] == myArray[i])
//After this line executes, the value of i = the
first changed array
element.
--
-----Original Message-----
From: amibroker@xxxxxxxxxxxxxxx
[mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf
Of Jeff Springer
Sent: Monday, March
20, 2006 10:35
To: amibroker@xxxxxxxxxxxxxxx
Subject: Re: [amibroker] Re:
Single Value from Array
I've figured it out, but have run into a new problem.
I'm trying to get the history of EPS and Sales from the QP3 data, which are
arrays. I didn't want to be this specific because I realize others don't have
QP3 and I wanted to phrase my question in general terms that I think would work
with all arrays. I think if you run this code on any array you should come up
with the same error I got. Would you mind looking at it and giving your input?
while
(EPS1==EPS0 AND i<b);
while
(((EPS2==EPS0) OR (EPS2==EPS1)) AND i<b);
while
(((EPS3==EPS2) OR (EPS3==EPS1) OR (EPS3==EPS0)) AND i<b);
There's more, but you can see the general pattern from these three. The EPS
array is set up so that each bar for a quarter has the same EPS value. When a
new EPS comes out, the EPS changes (ideally; since I'll only be looking at
stocks where EPS increases, I don't care if the code mistakes a new EPS for an
unchanged EPS). I step back through the array to search for a different EPS.
This code works fine,
but I would prefer that "i" continues counting up rather than
reseting (as I've done with the "i=1;" line before each do loop). The
problem with this is that the do loop checks the condition /after/ running the
"EPSx=EPS[b-i];" line. So, when it hits a stock with few bars, the
code errors out with the "outside 0... (barcount-1) range" error. Is
there a way to put a conditional statement in before the
"EPSx=EPS[b-1];" line so that if "i" is greater than the
barcount, then EPSx is null, or 0?
I've tried changing the "EPSx=EPS[b-i];"
line to "EPSx=iif(i>b, 0, EPS[b-i];" but that still errors out.
Maybe there's something more basic I'm missing.
Thank you, for your help.
Cato
Bill Barnard
<wbarnard@xxxxxxx> wrote:
--- In
amibroker@xxxxxxxxxxxxxxx, Jeff Springer <fatboycato@xxx> wrote:
>
> Thank you so much for replying, Bill, but I
don't think that will
work for me. I was hoping to use the code in an
exploration, and I
think this code will only give me the data in a
debugger window,
correct? I tried assigning the _Trace calls to
variables, and then
displaying that variable with AddColumn, but of
course that doesn't
work. I'm too programming ignorant to know why.
>
> It seems to me that if Ref()
calls up a specific value in the
array, then it shouldn't be returning an array,
just that specific
value. I'm sure there's a good reason why it
doesn't work this way, I
only wish I had some way of calling up a value
from an array and
assigning that value, and only that value, to a
variable.
---------------------------------------------
You are welcome. sorry it isn't what you need.
Ref() does produce an array, the original one
shifted by a certain amount.
If you can describe what you are trying to do,
very exactly, in
English, I am sure the code would not be too
difficult.
Yahoo! Mail
Use
Photomail to share photos without annoying attachments.
Yahoo!
Mail
Bring photos to life! New
PhotoMail makes sharing a breeze.
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 other support material please check also:
http://www.amibroker.com/support.html
SPONSORED LINKS
YAHOO! GROUPS LINKS
|
|