تلفیق متاتریدر ۴ با مایکروسافت SQL سِرور

تلفیق متاتریدر ۴ با مایکروسافت SQL سِرور

تلفیق متاتریدر ۴ با مایکروسافت SQL سِرور

مقدمه

تعامل و یکی شدن با دیگر محصولات، چالش‌ جدید‌ی را در ترید بوجود می‌آورد. و از آن می‌توان استفاده‌های مفید بسیاری کرد، که برخی از آن‌ها را اینجا می‌گویم.‌

می‌توانید تیک‌ها را جمع‌آوری کرده و آن‌ها را برای تحلیل‌های بیشتر به مایکروسافت SQL سرور منتقل کنید. با داشتن یک هیستوری بزرگ از تیک‌ها، می‌توانید هر دوره‌ای، که از کوچک‌ترین واحد زمانی شروع می‌شود، تا هر دوره‌ی غیراستانداردی [که می‌خواهید] را، جمع‌آوری کنید. با داشتن خوانش‌های تیک واقعی، می‌توانید استراتژی‌های وابسته به داده‌های تیک (tick-data)، که به‌عنوان “scalpers” شناخته می‌شوند را، اِشکال‌زدایی کنید.

می‌توانید از یک محل ذخیره‌سازی برای تحلیل سریع داده‌های گرفته‌شده از دیگر اپلیکیشن‌ها، برای مثال، اِکسل یا دیگر نرم‌افزارها یا حتی از محصولات خودتان، استفاده کنید.

به‌عنوان نمونه می‌توانید‌ تمام هیستوری را از History Center نرم‌افزار، درون مایکروسافت SQL سرور تخلیه کنید. آنگاه دیگر نیاز نیست هیستوری را در متاتریدر ۴ ذخیره کنید. این کار به شما کمک می‌کند حافظه‌ی نرم‌افزار را خالی کنید.

با استفاده از خوانش‌هایی که در مایکروسافت SQL سرور ذخیره شده‌اند، می‌توانید شبکه‌های نئورال را محاسبه کنید: برای مثال، STATISTICA – 7.8 برای اینکه به شما اجازه داده شود خوانش‌ها را از SQL دانلود کنید، با انتقال سیگنال‌های شبکه به متاتریدر ۴، می‌توان در حالت واقعی (real-time mode)، این موضوع را حل کرد.

می‌توانید برنامه‌ی خودتان را به زبان دیگر و برای نمادی دیگر توسعه دهید، و سیگنال‌ها را با استفاده از مایکروسافت SQL سرور، منتقل کنید، و فقط می‌ماند توابع اجرایی برای نرم‌افزار و خلاص کردن آن از شر محاسبات جدی.

از این محصولات نرم‌افزاری برای این پروژه استفاده شده‌است

  • MS SQL SERVER 2000 Developer – BASE
  • VISUAL C++ 6.0 SP5 برای ساختن DLL “YZMSSQLExpertSample.dll”
  • MDAC 7

حداقل مجموعه‌ای که باید نصب شود:

  1. MS SQL SERVER 2000 Developer
  2. MDAC 7

با استفاده از MDAC 7 برنامه را اِشکال‌زدایی کردم. هرچند، ممکن است همه‌چیز به‌خوبی روی بعضی از نسخه‌های قدیمی‌تر کار کند. اگر نمی‌خواهید DLL را کامپایل کنید، نیازی نیست Visual C++ 6.0 را نصب کنید یا نصب داشته باشید. می‌توانید از یک DLL آماده استفاده کنید. با این حال، درون آن نام کاربر، نام DSN، و کانکشن‌ها را حک کردم (طوریکه اصلاً پاک نشوند) (= Hardwire کردن). بنابراین، باید تمام موارد لیست‌شده در بالا را در ورژن برنامه‌ی خودتان تکرار کنید. در اینجا به نصب مایکروسافت SQL سرور یا Visual C++ 6.0 اشاره نمی‌کنم زیرا خارج از این مقاله به‌حساب می‌آیند.

بعد از اینکه محصولات نرم‌افزاری مورد نیاز نصب شدند، باید یک DSN بسازیم:

dsn=MT4_SQL_BASE;", "yuraz", "qwerty"

