Mql4 ile MS-SQL Servera Data Aktarmak
MetaTrader için yazdığınız Expert Advisor veya Indicator gibi robot yazılımlar bazı durumlarda ihtiyaçlarınızı tam olarak karşılamaz. Bunun sebebi yazdığınız kodun içinde çalıştığı platformun yetenekleri (kısıtlamaları) ile sınırlı olmasıdır. Son zamanlarda yaşadığım bazı sorunların kendimce çözümlerini paylaşmak istiyorum.
Bu makalenin anlaşılabilmesi için temel düzeyde Delphi, Mql, MetaTrader Kullanımı ve Sql bilgisi gerekmektedir.
Sorunlar :
- Tarih aralığı geniş olan bir grafikte (Bir yıllık dakika veya Tick Data ) derinlemesine analiz ve hesaplamalar yaparken takılmalar, yavaşlık ve MetaTrader’ın kendini kapatma sorunları.
- Ex4 dosyasını decompile işleminden koruyamamak (Ticari beklenti ile geliştirdiğiniz mql kodunun ele geçirilmesini önleyememek.)
Çözüm : Bu iki sorun için bulduğum en iyi çözüm dll ve veri tabanı teknolojilerinin yazdığınız mql koduna entegre olarak kullanılması.
Örnek : Pariteye ait açılış, kapanış, en düşük ve en yüksek fiyatın sizin belirlediğiniz bir periyotta ms-sql server’a kaydedilmesini sağlayan mql ve delphi kodları.
Bu örnekteki amaç; 1. büyük veriler üzerindeki analiz ve hesaplama yükünü ms-sql server’a vermek. 2. Kod güvenliğini dll ile gerçekleştirmek.
Yazının fazla uzamaması için sadece veri tabanına kayıt işlemini göstereceğim ve açıklamalarımı kodlar’ın içinde yapacağım. Bundan sonrası sizin hayal gücünüze kalmış.
SqlDataExport.mq4
#property copyright "Ali Gökay Duman" #property link "http://www.aligokayduman.com" #property version "1.00" #property strict #property indicator_chart_window #import "DataTransfer.dll" double SqlServerTransfer(string pOpen,string pHigh,string pLow,string pClose,string pVolume); #import /*oluşturduğunuz dll dosyasını yukarıda gördüğünüz şekilde import ediyorsunuz. Import bloklarının arasına da kullanacağınız functionları geri dönüş tipini belirterek yazıyorsunuz. ** MetaTrader4 kullanıyorsanız eğer yeni sürümde dll dosyasını koyacağınız klasörün yeri değişti. Kendi bilgisayarımdan örnek vermem gerekirse C:\Users\G\AppData\Roaming\MetaQuotes\Terminal\1DA5E63E820FA59088CC9B330132EFC4\MQL4\Libraries\ */ double Sonuc; int OnInit() { EventSetTimer(900); /* 900 saniyede bir yani 15 dakikada bir timer çalışacak */ return(INIT_SUCCEEDED); } void OnDeinit() { EventKillTimer(); /* Kapanışta timer temizlenir */ } void OnTimer() /* Timer her çalıştığında SqlDataTrasfer fonksiyonu çalışacak */ { SqlDataTrasfer(); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { return(rates_total); } void SqlDataTrasfer() { Sonuc=-1; Sonuc=SqlServerTransfer(DoubleToStr(Open[0]),DoubleToStr(High[0]),DoubleToStr(Low[0]),DoubleToStr(Close[0]),DoubleToStr(Volume[0])); if (Sonuc==1) Print(Symbol()+" Sql Server Data Trasferi Yapıldı"); if (Sonuc==0) Print(Symbol()+" Hata Oluştu"); /* dll de yazdığımız geri dönüş değerini boolean veya string olarak da tanımlayabilirsiniz. Bununla ilgili detaylı bilgi alabileceğiniz kaynağın linkini aşağıda verdim. */ }
SqlDataExport.dll
library DataTransfer; uses SysUtils, Classes, ADODB, {Sql Bağlantı için Ado kütüphanesini ekledik.} Dialogs, ScktComp, WinSvc, System; {$R *.res} {Her dilin değişken tip yapıları farklı olduğu için mql ile oluşturulmuş string değişkenin değerini delphi ile oluşturulmuş dll dosyasına paslayabilmek için delphide PWideChar tipini kullandım. iki platform için tip karşılıklarını aşağıda verdiğim linkte bulabilirsiniz.} Function SqlServerTransfer(pO,pH,pL,pC,pV:PWideChar):double stdcall; var q_Sql: TADOQuery; Ado_Con: TADOConnection; query:String; Begin Try Ado_Con := TADOConnection.Create(nil); Ado_Con.LoginPrompt := False; q_Sql := TADOQuery.Create(nil); q_Sql.Active := False; if not Ado_Con.Connected then Begin Ado_Con.Close; Ado_Con.ConnectionString := 'Provider=SQLOLEDB.1;Password=Password;Persist Security Info=True;User ID=User;Initial Catalog=DataBase;Data Source=ServerName'; Ado_Con.ConnectionTimeout := 30; Ado_Con.Connected := True; End; if not Ado_Con.Connected then Result := 0; q_Sql.Connection := Ado_Con; query :=' insert into MetaData(TarihSaat,OpenPrice,HighPrice,LowPrice,ClosePrice,Volume) '+ ' values '+ ' (getdate(),'+QuotedStr(pO)+','+QuotedStr(pH)+','+QuotedStr(pL)+','+QuotedStr(pC)+','+QuotedStr(pV)+') '; q_Sql.Close; q_Sql.SQL.Text := query; q_Sql.ExecSQL; Result := 1; except Result := 0; end; End; Exports SqlServerTransfer; {Yazdığınız fonksiyona erişebilmek için Exports satırında belirtmeniz gerekmektedir. } Begin End
MetaData Tablosu
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[MetaData]( [ID] [int] IDENTITY(1,1) NOT NULL, [TarihSaat] [smalldatetime] NULL, [OpenPrice] [float] NULL, [HighPrice] [float] NULL, [LowPrice] [float] NULL, [ClosePrice] [float] NULL, [Volume] [float] NULL ) ON [PRIMARY] GO
Kaynaklar
* http://www.mql5.com/en/articles/96 (Guide to writing a DLL for MQL5 in Delphi)


