Mql4 ile MS-SQL Servera Data Aktarmak

mql4 ile mssql server data aktarma işlemiMetaTrader 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)

 

Summary
Mql4 ile MS-SQL Servera Data Aktarmak
Article Name
Mql4 ile MS-SQL Servera Data Aktarmak
Description
Meta Treader programının sağladığı anlık finansal bilgileri dll yardımı ile MS SQL Server a nasıl kayıt edebiliriz bunu araştıracağız.
Author
Publisher Name
aligokayduman.com
Publisher Logo
6 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir