Cato
cc: Quotes Plus Users:
I'm thinking you probably don't need to
apply iterative loops to get what you want. I also wanted to say
that there are only 4 arrays available from QP
via the functions Tomasz wrote in Amibroker. They are QRS, EPSRank,
EPS,
and Sales. I'm checking but not sure other
arrays are available to Amibroker's plug in.
QRS is calculated daily, EPSRank is done weekly,
EPS and Sales are reported quarterly. So these arrays, if
you run an explore, will change only on the
dates(bar) that the quarter changes.
The other values are point values. What you get
when you call a GetExtraData for example for PEG, is
the last calculated PEG for that stock. You
can't go get it's historical value nor use PEG as a backtesting
criteria.
Here's a small routine that does not use loops
and presents the EPS at change of quarter on an Exploration.
BTW, I would encourage the use of
Explorations in the AA mode, especially if you're not using "for" loops.
Hope this helps.
JOE
// Exploration for Quarterly EPS - For example, run on single issue over 1000 bars.
EPS = GetExtraData("EPS");
Sales = GetExtraData("Sales");
QRS = GetExtraData("QRS");
EPSRank = GetExtraData("EPSRank");
// Bruce Robinson wrote this originally as a one line program but I split it
so it
// be more readable by
me and others who are starting out.
Cond1 = (( Month() -
1 ) % 3 == 0 ); // Remainder
when prev month number
is div'ed by 3.
// Do an explore on
Cond1 and see what it does.
Cond2 = Month() !=
Ref( Month(),-1); // Cond2 to set 1 when month changes.
QTR = IIf(Cond1
AND Cond2,1,0);
Filter = 1; //QTR; // // to print only quarterly results,
uncomment the use of QTR.
AddColumn (Close,"Close");
AddColumn (EPS,"EPS");
AddColumn (Sales,"Sales");
QuarterlyEPS = ValueWhen(QTR,EPS); // this is not needed the
way I have the filter set up.
AddColumn (QuarterlyEPS,"QE EPS");
AddColumn (QRS,"QRS");
AddColumn (EPSRank,"EPSRank");
AddColumn (GetExtraData("PEG"),"PEG
Ratio");
----- Original Message -----
Sent: Tuesday, March 21, 2006 1:28
AM
Subject: RE: [amibroker] Re: Single Value
from Array
Terry,
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:
Cato,
Almost.
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
|