Related Posts

Adım Adım Linux VPS Uygulama Server Kurulumu Adım 2

Android destekleme kütüphanesi (support library) kurulumu

Faydalı bir yazı olmuş. Ellerinize sağlık, aradığım pek çok şeyi buldum.
Tesekkurler… En kısa zamanda deneme yapacağım…..
Paylaşımınız icin tekrar tesekkür ederim.
Merhaba,
Öncelikle değerli paylaşımınız için teşekkür ederim.
Bence çözümü MetaTrader’da kullanmak istedim ancak yazmış olduğunuz Delphi kodunun derlenmiş haline ihtiyacım var. Aslında değişiklik yapmak istediğimde gene Delphi’den DLL oluşturmam gerekiyor ancak bu işlemde ücretli. Lazarus benzeri bir araçla yapılabilir mi? Alternatifler konusunda bilgi verebilirseniz harika olur.
Saygılarımla,
Ahmet
Windows işletim sisteminde sorunsuz bir bağlantı için dll dosyanızı .net veya c++ ortamında geliştirmenizi tavsiye ederim. “delphi 7 gibi eski sürümler ile derlenmiş dll dosyaları yeni windows sürümlerinde sorun çıkartabiliyor.” yaklaşık bir senedir msssql yerine sqlite kullanıyorum (performanslı ve hatasız). Vakit bulursam bu konuda makale yazacağım. Biraz geç oldu ama halen ihtiyacınız varsa [email protected] mail adresimden ulaşırsanız size delphi ortamında derlenmiş dll dosyasını gönderebilirim.
Merhaba,
MQL ile SQL iletişimini detaylı bir şekilde anlatan bir doküman var mı acaba?
Mql4-5 documents veya forum sayfalarından yararlanabilirsiniz. Malesef mql için internet ortamında örnek kod bulmak biraz zor. Takıldığınız her konuda yazabilirsiniz, yardımcı olmaya çalışırım.