PureBytes Links
Trading Reference Links
|
This newsletter is also available from http://www.amibroker.com/newsletter/01-2000.html
IN THIS ISSUE
I. Welcome to the AmiBroker Tips newsletter!
II. A new AmiBroker/Win32 3.4 is available
III. Tip of the week: Accessing stock data using AmiBroker's automation interface
I. Welcome to the AmiBroker Tips newsletter!
Welcome to a new AmiBroker Tips newsletter! My intention is to provide you with a periodical source of information about using AmiBroker. For the start it will be a rather small bag of tips and tricks. I would like to includethe information about managing your data, writing AFL formulas and all other things that you will find useful. So please don't hesitate to write about the things you would like to get explained. I also encourage you to writesome articles for this newsletter if you want to share with your solutionswith the others.
By the way: do you have an idea on some cool name for this newsletter? Mailyour suggestions to newsletter@xxxx
For the start I have prepared a rather advanced article about using automation with AmiBroker. Less experienced (in programming) users may just use pre-written scripts included with the article.
II. A new AmiBroker 3.4 available
Just in case you haven't noticed: on November 1st, 2000 AmiBroker/Win32 hasbeen released. It is available for download from http://www.amibroker.com/download.html. Please upgrade to the latest version - because it brings several new features including brand new system test reporting, new studies like Fibonacci retracement and timezones, faster database engine, and more. All tips that I will describe in this newsletter will work best with the newversion (old versions may miss some features).
III. Tip of the week: Accessing stock data using AmiBroker's automation interface
3.1 Introduction
In this article I want to show the ways to enhance the functionality of AmiBroker by using scripts. Scripting is rather advanced topic since it requires a little bit of programming work. Those of you who don't want to touch programming may just use supplied scripts. I hope that you will find them useful. Advanced users may modify those scripts for their own needs.
3.2 What is automation?
Automation (also known as OLE Automation) makes it possible for one application to manipulate objects implemented in another application, or to "expose" objects so they can be manipulated. AmiBroker acts as an automation server. An Automation server is an application that exposes programmable objects to other applications, which are called Automation clients. Exposing programmable objects enables clients to automate certain procedures by directlyaccessing the objects and functionality the server makes available. You can access automation server's objects from a number of programming languagesincluding C/C++, Visual Basic, VBScript and JScript. Especially two latterlanguages (VBScript and JScript) are interesting from your point of view because: a) they are scripting (interpreted) languages - no compilation is required; b) they are available for free as a part of Windows Scripting Host(WSH).
3.3 What is Windows Scripting Host?
The Windows Scripting Host (WSH) is a language-independent scripting host for 32-bit Windows platforms. Microsoft provides both Microsoft® Visual Basic® Scripting Edition (VBScript) and Microsoft® JScript™ scripting engines with WSH. Other software companies will provide ActiveX™ scriptingengines for languages such as Perl, TCL, REXX, Python, and others. WindowsScripting Host is integrated into Windows® 98, Windows 2000. It is also available as a free component for Windows 95 and NT4.0 (you can download itfrom http://msdn.microsoft.com/scripting/windowshost/default.htm ). Windows Scripting Host can be run from either the Windows-based host (Wscript.exe), or the command-shell-based host (Cscript.exe). VBScript and JScript files are simple text files, so you can use even Notepad to edit them. VBScriptfiles have default .vbs extension while JScript files have .js extension. The Windows Explorer is set up by default in such a manner that double clicking on .js or .vbs script file causes executing it.
3.3 How AmiBroker supports automation/scripting?
AmiBroker exposes a number of automation objects (described in Automation Object Model Reference section of AmiBroker's User guide). These objects canbe accessed from a number of languages including WSH's VBScript and JScript. In this article we will use JScript (a Microsoft dialect of Java Script). AmiBroker objects are organized in a hierarchy show in the picture below (not all objects shown):
As you can see all objects are accessible from the parent Application object. So all your scripts must first create AmiBroker Application object and then access the objects located deeper in the hierarchy. In the picture above you can see that some of the objects have yellow color - these object represent collections. A collection is an object that contains zero or more objects of the same class. So Stocks collection contains zero or more objectsof the Stock class. Collections are used mainly to interate thru objects and manage adding/removing of the objects belonging to a collection. As you can guess you will work the most often with a Stocks and Quotations collection and a Stock and Quotation objects. These (and other) objects expose properties that are data members of the object. The value of the property can be retrieved or set (if the property is not read-only). For example Quotation object has Date, Open, Close, High, Low, Volume, OpenInt properties thatholds this quotation data. A complete list of properties of AmiBroker objects' properties can be found in Automation Object Model Reference section of AmiBroker's User guide. Object could have also methods. A method is aprocedure that is exposed by an object and performs a specific action (for example Application object has a method called RefreshAll() which refreshes allviews and lists of AmiBroker).
3.4 Accessing AmiBroker's object
NOTE: Now we will write some JScript code - if you want to experiment a little please lauch any plain text editor (it could be even Notepad) to write the code - you work should be saved to the file with .JS extension in orderto enable it to run by WSH.
In order to gain an access to any AmiBroker object you have to create AmiBroker Application object. This can be done by following JScript code:
var oAB = WScript.CreateObject("Broker.Application");
Note that WScript is a built-in object of Windows Scripting Host. The same effect can be obtained by the following:
var oAB = new ActiveXObject("Broker.Application");
Note that we don't use WScript object now. In both cases oAB object is an actual AmiBroker Application object. We can now access its methods and/or properties. For example we can close AmiBroker programmatically by calling Quit() method:
oAB.Quit();
You now give it a try: enter above lines in the text editor, save the file under the name Quit.js , launch AmiBroker by hand, and double click on the Quit.js file in the Windows Explorer. You will see that AmiBroker has closed.
Application object gives you an access to other object such as Stocks collection. For example the full name of the first stock in the list could be by:
oAB.Stocks.Item( 0 ).FullName;
or
oAB.Stocks( 0 ).FullName;
The latter method works because Item( ) is the default property of Stocks collection. Stocks collection elements could be also referenced by name for example:
oAB.Stocks( "^DJI" ).FullName;
Now it's the time for something more complicated but also more useful.
3.5 Example 1: Exporting stock information to the text file
In this example we will write the script that exports stock information (full name, address, industry, market and group assignments) to a comma separeted values text file.
Let's begin with creating AmiBroker Application object and FileSystem object. The latter object will be used to create and write text to a disk file.
var oAB = new ActiveXObject("Broker.Application");
var fso = new ActiveXObject("Scripting.FileSystemObject");
file = fso.OpenTextFile( "Info.txt", 2, true );
In the third line we create a text file called "info.txt" with write access(2). The second parameter (true) tells file system that we are creating a new file.
Then we will retrieve the number of stocks in the Stocks collection:
var oStocks = oAB.Stocks;
var Qty = oStocks.Count;
Now we can iterate through stocks retrieving needed information and writingthem to the file:
for( i = 0; i < Qty; i++ )
{
oStock = oStocks( i );
file.Write( oStock.Ticker + "," );
file.Write( oStock.FullName + "," );
file.Write( oStock.Address + "," );
file.Write( oStock.IndustryID + "," );
file.Write( oStock.MarketID + "," );
file.WriteLine( oStock.GroupID );
}
file.Close();
WScript.Echo("Export finished" );
As you can see we use Write() and WriteLine() methods of file object to write the text to a disk file. WriteLine() is different from Write() in that it simply adds a new line character at the end of text written. As an excercise you can add other properties to the list such as oStock.BookValue, oStock.Issue and so on. Also financial data (quaterly income, earnings) could be accessed in that way. Note that you need to supply quarter number (0-3) for accessing these properties. For example oStock.FinanceEAT( 0 ) accesses first (zero based index) quarter earnings after taxes.
A ready to use script can be found attached (Info.js) here.
3.6 Example 2: Exporting quotation data
In this example we will write the script that exports all quotations of currently selected stock to the CSV file.
As before we will start with creating AmiBroker Application object and FileSystem object.
var oAB = new ActiveXObject("Broker.Application");
var fso = new ActiveXObject("Scripting.FileSystemObject");
Then we will determine ticker of currently selected stock and we will create a file called <TICKER>.CSV . Then we will retrieve the number of quotations of that stock.
Ticker = oAB.ActiveDocument.Name;
file = fso.OpenTextFile( Ticker + ".csv", 2, true );
var oStocks = oAB.Stocks;
oStock = oStocks( Ticker );
var Qty = oStock.Quotations.Count;
Now we will iterate through quotes and write them to the CSV file:
for( i = 0; i < Qty; i++ )
{
oQuote = oStock.Quotations( i );
var oDate = new Date( oQuote.Date );
file.WriteLine( oStock.Ticker + "," +
oDate.getFullYear() + "-" + oDate.getMonth()+1 + "-" + oDate.getDate() + "," +
oQuote.Close + "," +
oQuote.Open + "," +
oQuote.High + "," +
oQuote.Low + "," +
oQuote.Volume );
}
file.Close();
Yes... it's that simple! When you try this script you will find that price values are listed with too many decimal digits, therefore additional formatting may be needed to make this script nicer. Also we may want to include AmiBroker's style $FORMAT command that specify the data layout in the file so it could be easily imported back to AmiBroker.
These and other improvements are included in the ready to use version (Export.js) of the script. A special FormatFloat() function is used to cut the number to 2 decimal places.
3.7 Conclusion
AmiBroker's automation interface allows the user to extend AmiBroker's functionality by writing the scripts that implement features that could not be found in AmiBroker itself. Automation interface is the one of AmiBroker's features that decide on its flexibility and extensibility not often found incompetitors' products.
=============================================================================
------=_NextPart_002_001E_01C04754.2A194CE0
Content-Type: text/html;
charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=iso-8859-2" http-equiv=Content-Type>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#e2e2e2>
<DIV>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><B>AMIBROKER TIPS </B></TD>
<TD><B>weekly newsletter</B></TD>
<TD><B>issue 1/2000</B></TD></TR></TBODY></TABLE></DIV>
<DIV><FONT size=1><FONT face=Tahoma></FONT></FONT> </DIV>
<DIV><FONT face=Tahoma>This newsletter is also available from <A
href="http://www.amibroker.com/newsletter/01-2000.html">http://www.amibroker.com/newsletter/01-2000.html</A></FONT></DIV>
<DIV>
<H5>IN THIS ISSUE</H5>
<H5>I. Welcome to the AmiBroker Tips newsletter!<BR>II. A new AmiBroker/Win32
3.4 is available<BR>III. Tip of the week: Accessing stock data using AmiBroker's
automation interface</H5>
<H5>I. Welcome to the AmiBroker Tips newsletter!</H5>
<P>Welcome to a new AmiBroker Tips newsletter! My intention is to provide you
with a periodical source of information about using AmiBroker. For the start it
will be a rather small bag of tips and tricks. I would like to include the
information about managing your data, writing AFL formulas and all other things
that you will find useful. So please don't hesitate to write about the things
you would like to get explained. I also encourage you to write some articles for
this newsletter if you want to share with your solutions with the others.
<BR></P>
<P>By the way: do you have an idea on some cool name for this newsletter? Mail
your suggestions to <A
href="mailto:newsletter@xxxx">newsletter@xxxx</A></P>
<P>For the start I have prepared a rather advanced article about using
automation with AmiBroker. Less experienced (in programming) users may justuse
pre-written scripts included with the article. </P>
<H5>II. A new AmiBroker 3.4 available</H5>
<P>Just in case you haven't noticed: on November 1st, 2000 AmiBroker/Win32 has
been released. It is available for download from <A
href="http://www.amibroker.com/download.html">http://www.amibroker.com/download.html</A>.
Please upgrade to the latest version - because it brings several new features
including brand new system test reporting, new studies like Fibonacci
retracement and timezones, faster database engine, and more. All tips that I
will describe in this newsletter will work best with the new version (old
versions may miss some features).</P>
<P><B>III. Tip of the week: Accessing stock data using AmiBroker's automation
interface</B></P>
<P>3.1 Introduction</P>
<P>In this article I want to show the ways to enhance the functionality of
AmiBroker by using scripts. Scripting is rather advanced topic since it requires
a little bit of programming work. Those of you who don't want to touch
programming may just use supplied scripts. I hope that you will find them
useful. Advanced users may modify those scripts for their own needs. </P>
<P>3.2 What is automation?</P>
<P>Automation (also known as OLE Automation) makes it possible for one
application to manipulate objects implemented in another application, or to
"expose" objects so they can be manipulated. AmiBroker acts as an automation
server. An Automation server is an application that exposes programmable objects
to other applications, which are called Automation clients. Exposing
programmable objects enables clients to automate certain procedures by directly
accessing the objects and functionality the server makes available. You can
access automation server's objects from a number of programming languages
including C/C++, Visual Basic, VBScript and JScript. Especially two latter
languages (VBScript and JScript) are interesting from your point of view
because: a) they are scripting (interpreted) languages - no compilation is
required; b) they are available for free as a part of Windows Scripting Host
(WSH).</P>
<P>3.3 What is Windows Scripting Host?</P>
<P>The Windows Scripting Host (WSH) is a language-independent scripting host for
32-bit Windows platforms. Microsoft provides both Microsoft® Visual Basic®
Scripting Edition (VBScript) and Microsoft® JScript™ scripting engines with WSH.
Other software companies will provide ActiveX™ scripting engines for languages
such as Perl, TCL, REXX, Python, and others. Windows Scripting Host is
integrated into Windows® 98, Windows 2000. It is also available as a free
component for Windows 95 and NT4.0 (you can download it from
http://msdn.microsoft.com/scripting/windowshost/default.htm ). Windows Scripting
Host can be run from either the Windows-based host (Wscript.exe), or the
command-shell-based host (Cscript.exe). VBScript and JScript files are simple
text files, so you can use even Notepad to edit them. VBScript files have
default .vbs extension while JScript files have .js extension. The Windows
Explorer is set up by default in such a manner that double clicking on .js or
.vbs script file causes executing it.</P>
<P></P>
<P>3.3 How AmiBroker supports automation/scripting?</P>
<P>AmiBroker exposes a number of automation objects (described in <I>Automation
Object Model Reference</I> section of AmiBroker's User guide). These objects can
be accessed from a number of languages including WSH's VBScript and JScript. In
this article we will use JScript (a Microsoft dialect of Java Script). AmiBroker
objects are organized in a hierarchy show in the picture below (not all objects
shown):</P>
<P><IMG align=baseline alt="" border=0 hspace=0
src="cid:001b01c0474b$c84d43c0$0100007f@xxxx"></P>
<P>As you can see all objects are accessible from the parent <B>Application</B>
object. So all your scripts must first create AmiBroker <B>Application</B>
object and then access the objects located deeper in the hierarchy. In the
picture above you can see that some of the objects have yellow color - these
object represent <I>collections.</I> A <I>collection</I> is an object that
contains zero or more objects of the same class. So <B>Stocks</B> collection
contains zero or more objects of the <B>Stock</B> class. Collections are used
mainly to interate thru objects and manage adding/removing of the objects
belonging to a collection. As you can guess you will work the most often with a
<B>Stocks</B> and <B>Quotations</B> collection and a <B>Stock</B> and
<B>Quotation </B>objects. These (and other) objects expose <I>properties</I>
that are data members of the object. The value of the property can be retrieved
or set (if the property is not read-only). For example <B>Quotation</B> object
has <B>Date, Open, Close, High, Low, Volume, OpenInt </B>properties that holds
this quotation data. A complete list of properties of AmiBroker objects'
properties can be found in <I>Automation Object Model Reference</I> sectionof
AmiBroker's User guide. Object could have also <B>methods</B>. A method is
aprocedure that is exposed by an object and performs a specific action (for
example <B>Application</B> object has a method called <B>RefreshAll()</B> which
refreshes all views and lists of AmiBroker).</P>
<P>3.4 Accessing AmiBroker's object</P>
<P>NOTE: Now we will write some JScript code - if you want to experiment a
little please lauch any plain text editor (it could be even Notepad) to write
the code - you work should be saved to the file with .JS extension in orderto
enable it to run by WSH. <BR></P>
<P>In order to gain an access to any AmiBroker object you have to create
AmiBroker Application object. This can be done by following JScript code:</P>
<BLOCKQUOTE>
<P><CODE>var oAB = WScript.CreateObject("Broker.Application");
</CODE></P></BLOCKQUOTE>
<P>Note that WScript is a built-in object of Windows Scripting Host. The same
effect can be obtained by the following:</P>
<BLOCKQUOTE>
<P><CODE>var oAB = new ActiveXObject("Broker.Application");
</CODE></P></BLOCKQUOTE>
<P>Note that we don't use WScript object now. In both cases oAB object is an
actual AmiBroker Application object. We can now access its methods and/or
properties. For example we can close AmiBroker programmatically by calling
Quit() method:</P>
<BLOCKQUOTE>
<P><CODE>oAB.Quit();</CODE></P></BLOCKQUOTE>
<P>You now give it a try: enter above lines in the text editor, save the file
under the name <I>Quit.js</I> , launch AmiBroker by hand, and double click on
the Quit.js file in the Windows Explorer. You will see that AmiBroker has
closed.</P>
<P>Application object gives you an access to other object such as Stocks
collection. For example the full name of the first stock in the list could be
by:</P>
<BLOCKQUOTE>
<P><CODE>oAB.Stocks.Item( 0 ).FullName;</CODE></P></BLOCKQUOTE>
<P>or</P>
<BLOCKQUOTE>
<P><CODE>oAB.Stocks( 0 ).FullName;</CODE></P></BLOCKQUOTE>
<P>The latter method works because <B>Item( )</B> is the default property of
<B>Stocks</B> collection. Stocks collection elements could be also referenced by
name for example:</P>
<BLOCKQUOTE>
<P><CODE>oAB.Stocks( "^DJI" ).FullName;</CODE></P></BLOCKQUOTE>
<P>Now it's the time for something more complicated but also more useful.</P>
<P>3.5 Example 1: Exporting stock information to the text file</P>
<P>In this example we will write the script that exports stock information (full
name, address, industry, market and group assignments) to a comma separeted
values text file.</P>
<P>Let's begin with creating AmiBroker Application object and FileSystem object.
The latter object will be used to create and write text to a disk file.</P>
<BLOCKQUOTE>
<P><CODE></CODE><CODE>var oAB = new ActiveXObject("Broker.Application");
<BR></CODE><CODE>var fso = new ActiveXObject("Scripting.FileSystemObject");
<BR>file = fso.OpenTextFile( "Info.txt", 2, true ); </CODE></P></BLOCKQUOTE>
<P>In the third line we create a text file called "info.txt" with write access
(2). The second parameter (true) tells file system that we are creating a new
file. </P>
<P>Then we will retrieve the number of stocks in the <B>Stocks
</B>collection:</P>
<BLOCKQUOTE>
<P><CODE>var oStocks = oAB.Stocks; <BR>var Qty = oStocks.Count;
</CODE></P></BLOCKQUOTE>
<P>Now we can iterate through stocks retrieving needed information and writing
them to the file:</P>
<BLOCKQUOTE>
<P><CODE>for( i = 0; i < Qty; i++ )
<BR>{<BR></CODE><CODE> oStock = oStocks( i
);<BR></CODE><CODE> file.Write( oStock.Ticker + "," );
<BR> file.Write(</CODE><CODE> oStock.FullName + ","
);<BR> file.Write( oStock.Address + ","
);<BR> file.Write( oStock.IndustryID + ","
);<BR> file.Write( oStock.MarketID + ","
);<BR> file.WriteLine( oStock.GroupID ); <BR>} <BR>file.Close();
<BR>WScript.Echo("Export finished" ); </CODE></P></BLOCKQUOTE>
<P>As you can see we use Write() and WriteLine() methods of file object to write
the text to a disk file. WriteLine() is different from Write() in that it simply
adds a new line character at the end of text written. As an excercise you can
add other properties to the list such as oStock.BookValue, oStock.Issue andso
on. Also financial data (quaterly income, earnings) could be accessed in that
way. Note that you need to supply quarter number (0-3) for accessing these
properties. For example oStock.FinanceEAT( 0 ) accesses first (zero based index)
quarter earnings after taxes.</P>
<P>A ready to use script can be found attached (Info.js) <A
href="Info.js">here</A>.</P>
<P>3.6 Example 2: Exporting quotation data</P>
<P>In this example we will write the script that exports all quotations of
currently selected stock to the CSV file.</P>
<P>As before we will start with creating AmiBroker Application object and
FileSystem object. </P>
<BLOCKQUOTE>
<P><CODE>var oAB = new ActiveXObject("Broker.Application");
<BR></CODE><CODE>var fso = new ActiveXObject("Scripting.FileSystemObject");
</CODE></P></BLOCKQUOTE>
<P>Then we will determine ticker of currently selected stock and we will create
a file called <TICKER>.CSV . Then we will retrieve the number of
quotations of that stock.</P>
<BLOCKQUOTE>
<P><CODE>Ticker = oAB.ActiveDocument.Name;<BR>file = fso.OpenTextFile( Ticker
+ ".csv", 2, true ); </CODE></P>
<P><CODE>var oStocks = oAB.Stocks;<BR>oStock = oStocks( Ticker );<BR>var Qty =
oStock.Quotations.Count;</CODE> </P></BLOCKQUOTE>
<P>Now we will iterate through quotes and write them to the CSV file:</P>
<BLOCKQUOTE>
<P><CODE>for( i = 0; i < Qty; i++ )<BR>{<BR> oQuote =
oStock.Quotations( i );</CODE></P>
<P><CODE> var oDate = new Date( oQuote.Date );</CODE></P>
<P><CODE> file.WriteLine( oStock.Ticker + "," +
<BR> oDate.getFullYear() + "-" +
oDate.getMonth()+1 + "-" + oDate.getDate() + "," +
<BR> oQuote.Close + "," +
<BR> oQuote.Open + ","
+<BR> oQuote.High + ","
+<BR> oQuote.Low + "," +
<BR> oQuote.Volume );<BR>}</CODE></P>
<P><CODE>file.Close();</CODE></P></BLOCKQUOTE>
<P>Yes... it's that simple! When you try this script you will find that price
values are listed with too many decimal digits, therefore additional formatting
may be needed to make this script nicer. Also we may want to include AmiBroker's
style $FORMAT command that specify the data layout in the file so it could be
easily imported back to AmiBroker.</P>
<P>These and other improvements are included in the <A href="Export.js">ready to
use version</A> (Export.js) of the script. A special FormatFloat() functionis
used to cut the number to 2 decimal places. </P>
<P>3.7 Conclusion</P>
<P>AmiBroker's automation interface allows the user to extend AmiBroker's
functionality by writing the scripts that implement features that could notbe
found in AmiBroker itself. Automation interface is the one of AmiBroker's
features that decide on its flexibility and extensibility not often found in
competitors' products.</P>
<P>=============================================================================</P></DIV>
<DIV> </DIV></BODY></HTML>
------=_NextPart_002_001E_01C04754.2A194CE0--
------=_NextPart_001_001D_01C04754.2A194CE0
Content-Type: image/gif;
name="model.gif"
Content-Transfer-Encoding: base64
Content-ID: <001b01c0474b$c84d43c0$0100007f@xxxx>
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
wiI8wsAQAgA7
------=_NextPart_001_001D_01C04754.2A194CE0--
Attachment:
Description: Binary data
Attachment:
Attachment:
Description: "Description: Binary data"
Attachment:
|