تشخیص باز شدن کندل جدید در اکسپرت (EA) متاتریدر
اگر شما یک اکسپرت (Expert Advisor) در متاتریدر ایجاد کرده باشید، حتماً میدانید که با دریافت هر تیک قیمت جدید (Tick Quote) تابع رویداد OnTick() بهصورت خودکار فراخوانی میشود. اما نکته مهم اینجاست که متاتریدر بهصورت پیشفرض رویدادی برای شروع یا باز شدن یک کندل جدید ندارد.
در این مقاله یاد میگیرید چطور میتوان با یک روش ساده و حرفهای، شروع کندل جدید را شناسایی و به آن واکنش نشان داد.
چرا تشخیص کندل جدید مهم است؟
در بسیاری از استراتژیهای معاملاتی، تصمیمگیریها تنها در ابتدای شکلگیری یک کندل انجام میشود. بهعنوان مثال:
- باز کردن پوزیشنهای جدید بر اساس سیگنال کندل قبلی
- بهروزرسانی سطوح Stop Loss و Take Profit
- ثبت دادهها یا تحلیل بازار در شروع هر کندل
اگر تشخیص کندل جدید بهدرستی انجام نشود، ممکن است اکسپرت شما چندین بار در طول یک کندل اجرا شود و نتایج ناخواسته ایجاد کند.
روش تشخیص کندل جدید با متغیر Static
/ Default tick event handler
void OnTick()
{
// Check for new bar (compatible with both MQL4 and MQL5).
static datetime dtBarCurrent = WRONG_VALUE;
datetime dtBarPrevious = dtBarCurrent;
dtBarCurrent = iTime( _Symbol, _Period, 0 );
bool bNewBarEvent = ( dtBarCurrent != dtBarPrevious );
// React to a new bar event and handle it.
if( bNewBarEvent )
{
// Detect if this is the first tick received and handle it.
/* For example, when it is first attached to a chart and
the bar is somewhere in the middle of its progress and
it's not actually the start of a new bar. */
if( dtBarPrevious == WRONG_VALUE )
{
// Do something on first tick or middle of bar ...
}
else
{
// Do something when a normal bar starts ...
};
// Do something irrespective of the above condition ...
}
else
{
// Do something else ...
};
// Do other things ...
};
یکی از روشهای کاربردی برای تشخیص کندل جدید، استفاده از زمان باز شدن کندل (Opening Time) است.
ایده اصلی:
- زمان باز شدن کندل جاری را بررسی کنید
- اگر این زمان نسبت به بررسی قبلی تغییر کرده بود، یعنی کندل جدید آغاز شده است
- واکنش لازم (اجرای کدها) را انجام دهید
در کد نمونه، از یک متغیر static استفاده میشود که ویژگی آن این است که حتی بعد از خروج از تابع OnTick() مقدار خود را حفظ میکند. این یعنی شما همیشه میتوانید زمان باز شدن کندل قبلی را به خاطر بسپارید و با زمان باز شدن کندل جدید مقایسه کنید.
نکته مهم هنگام بارگذاری اولیه اکسپرت
زمانی که یک اکسپرت برای اولین بار روی چارت قرار میگیرد، این کد طوری عمل میکند که انگار کندل تازه باز شده است. اگر مایل باشید این رفتار تغییر کند، باید یک شرط اضافه کنید تا در بارگذاری اولیه، اجرای عملیات اصلی انجام نشود.
محل دسترسی به کدهای نمونه
تمام کدهای منتشر شده توسط نویسنده این روش، علاوه بر بخش CodeBase، در تب Public Projects نرمافزار MetaEditor نیز با نام FMIC در دسترس هستند.
تشخیص Start of New Bar در اکسپرت MetaTrader 4
تشخیص دقیق شروع کندل جدید یکی از بخشهای حیاتی در برنامهنویسی اکسپرتها است. استفاده از متغیرهای static برای ذخیره زمان باز شدن کندل، روشی ساده و در عین حال بسیار قدرتمند برای این کار به شمار میرود. با پیادهسازی این روش، میتوانید اطمینان داشته باشید که کد شما تنها در زمان درست اجرا میشود و از تکرارهای بیهوده جلوگیری میگردد.






