Metastock is a popular data format for storing end-of-day and intraday stock quotes data.
It's a very old format with a structure that is a total mess. I myself have spent a lot of time figuring how to properly read quotes in a jungle of different files and formats.
Here, I present the actual C# code I use to interface with the database that I update every evening from my data vendor.
Information on the metastock data structure is scattered over the web. I've collected what seemed to work and implemented as a C# class. A special thank you to Julian M Bucknall for providing the code to convert from MBF4 (Microsoft Binary Format single precision) to standard floating point IEEE number.
The library is organized as follows:
public struct MetaStockRow
public DateTime Day;
public double Open;
public double High;
public double Low;
public double Close;
public double Volume;
public double OpenInterest;
struct MetaStockRow stores one day of data
- A set of
MetaStockRow(s) forms a
MetaStockTable, that is, the whole data for a stock symbol
- A set of
MetaStockTable(s) forms a
MetaStockCollection, which is useful when you have to work with more than one stock at a time. A special feature of
MetaStockCollection is the capability to intersect dates, that is, making sure that the stocks you are working with have the same data points (days).
MetaStockCollections are generated by the class
MetaStockReader which is the main object that performs the low-level reading on the database files.
How to use the code:
- Create a
AddPath() to tell it where your metastock folders are located (usually there is more than one)
- Create a
- Insert stocks in the collection with
- Trim and sync dates in the collection with
- Get daily closes with
MetaStockReader MR = new MetaStockReader();
MetaStockCollection ML = new MetaStockCollection();
ML = ML.FilterPeriod(DateTime.Parse("01/01/2000"),DateTime.Parse("31/12/2011"));
ML = ML.IntersectDates();
double s1 = ML.GetCloseArray();
double s2 = ML.GetCloseArray();
If you need to work with just one stock, you can avoid using
MetaStockCollection and work directly with
MetaStockTable objects and access to its
There is a little more in the code of what I've shown here, but if you take a look at the sources you can easily discover by yourself all the other features. I must warn you the code quality is rather poor, because I haven't spent much time in improving it. I stopped when it "worked" (shame on me!).
Download the C# source code here.