مثالی از دریافت تیک در مایکروسافت SQL سرور

تمام آزمایش‌ها با MS SQL SERVER 2000 Developer انجام شدند. در Visual C++ 6.0، YZMSSQLExpertSample.DLL با استفاده از روش دسترسی به مایکروسافت SQL از طریق ADO، ایجاد شد. MDAC 7 یا MDAC 8 باید نصب شود. فقط مثال‌هایی از چگونگی ساختن رویه‌ها و جداول را بیان می‌کنم.

حداقل مجموعه‌ای که باید در مایکروسافت SQL سرور ایجاد کنیم، پایگاه، جداول و رویه‌ها هستند. بیایید جدول و رویه‌های کار کردن با خوانش‌های تیک (tick quotes) را درنظر بگیریم. اگر بخواهید می‌توانید دیگر توابع را نیز اضافه کنید.

نیاز است که یک پایگاه و جداول را در مایکروسافت SQL بسازید. یک پایگاه جدید با نام MT4TRADE ایجاد کردم. سپس باید جداول را درون آن ایجاد کنیم:

MT4TICK  – جدول تیک‌ها

//-----------------------------------------------------------------------------------
//
//  Structure of MT4TICK Base
//
//    idc             - formed automatically, unique number of record
//    ServerDateTime  - Filled out automatically, when adding a record
//                        Server local time - time when the quote was placed in the table 
//                        (it doesn't have anything in common with the date and time passed by MT4)
//                        it is the time counted by the server itself - it will be the same as the time
//                        of the machine, on which the server has been launched. 
//--- 
//    iDateTime       - date and time in MT4 format, passed from MT4
//    sSymbol         - symbol
//    cAsk            - quote Ask
//    cBid            - quote Bid
//
CREATE TABLE [dbo].[MT4TICK] (
    [idc] [bigint] IDENTITY (1, 1) NOT NULL ,
    [ServerDateTime] [datetime] NULL ,
    [iDateTime] [bigint] NULL ,
    [sSymbol] [char] (6) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
    [cAsk] [numeric](18, 4) NULL ,
    [cBid] [numeric](18, 4) NULL 
) ON [PRIMARY]
GO
 
--- Include automated filling out the ServerDateTime field with the date and time of server MS SQL
ALTER TABLE [dbo].[MT4TICK] ADD 
    CONSTRAINT [DF_MT4TICK_ServerDateTime] DEFAULT (getdate()) FOR [ServerDateTime]
GO

در پایین چگونگی دریافت تیک و ظاهر شدن رویه‌ی جدول‌بندی را داریم:

// 
//    @RetCode int out          --- used for returning
//   ,@psSymbol char(6)         --- symbol
//   ,@piDateTime  bigint       --- date and time of tick arrival
//   ,@pdAsk  float             --- Ask 
//   ,@pdBid  float             --- Bid
//  
//   The procedure just returns 0 
//     if we analyze the code of returning to MQL4, we can see that the quote has reached the procedure and has been tabulated
//     
//
CREATE PROCEDURE dbo.YZ_MT4_TICK
    @RetCode int out          
   ,@psSymbol char(6)
   ,@piDateTime  bigint
   ,@pdAsk  float
   ,@pdBid  float
AS
insert into  MT4TICK   ( sSymbol, iDateTime, cAsk, cBid   )  values  ( @psSymbol , @piDateTime,  @pdAsk ,  @pdBid  )
select @RetCode=0
return @RetCode

از توضیحات بالا می‌توانیم دریابیم که چه رویه‌هایی، برای چه اهدافی، استفاده شده‌اند.

@RetCode – هنگام عبور از DLL هیچ عملکردی ندارد، و فقط برای دریافت کد پایان‌دهی[۱] است.

برپایی مایکروسافت SQL سرور تمام شد. اسکریپتی برای ایجاد یک پیکربندی استاندارد به این مقاله پیوست شده‌است.

بیایید خیال‌پردازی کنیم: راه‌حل‌ها و امتیازات ممکن

