-----Original Message-----
From: amibroker@xxxxxxxxxxxxxxx [
mailto:amibroker@xxxxxxxxxxxxxxx] On
Behalf Of progster01
Sent: Wednesday, July 09, 2008 10:28 AM
To:
amibroker@xxxxxxxxxxxxxxx
Subject: [amibroker] Re: More on Database Structure
and Local Storage
--- In amibroker@xxxxxxxxxxxxxxx, "Paul Ho"
<paul.tsho@xxx> wrote:
> Progster, you're correct in your
interpretation. The only correction
> needed is that Tomasz first posted
the original code, I added the
> storage part.
Paul - Thanks for
the confirmation!
Below I add-on to this code a bit by making it write to
the NotePad a note which tells the observer what the OI field actually is
showing.
I've also made the metric a parameter.
Something strange
though - when I change the metric and re-run, all the symbols update OI to
reflect the new metric _except_ for the one which is currently displayed.
This is as observed in the NotePad.
Can anyone tell why that might
be?
(Tested in AB
5.14.0)
___
/*
OrdinalRankFast_01.afl
Uses
custom backtester to do very fast ordinal ranking, writing the
result
to the OI
field.
Demo ranking by ROC OR
RSI is provided.
Run this code
as a Backtest.
*** WARNING:
This code will change your database!
***
Original code
by:
Tomasz Janeczko and Paul
Ho
Originally
from:
http://finance.groups.yahoo.com/group/amibroker/message/126512
7/9/2008
Progster Added comments, and code to
log actions by this AFL
in the
NotePad.
Made the ranking a
parameter.
Changed RSI
case to behave like the ROC case. This makes the range of the OI field
span the
# of stocks in the list
to which this AFL is applied.
Observed that the symbol in the current chart does not update
(!?)
*/
Announcement = "OI field has been set by
OrdinalRankFast_01.afl" ;
run = Param( "run", 1, 1, 2, 1
);
function ranking( Ordinal )
{
switch (
Ordinal )
{
case 1:
res = ROC( C, 14 ) +
1000;
break;
case
2:
res =
RSI( 14 );
break;
default:
res = EMA( C, 50
);
break;
}
return
res;
}
// WHAT YOU WANT TO
RANK
// Internally, AB will sort/order the
backtester's 'Signal' objects
according
to
// absolute value of PositionScore.
Later in the code, we will
retreive from
these
// objects by stepping thru them
sequentially. Since the 'Signal'
objects have
already
// been sorted by AB into PositionScore
order, the order in which they
will be
// encountered when we step-thru
them _is_ the ordinal order of the ranking metric.
PositionScore = ranking(
run );
SetOption( "MaxOpenPositions",
50 ); //AB only keeps 2*
maxpos top
rank signals
SetBacktestMode( backtestRegularRaw
);
Buy = 1;
// make
a buy signal for every stock on every bar
Sell = Short = Cover =
0;
ab = CreateObject( "broker.Application"
);
// IsDirty flag tells AB that data has
changed so when the user press
save, that area of the database is
saved.
// Since this AFL will update the OI
field, we mark the 'Stock' as
changed.
target = ab.Stocks( Name()
);
// select a single 'Stock' object from
the
'Stocks' collection
target.isDirty = True;
SetCustomBacktestProc( ""
);
// empty argument means use current
AFL
formula
if ( Status( "action" ) == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess();
dt = DateTime();
// fh =
fopen("output.csv", "w"); uncomment these if you want to save it to a csv file
as well // fputs("Symbol,Date,Rank\n",
fh);
// On every bar
for ( i = 0;
i < BarCount; i++ )
{
// For every signal ... (one for each
stock in this case, based on Buy = 1,
above)
k =
1;
for ( sig = bo.GetFirstSignal(
i ); sig; sig = bo.GetNextSignal( i )
)
{
// Line = sig.Symbol + ","
+ DateTimeToStr(dt[i]) + "," + k
+
"\n";
// fputs(Line,
fh);
target = ab.Stocks( sig.Symbol );
//
select a 'Stock'
object from the 'Stocks'
collection
qt = target.Quotations( DateTimeToStr( dt[i] ) );
//
select a 'Quotation' object
from the 'Quotations'
collection
// The index (k) into the sorted
'Signal' collection is the ordinal
ranking.
if ( qt )
{
if ( run == 1 ){
// ROC
case
qt.OpenInt = k;
NoteSet(
sig.Symbol, sig.Symbol + " - OI displays: "
+ "ROC
ranking\n" + Announcement )
;
NoteSet(
sig.Symbol, NoteGet(sig.Symbol) + "\n"
+
"Highest ROC(14) is lowest
number.\n"
);
}
else if ( run == 2 ){
// RSI
case
// qt.OpenInt += k;
//
why?
qt.OpenInt =
k;
NoteSet( sig.Symbol, sig.Symbol + " -
OI displays: " + "RSI ranking\n" + Announcement )
;
NoteSet(
sig.Symbol, NoteGet(sig.Symbol) + "\n"
+
"Highest RSI(14) is lowest
number.\n"
);
}
else{
qt.OpenInt += k;
//
other cases (why?)
}
}
//
target.isDirty = True;
// not
necessary
k++;
}
}
bo.PostProcess();
//
if(fh)fclose(fh);
}
// end of:
if ( Status( "action" ) ==
actionPortfolio )
// Try this at the
end, to make OI for the currently displayed
symbol
update.
// Not a fix.
// target =
ab.Stocks( Name() );
//
select a single 'Stock' object
from the 'Stocks' collection
//
target.isDirty =
True;
------------------------------------
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.htmlYahoo!
Groups Links
<*> To visit your group on the web, go
to:
http://groups.yahoo.com/group/amibroker/<*>
Your email settings:
Individual Email |
Traditional
<*> To change settings online go
to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via
email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx<*>
To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups
is subject to:
http://docs.yahoo.com/info/terms/