newstrader.
Mitglied seit 11 Jahre 2 Monate
* Metastock Daten-Format-Definition
Hallo,
ich suche Informationen zum neuen Metastock Daten-Format. Es geht darum die binären Dateien mit historischen Daten aus externen Programmen heraus zu bearbeiten bzw. um darauf zuzugreifen.
Kennt jemand eine öffentliche Quelle, die über die Struktur dieser Dateien Aufschluß gibt? Oder hat jemand einen Quellcode den man nach eigenen Bedürfnissen modifizieren kann?
Falls ja, danke für die Hilfe!
Gruß!
Geschrieben von newstrader.
am
http://www.purebytes.com/archives/metastock/2001/msg04885.html
Das hatte ich mir mal dazu gespeichert.
Viele Grüße
Hallo,
danke für den Link! Genau sowas suche ich! Falls es noch mehr Quellen gibt wäre trotzdem sehr interessiert.
Gruß!
http://www.borsaedati.it/document/DataFormat.doc
vgl.
http://www.terminmarktwelt.de/cgi-bin/tmw-forum.pl?ST=4976&CP=6
Hallo RSPhoenix,
investiere 49.95$ und hole dir Metalib ( http://www.trading-tools.com/metalib.htm ), hier bekommst du alle nötigen Funktionen, die du zur Bearbeitung von MS Daten brauchst.
Alles andere ist zu zeitaufwendig.
@ all
Hallo,
danke für die Hinweise! Hat mir schon weiter geholfen und ich denke ich habe jetzt alles notwendige!
Gruß!
es hängt auch immer davon ab, was genau es für ein Projekt sein soll. Wenn es ein öffentliches Open-Source-Projekt ist, würde ich gegebenfalls den Sourcecode, den ich habe, beisteuern. In Abhängigkeit davon, ob das Projekt von allgemeinem Interesse/Nutzen ist und aktiv daran gearbeitet wird.
Wenn es ein kommerzielles Projekt ist, hängt es davon ab, was mir als Gegenleistung geboten wird.
Ich hatte einfache Routinen in native Java implementiert, die Master, EMaster und XMaster Index-Dateien sowie .dat/.mwd-Datenfiles auslesen können.
Die Routinen sind eine gute Basis, um die einzelnen Formate zu verstehen, Portierbarkeit nach anderen Sprachen (z.B. C# oder auch C++) sollte nicht problematisch sein.
Die Routinen waren nicht als fertige Library gedacht, z.B. wurde nur das Auslesen implementiert, wobei das Schreiben aber kein grosses Problem wäre, wenn man die Datenfelder kennt. Auf Java-Ebene ist z.B. Iterieren durch die Einträge in den Index-Dateien möglich:
public class MetaStockDatabase
{
ArrayList path=new ArrayList();
TreeSet masterFileEntries=new TreeSet();
public MetaStockDatabase()
{
}
public MetaStockDatabase(String dir)
{ addPath(new File(dir), true);
}
public void addPath(File dir, boolean includeSubdirs)
{ if (!dir.isDirectory()) throw new IllegalArgumentException("Can only add directories to the seachpath,"+
" but not "+dir);
path.add(dir);
}
public void addPath(String dir)
{ addPath(new File(dir), true);
}
public void rescan()
{ // masterFileEntries.clear();
masterFileEntries=new TreeSet();
Iterator iter=path.iterator();
while ( iter.hasNext() )
{ File dir=(File)iter.next();
processDir(dir, true, masterFileEntries);
}
}
void processDir(File dir, boolean includeSubdirs, Collection mfEntries)
{
File masterFile=new File(dir, "MASTER");
File xMasterFile=new File(dir, "XMASTER");
MasterFiles.processMasterFile(masterFile, mfEntries);
MasterFiles.processXMasterFile(xMasterFile, mfEntries);
File[] dirContents=dir.listFiles();
if ( includeSubdirs )
{
for ( int i=0; i<dirContents.length; i++ )
{ if ( dirContents[i].isDirectory() )
processDir(dirContents[i], includeSubdirs, mfEntries);
}
}
}
public Collection getMasterFileEntries()
{ return masterFileEntries;
}
public static void main(String[] args)
{
if ( args.length==0 )
{ System.err.println("Usage: java MetaStockDB <Metastock directories>");
System.exit(-1);
}
MetaStockDatabase metaStDB=new MetaStockDatabase();
for ( int i=0; i<args.length; i++ ) {
metaStDB.addPath(new File(args[0]), true);
}
metaStDB.rescan();
Iterator iter=metaStDB.getMasterFileEntries().iterator();
while ( iter.hasNext() )
{ MasterFileEntry mfEntry=(MasterFileEntry)iter.next();
System.out.println("\n"+mfEntry);
}
}
package wschwendt.metastock;
import java.io.File;
public class MasterFileEntry implements Comparable
{
byte periodicity;
String ticker;
String securityName;
int firstDate;
int lastDate;
int startTime;
int endTime;
short numFields;
File fileName;
short intradayInterval;
boolean composite=false;
public int getPeriodicity()
{ return periodicity;
}
public int getFirstDate()
{ return firstDate;
}
public int getLastDate()
{ return lastDate;
}
public int getStartTime()
{ return startTime;
}
public int getEndTime()
{ return endTime;
}
public String getTicker()
{ return ticker;
}
public String getSecurityName()
{ return securityName;
}
public File getFileName()
{ return fileName;
}
public int getIntradayInterval()
{ return intradayInterval;
}
public int getNumFields()
{ return numFields;
}
public String toString()
{ String result=
"MasterFileEntry:"+
"\nFileName "+fileName+
"\nTicker: "+ticker+
"\nSecurityName: "+securityName+
"\nPeriodicity: "+((char)periodicity)+
"\nIntradayInterval: "+intradayInterval+
"\nFirstDate: "+firstDate+
"\nLastDate: "+lastDate+
"\nStartTime: "+startTime+
"\nEndTime: "+endTime+
"\nNumFields: "+numFields+
"\nComposite: "+composite;
return result;
}
public int compareTo(Object object)
{ if (! (object instanceof MasterFileEntry)) throw new ClassCastException("Cannot compare a"+
"MasterFileEntry object with an object of type "+object.getClass().toString());
MasterFileEntry mfEntry2=(MasterFileEntry)object;
int tickerComparison=ticker.compareTo(mfEntry2.ticker);
if ( tickerComparison!=0 ) return tickerComparison;
if ( periodicity!=mfEntry2.periodicity )
{
return periodicity-mfEntry2.periodicity;
}
else if (periodicity == (byte)'I')
{ return intradayInterval-mfEntry2.intradayInterval;
}
return 0;
}
}
java MasterFiles g:\\data2\\INDICES
MasterFileEntry:
FileName G:\data2\INDICES\F16.DAT
Ticker: QQQ
SecurityName: Qqq
Periodicity: D
IntradayInterval: 0
FirstDate: 19990310
LastDate: 20030815
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F31.DAT
Ticker: ^AEX
SecurityName: ^AEX
Periodicity: D
IntradayInterval: 0
FirstDate: 19921012
LastDate: 20030815
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F35.DAT
Ticker: ^ATG
SecurityName: ^ATG
Periodicity: D
IntradayInterval: 0
FirstDate: 19970910
LastDate: 20030807
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F11.DAT
Ticker: ^BSESN
SecurityName: ^BSESN
Periodicity: D
IntradayInterval: 0
FirstDate: 19970701
LastDate: 20030814
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F28.DAT
Ticker: ^DFX
SecurityName: ^DFX
Periodicity: D
IntradayInterval: 0
FirstDate: 20011206
LastDate: 20030815
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F12.DAT
Ticker: ^DJI
SecurityName: ^DJI
Periodicity: D
IntradayInterval: 0
FirstDate: 19700102
LastDate: 20030815
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F29.DAT
Ticker: ^DOT
SecurityName: ^DOT
Periodicity: D
IntradayInterval: 0
FirstDate: 19990105
LastDate: 20030815
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
MasterFileEntry:
FileName G:\data2\INDICES\F21.DAT
Ticker: ^FTSE
SecurityName: ^FTSE
Periodicity: D
IntradayInterval: 0
FirstDate: 19840402
LastDate: 20030815
StartTime: 0
EndTime: 0
NumFields: 7
Composite: false
(...)
@Global_2
Hallo,
weder OpenSource, noch kommerziell. Es geht einfach nur darum ein umfassendes Datenbank- und Analyse-System für meine PCs zu entwickeln. Einen wichtigen Teil dieser Datenbank sind z.B. PDF-Dateien, Bild-Dokumente, Videos, usw. aber auch meine Kursdaten und Kursarchive. Z.B. Intraday-Archive, End-Of-Day-Archive, usw. Ich bin nun dabei alle Kursdatenbanken auf Metastock-Standard umzustellen, was mir ein paar Gigabyte an Speicher und in Zukunft Arbeit und Zeit spart. D.h. meine gesamte Software soll auf eine einzige Metastock-Datenbank zugreifen.
Aber was soll man denn noch an kommerzieller Software zu Metastock entwickeln?! Es gibt doch schon alles! Ich kenne nur wenig Software für die es so umfassende PlugIns und Sekundär-Software gibt wie für Metastock. Das letzte was die User brauchen ist noch mehr von dem Zeug!
Gruß!