می‌توانیم یک فضای داده ایجاد کرده و اطلاعات را از آن گرفته و یا در آن ثبت کنیم. با این روش، نرم‌افزار متاتریدر ۴ را از لزوم ذخیره‌ی هیستوری خوانش‌ها، رها کرده‌ایم. اکنون هیستوری خوانش‌ها در مایکروسافت SQL سرور ذخیره می‌شود و می‌توانیم با این اطلاعات کار کنیم، زودتر استخراج‌شان کنیم و آن‌ها به اپلیکیشن‌های دیگر بفرستیم. می‌توانیم از این داده‌ها استفاده کنیم تا در پکیج‌های نئورال آنالیز شوند، که بیشتر آن‌ها قابلیت کار با فضاهای SQL را دارند.

در زمان واقعی (real time)، نرم‌افزار ممکن است شکل‌دهی سیگنال‌ها را از اندیکاتور ها ادامه داده و آن‌ها را به فضای [ایجادشده] بفرستد و با همین روش [آن‌ها را] تثبیت کند. یک اپلیکیشن خارجی (اکسترنال) می‌تواند در زمان واقعی سیگنال و هیستوری را استخراج کرده، آن‌ها را تحلیل کند و روی مایکروسافت SQL سرور، اجرا و فضای گزارش را تثبیت کرده، و آن‌ها را برای اجرا به نرم‌افزار بفرستد.

بنابراین، ادغام و توزیع عملکردی بین اپلیکیشن‌های موجود در یک مجموعه‌ی ترید خودکار را بدست می‌آوریم.

بسیار خب، اگر دیگر نیازی به ذخیره‌‌سازی خوانش‌های هیستوری نیست، می‌توانیم تنظیمات مربوطه را به این روش انجام دهیم. حداقل تعداد کندل‌ها را در Tools>Options>Charts، تعیین کنید، برای مثال، ۵۰۰۰. نرم‌افزار بسیار سریع‌تر کار خود را آغاز می‌کند زیرا نیازی به اختصاص دادن حافظه برای هیستوری‌ با حجم زیاد ندارد.

تلفیق متاتریدر 4 با مایکروسافت SQL سِرور

سورس تکست‌ها (Source Texts)

کد DLL:

//+------------------------------------------------------------------+
//|                                              Sample DLL for MQL4 |
//|                 Copyright c 2004-2008, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//
//  YURAZ 2008  YZMSSQLExpertSample
//
//  Example DLL Integrating  MT4 with MS SQL 2000
//
//  ADO  MS SQL SERVER
//
//  software used
//
//  VISUAL C++ 6 , SP5 ,  MDAC 7 ,  MS SQL2000 + SP4
//
//+------------------------------------------------------------------+
  
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#pragma pack(push,1)
 
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
   double            vol1;
   double            vol2;
   double            vol3;
   double            vol4;
   double            vol5;
 
  };
 
#pragma pack(pop)
   
struct MqlStr
  {
   int               len;
   char             *string;
  };
  
static int CompareMqlStr(const void *left,const void *right);
   
static int SQLexecProcedure( char *nprc );
static int SQLexecProcedureSignal( char *sSymbol, char* sProcedure );
// static int _YZSQLsqlstrinsql( char *Symbol , unsigned int DateTime , double Ask, double Bid, char *NamePrc );
static int _YZSQLprocedure  ( char *sSymbol, unsigned int pDateTime, double Ask, double Bid, char *NamePrc );
static int _YZSQLprocedureHISTORYPut(char *Symbol,unsigned int Period, unsigned int DateTime,double Open,
                        double High,double  Low, double Close ,double Volume, unsigned int Bar ,char *Procedure);
 
                                                                                                             
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
 
 // place ticks in MS SQL
 // call the procedure as an SQL line passing parameters   "exec YZ_MT4_TICK ?,?,?,?"
