کامران کیانلو
کامران کیانلو
خواندن ۲ دقیقه·۲ سال پیش

تشخیص کندل های جدید در Expert Adviser Mql5

تشخیص کندل های جدید موقع ساخت یک اندیکاتور در MQL5 اونقدرها هم کار سختی نیست. توی تابع OnCalculate که به ما به عنوان تابع اصلی میده 2 تا ورودی خیلی جالب داریم. rates_total و prev_calculated

متغیر rates_total تعداد کندلهایی که برای ما در چارت لود شدن رو برمیگردونه

متغیر prev_calculated تعداد کندلهایی که در تابع OnCalculate فراخانی شدند و محاسبات روشون انجام شده.

ما برای تشخیص کندل های جدید در اندیکاjور کافیه تکه کد زیر رو در OnCalculate بنویسیم و راحت کندل های جدید رو تشخیص بدیم

int limit = rates_total - prev_calculated;
if(limit == rates_total){
// First Calculate
}else if(limit){
// new Bar
}

اما این روند در Expert ها متفاوته چون اونجا ما تابع OnTick رو داریم که روند کارش مشابه OnCalculate هست اما هیچ ورودی ای مثل rates_total و prev_calculated نداریم.

این تکه کد رو دیروز تو مقالات mql5 دیدم و یک راه حل جمع و جور کاربردی داشت و اون هم استفاده ترکیبی از متغیر زمان و تریف اون ها به صورت 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  = (datetime) SeriesInfoInteger(                                           _Symbol, _Period, SERIES_LASTBAR_DATE );                 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 ...    };

اگر براتون مبهمه که چطور کار می کنه دو تا موضوع زیر رو حتما بررسی کنید

  1. نحوه تعریف متغیر ها به صورت Static در mql5 و کاربردش
  2. کار با datetime در mql5
الان در حال یادگیری MQL5 - کنجکاوی هام درباره برنامه نویسی رو اینجا می نویسم.
شاید از این پست‌ها خوشتان بیاید