Metastock için tüm sembollere ait belli sayýda barýn bilgilerini text dosyaya aktarmak istiyoruz.
Daha önce yapmadým , yapalým, siz deneyin, oluyor mu bakalým.
Bir defaya mahsus yapacaklarýmýz;
a-Dosya Formatýnýn Belirlenmesi
b-Sorgu ekranýndan tetiklenecek olan, seçtiðimiz periyot ve hisse senetleri(tümü,100,30 vb.) için belli bir "gün" deki verileri dosyaya yazan bir Sistem Yazýlmasý.
Bunlarý saðlarsak eðer metastock import dosyasýný oluþturmak için sadece sorgumuzu açýp "Hesapla" butonuna basmak yeterli olacaktýr.
a-MetaStock Import File Formatýný bulalým önce;
Metastock forumlarýnda aþaðýdaki gibi bir format buldum.
<NAME>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CL OSE>,<VOL>,<OPENINT>
INTC,15,20040518,14:30:00,27.30000,27.31000,27.240 00,27.28000,1900111,0
Bizim dýþarýya ASCII Text csv dosyasý çýkartmamýz gerekiyor.
Bu örnek satýrý üretmeye çalýþalým biz öyleyse.
Farklý formatlarda gördüm versiyona göre deðiþiyormu bilmiyorum ama deðiþiyorsa bile uygulayacaðýmýz yöntemi dilediðiniz hale getirip sonuç alabilirsiniz.
b-Dosyaya çýkartmak için bir sistem yazalým. Bu sistemi "SORGU" ekraný için yazalým.
Adýda "Sorgu_MetaStockImport7" olsun.
Neden 7?
Çünkü Sorgu ekranýnda periyot seçimi var yani dinamik olacak,
Sembol gruplarýda var (tümü,100,30 vb.) dinamik olacak,
fakat bar adedi seçimi yok. Bu 7 bar olmasýn ama her periyot için 7 Gün olsun. Periyot sorgu penceresinde Gün seçildi ise 7 Bar 60 seçildi ise 7*8 bar vb. olsun.
Bilelimki her týklamada 1 haftaya ait veriyi çýkartýyor.
Bu nedenle yazacaðýmýz sistemde statik olarak belli bir bar adedini export edeceðiz dosyaya.
Ýhtiyacýnýza göre siz deðiþtirirsiniz bu 7 yi.
Sorguya dair gördüðüm önemli bir bilgi, ne kadar döngü kurarsanýz kurun, Sorgu penceresinde her hisse için sadece tek satýr çýktý verebilirsiniz!
Sistem.SorguEkle() komutunu döngü içerisine alarak bu durumu deðiþtiremssiniz.
Bu nedenle bizim amacýmýz ekranda import verilerini görmek deðildir.Ekranda sadece hangi hisselerin verilerinin import edildiðini göreceðiz.
Bu yüzden Sorgu kolonlarýda þunlardan ibaret olsun; No, Sembol ve Açýklama default geliyor zaten. Biz açýklamaya "Aktarýmý Yapýlmýþtýr" yazalým oldu bitti.
Sistemimiz aþaðýdaki gibidir;
Küçük periyotlu dosyalarýn oluþmasý uzun sürebilir, sorgu pencresinde sað üstte devam eden hisseyi görürsünüz.
Önemli Not: Her Hesapla denildiðinde dosya içeriðine ekleme olur.
Ýdeal sorgu yapýsýndan dolayý bunu tam yönetemedik.
Prensib olarak ayný günde yapacaðýnýz her hesapla iþlemi öncesi çýktý dosyanýzý silin. dosya isminde günün tarihi var çünkü.
Mükerrer olmamasýna dikkat edin. yaparsanýzda metastock sembol ve datetime a göre overwrite yapacaðýndan sorun olmayacaktýr bu durum.
Sorun olursa linki:
http://csharppad.com/gist/7c8bc1a8d8...0f83d10ee6a764
PHP Code:
//Ayarlar -------------------------------------------
bool BaslikSatiriOlsumu= true;
string Ayrac=";";
int KacGun = 7;
string DosyaAdi = @"d:\Metastock_"
+ DateTime.Now.ToString("dd.MM.yyyy")
+".csv";
//Desenler -------------------------------------------
string Headers = "NAME"+Ayrac+
"PER"+Ayrac+
"DATE"+Ayrac+
"TIME"+Ayrac+
"OPEN"+Ayrac+
"HIGH"+Ayrac+
"LOW"+Ayrac+
"CLOSE"+Ayrac+
"VOL"+Ayrac+
"OPENINT";
string Values = "{0}"+Ayrac+"{1}"+Ayrac+"{2}"+Ayrac+"{3}"+Ayrac+"{4}"+Ayrac+"{5}"+Ayrac+"{6}"+Ayrac+"{7}"+Ayrac+"{8}"+Ayrac+"{9}";
//Dosya Yoksa ilk oluþtuðunda Header yaz ---------------------------------------
if (!File.Exists(DosyaAdi))
{
if(BaslikSatiriOlsumu) {
using (FileStream fs = new FileStream(DosyaAdi ,FileMode.Append, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(Headers );
}
}
}
//Hisseye ait Toplam Barý Bul (Burasýný iyi kontrol etmedim, bar sayýlarý sorunlu olabilir, her periyot olmayabilir, ayarlayýn iþte:)
int ToplamBar= 0;
if(Sistem.Periyot=="G") ToplamBar = KacGun;
else if(Sistem.Periyot=="240") ToplamBar = KacGun * 2;
else if(Sistem.Periyot=="120") ToplamBar = KacGun * 4;
else if(Sistem.Periyot=="60") ToplamBar = KacGun * 8;
else if(Sistem.Periyot=="30") ToplamBar = KacGun * 8 * 2;
else if(Sistem.Periyot=="15") ToplamBar = KacGun * 8 * 2 * 2;
else if(Sistem.Periyot=="5") ToplamBar = KacGun * 8 * 2 * 2 * 3;
else if(Sistem.Periyot=="1") ToplamBar = KacGun * 8 * 2 * 2 * 3 * 5;
//Sembol için Bar Döngüsüne gir------------------------------------------------
for (int i = Sistem.BarSayisi - ToplamBar ; i < Sistem.BarSayisi; i++)
{
// Bar'a ait Satýrý Oluþtur------------------------------------------------------
string barline= string.Format(
Values
,Sistem.Sembol.Replace("IMKBH","").Replace("'","")
,Sistem.Periyot.ToString()
,Sistem.GrafikVerileri[i].Date.ToString("yyyyMMdd")
,Sistem.GrafikVerileri[i].Date.ToString("HH:mm")
,Sistem.GrafikVerileri[i].Open.ToString().Replace(",",".")
,Sistem.GrafikVerileri[i].High.ToString().Replace(",",".")
,Sistem.GrafikVerileri[i].Low.ToString().Replace(",",".")
,Sistem.GrafikVerileri[i].Close.ToString().Replace(",",".")
,Sistem.GrafikVerileri[i].Vol.ToString().Replace(",",".")
//,Sistem.LotGun(Sistem.Sembol).ToString().Replace(",",".") //Hacim lot olacaksa bunu açýp üsttekini kapatýn
,Sistem.GrafikVerileri[i-1].Close.ToString().Replace(",",".")
);
// Bar'a ait Satýrý Dosyay Yaz---------------------------------------
using (FileStream fs = new FileStream(DosyaAdi ,FileMode.Append, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(barline);
}
} // For'a ait
//Sorgu Ekranýna Ekleme -----------------------------------------------
Sistem.SorguAciklama = "Aktarýmý Yapýlmýþtýr";
Sistem.SorguEkle();
//----------------------------------------------------------------------------

Yer Ýmleri