/*
  MT4_EXPFUNC int  __stdcall SQLsqlstringTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid,char *sSQLstring)
 {
    int ccc =  _YZSQLsqlstrinsql( Symbol  , DateTime ,  Ask , Bid  , sSQLstring  );
    return(ccc);
 }
*/
 
 // call as a procedure passing parameters
  MT4_EXPFUNC int  __stdcall SQLProcedureTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid,char *Procedure)
 {
    int ccc =  _YZSQLprocedure( Symbol  , DateTime ,  Ask , Bid  ,Procedure );
    return(ccc);
 }
 
 // place a specific candlestick in MS SQL history
 MT4_EXPFUNC int  __stdcall SQLProcedureHistoryPut(char *Symbol,unsigned int Period , unsigned int DateTime,
                double Open,double High,double  Low, double Close ,double Volume,unsigned int Bar ,char *Procedure)
 {
    int ccc  =  _YZSQLprocedureHISTORYPut(Symbol,Period,DateTime,Open,High,Low,Close,Volume,Bar,Procedure);
    return(ccc);
 }
 
 
 // call procedure sProcedure
 // 
 // return -1 error
 //
 MT4_EXPFUNC int  __stdcall SQLProcedureGetInt(char *sProcedure)
 {
        int Ret =    SQLexecProcedure( sProcedure );
     return((int)Ret);
 }
 
 
 MT4_EXPFUNC int  __stdcall SQLProcedureGetSignal  (char *sSymbol, char *sProcedure)
 {
     
     int Ret =    SQLexecProcedureSignal( sSymbol, sProcedure );
     return((int)Ret);
 }
  
//////////////////////////////////
#include "stdafx.h"
#include <stdio.h>
#import "C:\Program Files\Common Files\System\ado\msado20.tlb" \
        rename("EOF","ADOEOF") rename("BOF","ADOBOF")
 
using namespace ADODB;
  
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };
 
// procedure call method
int _YZSQLprocedure( char *sSymbol, unsigned int pDateTime, double Ask, double Bid,   char *NamePrc )
{
  
   HRESULT hr = S_OK;
   _CommandPtr pCmd = NULL;
   _ConnectionPtr pConnection = NULL;
   _bstr_t strMessage, strAuthorID;
 
       ::CoInitialize(NULL);
 
   long codRet = -1;
 
   try {
      
      _ParameterPtr Par1;
      _ParameterPtr Par2;
      _ParameterPtr Par3;
      _ParameterPtr Par4;
      _ParameterPtr Par5;
 
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pCmd.CreateInstance(__uuidof(Command)));
      pCmd->CommandText = NamePrc;  // procedure name
      pCmd->CommandType = adCmdStoredProc;
     
      Par1 = pCmd->CreateParameter( _bstr_t("@P1"), adInteger,   adParamOutput,0,    codRet );
      pCmd->Parameters->Append( Par1 );
      Par1 = pCmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(sSymbol) ,sSymbol );
         pCmd->Parameters->Append(Par1);
      Par2 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pDateTime );
      pCmd->Parameters->Append(Par2);
      Par3 = pCmd->CreateParameter("@pdAsk", adDouble, adParamInput, 4, Ask );
      pCmd->Parameters->Append(Par3);
      Par4 = pCmd->CreateParameter("@pdBid", adDouble, adParamInput, 4, Bid );
      pCmd->Parameters->Append(Par4);
 
      
      pCmd->ActiveConnection = pConnection;
      int hr = pCmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
         Par1 = pCmd->Parameters->GetItem(_bstr_t("@P1"));     // obtain from the procedure
         codRet = Par1->GetValue();
      }
   }
   catch(_com_error  ) {
       //
       // if necessary, process the execution error
          //
       codRet = -1;
 
   }
   if (pConnection)
      if (pConnection->State == adStateOpen)
         pConnection->Close();
 
   ::CoUninitialize();
    return((int)codRet);
}
 
 
 
