ویژگی‌های اکسپرت‌ها

ویژگی‌های اکسپرت‌ها

ویژگی‌های اکسپرت‌ها

ساخت اکسپرت‌ در سیستم‌ ترید متاتریدر یک سری ویژگی‌ها و امکانات را به ارمغان می‌آورد.

  • قبل از باز کردن یک پوزیشن، باید بررسی کنید آیا پول کافی در حساب‌تان هست یا نه. و اگر پول کافی نداشته باشید، بازشدن پوزیشن موفقیت‌آمیز نخواهد بود. یادتان باشد فقط حین تست گرفتن، مقدار FreeMargin نباید کمتر از ۱۰۰۰ باشد، زیرا حین تست گرفتن، قیمت ۱ لات برابر با ۱۰۰۰ است.
if(AccountFreeMargin() < 1000) return(0);    // not enough money
  • می‌توانید با استفاده از آرایه‌های از پیش تعریف‌شده‌ی Time، Open، Low، High، Close، Volume، به داده‌های هیستوری دسترسی داشته باشید. بنا به دلایلی که مرتبط با هیستوری است، شاخصدر این آرایه‌ها، از آخر به اول افزایش می‌یابد. این بدان معناست که آخرین داده‌ها شاخص ۰ دارند. شاخص ۱ یعنی داده‌هایی که یک دوره به‌ عقب رفته‌اند، ۲ یعنی دو دوره به عقب، و ۳ یعنی سه دوره به عقب و همینطور الی آخر
// if Close on the previous bar is less than 
// Close on the bar before previous
if(Close[1] < Close[2]) return(0);
  • همچنین با استفاده از دیگر بازه‌های زمانی و حتی با استفاده از دیگر جفت‌اَرزها نیز می‌توانید به داده‌های هیستوری دسترسی داشته‌ باشید. برای دریافت چنین داده‌هایی لازم است یک آرایه‌ی یک‌بُعدی ابتدا تعریف کرده و با استفاده از تابع ArrayCopySeries، یک کپی از عملیات را اجرا کنید. به‌یاد داشته باشید که هنگام فراخوانی این تابع، امکان عبور تعداد کمتری از پارامترها وجود دارد، و پارامترهای پیش‌فرض را نیز، تعیین نکنید.
double eur_close_m1[];
int number_copied = ArrayCopySeries(eur_close_m1, MODE_CLOSE, "EURUSD", PERIOD_M1);
  • در فرآیند نوشتن یک اکسپرت، همانند بسیاری از نرم‌‌افزارها، بعضی‌وقت‌ها لازم است اطلاعاتی اضافی مرتبط با اِشکال‌زدایی داشته باشیم. زبان MQL4 برای دریافت چنین اطلاعاتی، روش‌های زیادی را در اختیار ما قرار می‌دهد.
  • تابع Alert، یک دیالوگ باکس، همراه با برخی از داده‌های تعریف‌شده توسط کاربر، را نمایش می‌دهد.
Alert("FreeMargin grows to ", AccountFreeMargin(), "!");
  • تابع Comment، داده‌هایی که کاربر تعریف کرده است را در گوشه‌ی سمت چپِ بالای نمودار نمایش می‌دهد. دنباله‌ی کاراکتری “\n” برای شروع یک خط جدید استفاده می‌شود.
Comment("FreeMargin is ", AccountFreeMargin(), ".");
  • تابع Print، داده‌هایی که کاربر تعریف کرده است را در گزارش سیستم ذخیره می‌کند.
Print("FreeMargin is ", AccountFreeMargin(), ".");
  • برای اینکه اطلاعاتی درباره‌ی خطاها در برنامه داشته باشیم، تابع GetLastError، خیلی به‌کار می‌آید. برای مثال، یک عملیات همراه با یک معامله همیشه شماره‌ی تیکت را برمی‌گرداند. اگر شماره تیکت ۰ شود (یعنی در فرآیند اجرای عملیات خطایی رخ داده)، و نیاز است تابع GetLastError را فرابخوانیم تا اطلاعات بیشتری درباره‌ی خطا کسب کنیم:
int iTickNum = 0;
int iLastError = 0;
...
iTickNum = OrderSet (OP_BUY, g_Lots, Ask, 3, 0, Ask + g_TakeProfit * g_Points, Red);
if (iTickNum <= 0) 
   {
     iLastError = GetLastError();
     if (iLastError != ERROR_SUCCESS) Alert("Some Message");
   }

فراموش نکنید که فراخوانی تابع GetLastError، کد آخرین خطا را نمایش داده و مقادیر آن را ری‌سِت می‌کند. به همین دلیل است که فراخوانی مجدد این تابع در یک سطر (row)، همیشه مقدار ۰ را برمی‌گرداند.

  • چگونه شروع یک کندل جدید را تعریف کنیم؟ (ممکن است نیاز باشد در لحظه [و در سریع‌ترین زمان] بفهمیم کندل قبلی چه موقع تمام شده‌است.) برای انجام این کار چندین راه وجود دارد.

اولین راه بر اساس بررسی تعداد کندل‌هاست:

int prevbars = 0;
...
if(prevbars == Bars) return(0);
prevbars = Bars;
...

این روش ممکن است هنگام لود شدن (loading) هیستوری، درست عمل نکند. به‌عبارت دیگر، تعداد کندل‌ها درحالیکه کندل “قبلی” هنوز کامل نشده‌است، تغییر می‌کند. ممکن است کارِ بررسی را حتی پیچیده‌تر از این کنید؛ آن‌هم با گذاشتن یک ایست‌ بازرسی برای بررسی تفاوت بین مقدارهای مساوی با یک.

روش بعدی بر اساس این واقعیت است که مقدار Volume، برمبنای تعداد تیک‌های رسیده برای هر کندل، تولید می‌شود، و تیک اول یعنی اینکه، مقدار Volume کندل جدید، برابر با ۱ است:

if( Volume > 1) return(0);
...

این روش، وقتی تعداد زیادی از تیک‌های قیمت در حال آمدن هستند، ممکن است شکست بخورد. موضوع این است که تیک‌های قیمت که در حال دریافت شدن هستند، در مدخلی (Thread) جداگانه پردازش می‌شوند. و اگر این مدخل موقع رسیدن تیک بعدی شلوغ باشد، تیک جدید پردازش نمی‌شود تا از اُورلود شدن پردازنده جلوگیری شود! در این شرایط، با ذخیره کردنِ مقدارِ Volume قبلی، کارِ بررسی ممکن است بسیار پیچیده‌تر شود.

روش سوم بر اساس زمانی است که یک کندل باز می‌شود:

datetime prevtime=0;
...
if(prevtime == Time[0]) return(0);
prevtime = Time[0];
...

قابل اطمینان‌ترین روش همین است و در هر شرایطی [با این روش] کار به نتیجه می‌رسد.

  • مثالی از کار کردن با یک فایل از نوع CSV:
int h1;
h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE, ";");
if(h1 < 0)
  {
   Print("Unable to open file my_data.csv");
   return(false);
  }
FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);  
FileClose(h1);

توضیحاتی در مورد کد. فایل، با فرمت CSV ابتدا باز می‌شود. اگر هنگام باز کردن فایل خطایی رخ دهد، برنامه بسته می‌شود. و اگر فایل با موفقیت باز شود، محتوای آن خوانده شده، و داده‌ها در فایل ذخیره می‌شوند و فایل بسته خواهد شد. اگر می‌خواهید محتوای فایل باز بماند، باید از حالتِ بازشدنِ MODE_READ استفاده کنید:

int h1;
h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE | MODE_READ, ";");
if(h1 < 0)
  {
   Print("Unable to open file my_data.csv");
   return(false);
  }
FileSeek(h1, 0, SEEK_END);
FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);  
FileClose(h1);

در این مثال، داده‌ها به انتهای فایل اضافه می‌شوند. برای این کار، از تابع FileSeek، بلافاصله بعد از بازشدن فایل استفاده کردیم.

 

مقالات پیشنهادی :

M23admin

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

چگونه شناسایی و بازیابی خطاها در کد اکسپرت را راحت‌تر کنیم

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

ویژگی‌ها و محدودیت‌های تست گرفتن در متاتریدر ۴

۳۳ مورد نظر

نوشتن نظر شما

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