
تلفیق متاتریدر ۴ با مایکروسافت 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
حداقل مجموعهای که باید نصب شود:
- MS SQL SERVER 2000 Developer
- 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، تعیین کنید، برای مثال، ۵۰۰۰. نرمافزار بسیار سریعتر کار خود را آغاز میکند زیرا نیازی به اختصاص دادن حافظه برای هیستوری با حجم زیاد ندارد.
سورس تکستها (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)
– میتوانید این را بهعنوان اکسپرت به نمودار نمادی متصل کنید که تیکهای آن بایستی جمعآوری شوند؛ محدودیتی در انتخاب تایمفریم نیست.
نتیجهگیری
یکی شدن با دیگر محصولات نرمافزاری عملکرد متاتریدر ۴ را گسترش میدهد و اجازه میدهد وظایف و توابع یک سیستم معاملاتی خودکار، بهشکل موثرتری توزیع شوند.
۴۲ مورد نظر
cheap medications
by prednisone w not prescription buy prednisone online ۸۰ mg prednisone daily
ivermectin australian shepherd stromectol tablets for humans teva ivermectin cream
cost of prednisone tablets cheap prednisone purchase prednisone from india
prednisone brand name india prednisone for sale prednisone online
cialis for bph insurance coverage cialis usa prescription cialis 5mg australia
cialis generic timeline 2018 cheapest cialis usa how long does cialis take to work
prescription drugs online website ed drugs online from canada
cialis shop in australia cheapest cialis usa brand cialis in canada
prescription drugs without doctor approval canadian medications prescription drugs without prior prescription
ivermectin for pinworms in humans can ivermectin be given orally ivermectin wiki
non prescription ed pills best online canadian pharmacy ed prescription drugs
medication for ed buy ed pills online ed dysfunction treatment
can humans take ivermectin horse paste mexico ivermectin trial stromectol stay active
erectile dysfunction pills ed pills comparison non prescription ed drugs
canadian drug prices pet meds without vet prescription canada ed meds online without prescription or membership
how to get prescription drugs without doctor online canadian drugstore the canadian drugstore
prescription drugs without doctor approval discount prescription drugs online highest rated canadian pharmacies
buy stromectol online stromectol for sale stromectol without a doctor prescription
india pharmacies online india pharmacies shipping to usa meds online without doctor prescription
stromectol pills for humans prescribing stromectol stromectol pills for humans
order modafinil pills modafinil 200mg pills
buy provigil online modafinil us
canadian pharmacy online ship to usa internet pharmacy no prior prescription order prescriptions online without doctor
price for viagra sildenafil 100 mg sildenafil citrate 100mg for sale
order modafinil generic
buy provigil online buy provigil 100mg sale
order modafinil 100mg online cheap order generic modafinil 100mg provigil 200mg pills
cialis 20 mg price buy tadalafil online tadalafil
sildenafil citrate tablets 100 mg viagra tablets for men viagra tablets for men
provigil without prescription order modafinil 200mg generic buy provigil 200mg without prescription
oral modafinil 200mg order modafinil 100mg provigil 100mg brand
price for viagra viagra pills sildenafil citrate tablets 100 mg
buy provigil 100mg pill
erythromycin erythromycin topical gel
order modafinil without prescription
tadalafil tablets 20 mg india tadalafil 20 mg buy online online purchase of tadalafil in india
sildenafil sildenafil 100 mg sildenafil
stromectol without a doctor prescription stromectol 3 mg tablets price stromectol without a doctor prescription
brand provigil 100mg buy provigil 200mg pills
cost modafinil order provigil 100mg
stromectol for humans for sale ivermectin dose for chickens ivermectin 6mg