// place in history Symbol , Period . DateTime, Open , High , Low , Close , Value , Bar
int _YZSQLprocedureHISTORYPut(char *pSymbol,unsigned int pPeriod, unsigned int pDateTime,double pOpen,double pHigh,
                                        double  pLow, double pClose ,double pVolume, unsigned int pBar ,char *pProcedure )
{
 
 
        HRESULT hr = S_OK;
   _CommandPtr pCmd = NULL;
   _ConnectionPtr pConnection = NULL;
   _bstr_t strMessage, strAuthorID;
 
       ::CoInitialize(NULL);
 
   long codRet = -1;
 
   try {
 
      _ParameterPtr ParReturn; // 
      _ParameterPtr Par1; // SYMBOL
      _ParameterPtr Par2; // PERIOD
      _ParameterPtr Par3; // DATETIME
      _ParameterPtr Par4; // OPEN
      _ParameterPtr Par5; // HIGH
      _ParameterPtr Par6; // LOW
      _ParameterPtr Par7; // CLOSE
      _ParameterPtr Par8; // VOLUME
      _ParameterPtr Par9; // BAR
 
 
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pCmd.CreateInstance(__uuidof(Command)));
      pCmd->CommandText = pProcedure;  // procedure name
      pCmd->CommandType = adCmdStoredProc;
     
      ParReturn = pCmd->CreateParameter( _bstr_t("@P1"), adInteger,   adParamOutput,0,    codRet );
      pCmd->Parameters->Append( ParReturn );
 
      Par1 = pCmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(pSymbol) ,pSymbol );
         pCmd->Parameters->Append(Par1);
 
      Par2 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pPeriod );
      pCmd->Parameters->Append(Par2);
 
      Par3 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pDateTime );
      pCmd->Parameters->Append(Par3);
 
      Par4 = pCmd->CreateParameter("@pdOpen", adDouble, adParamInput, 4, pOpen );
      pCmd->Parameters->Append(Par4);
 
      Par5 = pCmd->CreateParameter("@pdHigh", adDouble, adParamInput, 4, pHigh );
      pCmd->Parameters->Append(Par5);
 
      Par6 = pCmd->CreateParameter("@pdLow", adDouble, adParamInput, 4, pLow );
      pCmd->Parameters->Append(Par6);
 
      Par7 = pCmd->CreateParameter("@pdClose", adDouble, adParamInput, 4, pClose );
      pCmd->Parameters->Append(Par7);
      
      Par8 = pCmd->CreateParameter("@pdVolume", adDouble, adParamInput, 4, pVolume );
      pCmd->Parameters->Append(Par8);
 
      Par9 = pCmd->CreateParameter("@piBar", adDouble , adParamInput, sizeof(double) ,  (double)pBar );
      pCmd->Parameters->Append(Par9);
 
 
      pCmd->ActiveConnection = pConnection;
      int hr = pCmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
         ParReturn = pCmd->Parameters->GetItem(_bstr_t("@P1"));     // obtain from the procedure
         codRet = ParReturn->GetValue();
      }
   }
   catch(_com_error  ) {
       //
       // if necessary, process the execution error
          //
       codRet = -1;
 
   }
   if (pConnection)
      if (pConnection->State == adStateOpen)
         pConnection->Close();
 
   ::CoUninitialize();
    return((int)codRet);
}
 
 
//
// return the value returned by the procedure
//
int  SQLexecProcedure( char *nprc )
{
   
    HRESULT hr = S_OK;
   _CommandPtr pcmd = NULL;
   _ConnectionPtr pConnection = NULL;
   _bstr_t strMessage, strAuthorID;
 
       ::CoInitialize(NULL);
 
   long codRet = -1;
 
   try {
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pcmd.CreateInstance(__uuidof(Command)));
      pcmd->CommandText = nprc;  // procedure name
      pcmd->CommandType = adCmdStoredProc;
     
      _ParameterPtr  pParm1 = pcmd->CreateParameter( _bstr_t("@P1"), adInteger,   adParamOutput,0,    codRet );
      pcmd->Parameters->Append( pParm1 );
      pcmd->ActiveConnection = pConnection;
      int hr = pcmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
         pParm1 = pcmd->Parameters->GetItem(_bstr_t("@P1"));     // obtain from the procedure
         codRet = pParm1->GetValue();
      }
   }
   catch(_com_error  ) {
       //
       // if necessary, process the execution error
          //
       codRet = -1;
 
   }
   if (pConnection)
      if (pConnection->State == adStateOpen)
         pConnection->Close();
 
   ::CoUninitialize();
    return((int)codRet);
}
 
//
//
//
int  SQLexecProcedureSignal( char *sSymbol, char* sProcedure )
{
   
    HRESULT hr = S_OK;
   _CommandPtr pcmd = NULL;
   _ConnectionPtr pConnection = NULL;
   _bstr_t strMessage;
   _bstr_t strAuthorID;
 
       ::CoInitialize(NULL);
 
   long codRet = 0;
 
   try {
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pcmd.CreateInstance(__uuidof(Command)));
      pcmd->CommandText = sProcedure;  // procedure name
      pcmd->CommandType = adCmdStoredProc;
 
      _ParameterPtr pParm1 = pcmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(sSymbol) ,sSymbol );
      pcmd->Parameters->Append(pParm1);
      _ParameterPtr pParm2 = pcmd->CreateParameter( _bstr_t("@P1"), adInteger,   adParamOutput,0,    codRet );
      pcmd->Parameters->Append( pParm2 );
      pcmd->ActiveConnection = pConnection;
      int hr = pcmd->Execute( 0, 0, adCmdStoredProc );
            if( FAILED(hr) )
            {
                bool bSuccess = false;
            }
            pParm2 = pcmd->Parameters->GetItem(_bstr_t("@P1"));     // obtain from the procedure
            codRet = pParm2->GetValue();
 
//             printf("\n [%d] \n",codRet );       // OBTAINING from the procedure
   }
   catch(_com_error  ) {
       //
       // if necessary, process the execution error
          //
   }
   if (pConnection)
      if (pConnection->State == adStateOpen)
         pConnection->Close();
 
   ::CoUninitialize();
    return((int)codRet);
}
// Comments are reduced to make it appear simpler, the comments in the attached files are complete
 
//+------------------------------------------------------------------+
//|                                                                  |
//|                 Copyright c 1999-2006, MetaQuotes Software Corp. |
//|                                         http://www.metaquotes.ru |
//|                                                YZMSSQLSample.mq4 |
//|                                                   Yuriy Zaitsev  |
//+------------------------------------------------------------------+
// Example of integrating with MS SQL                                |
//+------------------------------------------------------------------+
 
#property copyright "YURAZ Copyright(C) 2008"
#property link      "yzy @ mail.ru"
 
//+------------------------------------------------------------------+
// DLL function library 
//+------------------------------------------------------------------+
#import "YZMSSQLExpertSample.dll"
// Performing any actions on MS SQL Server, procedure is called
SQLProcedureGetInt 
// Collecting ticks
int SQLProcedureTickPut( string,  int , double , double ,string );  
 
int Prc = 0;
int init()
  {
 
//
// SQLProcedureGetInt The function, once having called a certain procedure, 
// will return into MT4 int value, for example, parameters
// stored on MS SQL server, formed by another software
//
   Prc =     SQLProcedureGetInt ("YZ_MT4_T1"); 
   return(0);
  }
 
int start()
  {
   int a;
 
   int RetCode = SQLProcedureTickPut( Symbol(), TimeCurrent() , Ask, Bid ,"YZ_MT4_TICK"); // call to the tick collecting procedure
   Print(" SQLProcedureTickPut (YZ_MT4_NEWDAY)"+ RetCode );
 
// Example:
//    on MS SQL server, you can filter signals formed using third-party software
//    neural networks 
//    other software products 
//
/*
   int Signal = SQLProcedureGetSignal (Symbol() , "YZ_MT4_SIGNAL" ); // procedure MS SQL , will return signal
   Print(" SQLProcedureGetSignal (Symbol() , YZ_MT4_SIGNAL )"+ Signal );
   if ( Signal == OP_BUY )
   {
       // the procedure has returned the signal and is recommending to buy
   }
   if ( Signal == OP_SELL )
   {
       // the procedure has returned the signal and is recommending to sell
   }
*/
 
   return(0);
  }

فراخوانی از MQL4 (مثال)

//
// YURAZ  2008 yzh @ mail.ru
//
// script loading history onto MS SQL
// reload all history for all currency pairs and for all TIMEFRAMES
// in MS SQL
//
 
#import "YZMSSQLExpertSample.dll"
int SQLProcedureHistoryPut( string,  int  , int, double , double ,double , double ,double ,int,  string );  
 
static int mPeriod[8]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
 
void start()
{
    PutHistor("EURUSD"); 
    PutHistor("USDCHF"); 
    Comment(" LOADING COMPLETE " );
}
 
void PutHistor(string sSymbol)
{
  for ( int iPeriod = 0; iPeriod <= 8 ; iPeriod++ )
  {
     int pPERIOD_XX = mPeriod[iPeriod];
      int Bar = iBars(sSymbol,pPERIOD_XX ); // obtain the depth of history for the given timeframe
 // no progress bar organized 
     for ( int iBar = Bar; iBar >= 0 ; iBar--)
     {
     Comment( "WAIT  TIMEFRAME "+pPERIOD_XX+" SYMBOL "+sSymbol+" BARS "+iBar );
       double   o = iOpen  (sSymbol,pPERIOD_XX,iBar);
       double   h = iHigh  (sSymbol,pPERIOD_XX,iBar);
       double   l = iLow   (sSymbol,pPERIOD_XX,iBar);
       double   c = iClose (sSymbol,pPERIOD_XX,iBar);
       double   v = iVolume(sSymbol,pPERIOD_XX,iBar);
       datetime d = iTime  (sSymbol,pPERIOD_XX,iBar);
       int RetCode = SQLProcedureHistoryPut( sSymbol,pPERIOD_XX,d,o,h,l,c,v,iBar, "YZ_MT4_HISTORY");
       // Print ( " YZ_MT4_HITSRY "+RetCode);
      }
  }
}

اسکریپت [برای] لود کردن (loading) هیستوری روی مایکروسافت SQL سرور:

توجه: متاسفانه، کل هیستوری با استفاده از این اسکریپت، نسبتاً آهسته لود شد، اما bar number را کاملاً واضح و با کیفیت بالا، تثبیت نمود.

بهترین راه‌حل این است که خوانش‌ها را درون یک فایل متنی تخلیه کرده و از طریق IMPRT EXPORT DTS، در مایکروسافت SQL لود (load) کنیم. لود شدن هیستوری M1، از سال ۱۹۹۹ تا ۲۰۰۸، برای هر نمادی، چند دقیقه طول خواهد کشید.

هنگام تخلیه خوانش‌ها درون یک فایل متنی، شاخص کندل تخلیه نمی‌شود. اگر تصمیم گرفته‌اید که شاخص کندل فقط شماره خط (line number) باشد، آنگاه مشکل کندل‌های گُم‌شده را خواهید داشت، و در صورت اصلاح یا لود کردن مجدد، اعداد کندل‌های تخلیه‌شده، ممکن است در مایکروسافت SQL و متاتریدر ۴، متفاوت باشند. هنوز این مشکل را حل نکرده‌ام، اما فکر می‌کنم که بتوان این مشکل را از طریق لود کردن مجدد هیستوری بعد از یک به‌روز‌رسانی باکیفیت هیستوری در خود متاتریدر ۴، حل کرد.

توضیحات فایل‌های پیوست‌شده

CreateSQLallDate.txt (9.0 Kb)

– اسکریپت با فرمت SQL، به‌عنوان مثالی برای چگونگی ایجاد پایگاه‌ها، جداول، و رویه‌ها در مایکروسافت SQL سرور

SQLGETHISTORY.mq4 (1.4 Kb)

– اسکریپت برای لود کردن هیستوری در مایکروسافت SQL سرور

YZMSSQLExpertSample.rar (89.9 Kb)

– پروژه‌ی DLL

YZMSSQLSample.mq4 (13.1 Kb)

– می‌توانید این را به‌عنوان اکسپرت به نمودار نمادی متصل کنید که تیک‌های آن بایستی جمع‌آوری شوند؛ محدودیتی در انتخاب تایم‌فریم نیست.

نتیجهگیری

یکی شدن با دیگر محصولات نرم‌افزاری عملکرد متاتریدر ۴ را گسترش می‌دهد و اجازه می‌دهد وظایف و توابع یک سیستم معاملاتی خودکار، به‌شکل موثرتری توزیع شوند.

این مقاله دارای فایل پیوست است.

M23admin

→ خواندن مطلب قبلی

استراتژی ترید برمبنای تحلیل نقاط پیووت

خواندن مطلب بعدی ←

قانون طلایی معاملات

۴۲ مورد نظر

نوشتن نظر شما

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *