نکته های مدیریت حافظه ، داده شمار – درس اول – کتاب آموزش زبان mql (دوره پیشرفته)

نکته های مدیریت حافظه ، داده شمار

در ابتدای درس به بررسی حافظه و مشکلات عدم مدیریت آن می ­پردازیم.

در متاتریدر اکپسرت ساخته و نام گذاری کنید. سپس در تابع OnTick دستورها را وارد کنید.

بررسی-حافظه-و-مشکلات-عدم-مدیریت-آن

دستور بالا به معنای پرینت کردن (Bid) قیمت بازار می­باشد. Compile را کلیک کنید و وارد متاتریدر شوید.

نام کلاس تعریف شده را درون چارت درگ کنید و ok را انتخاب کنید.

نام-کلاس-تعریف-شده-1

 

نام-کلاس-تعریف-شده-2

در سربرگ Experts مشاهده می­کنید با تغییر قیمت بازار، قیمت ها نیز در حال تغییر می­باشند.

چنانچه در کدنویسی حلقه while را بنویسید تا وقتی که i کوچک تر از 10000000 باشد i را پرینت کرده و در پایان i را ++ کند. Compile را کلیک کنید.

کدنویسی حلقه while-1

 

کدنویسی-حلقه-while-2

در متاتریدر جهت راحتی در شناخت قیمت ، به سراغ کدها رفته و bid را مساوی کنید. Compile را کلیک کنید. به عنوان مثال:

راحتی در شناخت قیمت

مقدار bid را مشاهده خواهید کرد.

مقدار bid

اگر دقت کنید مقدار bid ثابت می­باشد و اعداد تغییر نمی­کند. در حالی که در قسمت بالا مقدار در حال تغییر می­باشد. دلیل آن را بررسی خواهیم کرد.

مقدار bid

در کد بالا زمانی که وارد حلقه while می­شود bid مقداری دارد ، زمان ورود به حلقه bid را چاپ می­کند. دوباره وارد حلقه می­شود و مجددا bid را چاپ می­کند. برای همین است که تغییر نمی­کند. بنابراین bid را تابع  OnTick مقداردهی می­کند. به بیان دیگر، زمانی bid مقدار آن تغییر می­کند که تابع OnTick فراخوانی شود. البته بعد از تمام شدن همه دستورات و بعد از اینکه OnTick به پایان برسد و OnTick جدیدی به وجود بیاید و بار دیگر تابع فراخوانی شود. در این حالت است که مقدار bid تغییر خواهد کرد. در غیر این صورت مقدار bid ثابت می­ماند.

در حال حاضر برنامه کنونی در حلقه گیرکرده و در حال چرخش می­باشد به همین دلیل مقدار bid ثابت می­باشد. زیرا شرط حلقه درست بوده و از حلقه خارج نشده است لذا تابع فراخوانی نمی­شود.

فرض کنید با کدهای زیادی سرکار دارید و بخواهید چندین مرتبه bid را بررسی کنید چون تابع از اول فراخوانی نشده شما دارید bid گذشته را فراخوانی می­کنید، این مسئله احتمال سبب به وجود آمدن خطا درون سیستم شما باشد در حالی که سبب و علت آن را ندانید که چرا پوزیشن به موقع باز یا بسته نشده است.

و برای رفع این مشکل می­توانید قبل از این که از توابع bid  استفاده کنید کدی را تعریف کنید که مجبوراً مقدارها را تولید کند. به عنوان مثال:

کد تولید مقدارها

تابع RefreshRates تابعی است که ورودی ندارد. زمانی که برنامه به این تابع برسد مقدار bid (یاهر مقدار دیگری) را یکبار دیگری آپدیت می­کند. در پایان دستور Compile را کلیک کنید تا شاهد اجرای دستور در برنامه شوید.

تابع RefreshRates

با اجرای کد، مقدار bid متناسب با قیمت بازار در حال حرکت و تغییر می­باشد. با اینکه حلقه هنوز تمام نشده است.

تابع-RefreshRates

روش دیگر؛ استفاده از حافظه است.

به بیان ساده تر، int مقداری از حافظه را اشغال می­کند. زمانکه از کدها و توابع گوناگونی استفاده می­کنید به طبع حافظه بیشتری را اشغال می­کند. منظور از حافظه رم (Ram) می­باشد. (متاسفانه زمانی که برنامه نویس برنامه را بنویسید یا بخواهد داخل سرور قرار دهد به دنبال ارزان ترین سرور با کم ترین میزان رم را کرایه می­کند).

نکته :

بهترین کار این است که شما از کمترین میزان حافظه استفاده کنید.

در آپدیت که متراتریدر انجام داد به غیر از int ، while یک سری دیتا تایپ های دیگری نیز وجود دارند.

دیتا تایپ های دیگر

تابع sizeof :

تابعی است که میزان حجم استفاده شده از حافظه ورودی خود را بر می­گرداند. به بیان دیگر چنانچه متغیر x که ازنوع int می­باشد را درون پرانتز تابع sizeof قرار دهید به شما مقدار چارت را بر خواهد گرداند.

نکته :

این تابع برای اطلاع از مقدار حافظه اشغال شده بسیار مفید است. مقدار Byte  حافظه اشغال شده از آرایه ها و  متغیرها را مشاهده می­کنید. (به مدیریت حافظه را در بخش های بعدی خواهیم پرداخت)

دقت نمایید دیتا تایپ های بالا را می­توانید برای توابع نیز در نظر داشته باشید.

اینک می­توانید از دیتا تایپ های بهتری استفاده کنید تا فضای حافظه کمتری را اشغال کند  و اگر چندین خط کد داشته باشید آن کدها سریع تر خوانده شوند تا یک تابع سریع تر فراخوانی شود.

کار دیگری که می­توانید انجام دهید به برنامه استراحتی بدهید. منظور از استراحت به برنامه چیست؟

زمانی که شما در متاتریدر 10 چارت را باز می­کنید و 10 برنامه را در حال اجرا قرار می­دهید 10 برنامه که آن چارت را تحلیل کنند ، در برخی مواقع  در زمان بررسی ، می­دانید تا یک ساعت یا نیم ساعت یا کمتر از ان اتفاق خاصی نخواهد افتاد، یعنی در زمان مشخصی از عدم کارایی برنامه اطلاع دارید، بنابراین می­توانید از بیهوده کار کردن برنامه و چک کردن متغیرها و از فشار آوردن به سیستم، به طور بی ثمر می­توانید جلوگیری کنید.

لذا چنانچه می­دانید تا زمان مشخصی، برنامه سیگنالی ندارد و می­خواهید برای مدت زمان کوتاهی به سیستم استراحت بدهید می­توانید در دستورها از تابع Sleep استفاده نمایید. به طور مثال:

نبود سیگنال و استراحت به سیستم

در پرانتز باید میلی‌ثانیه (به انگلیسی: millisecond) واحدی از زمان و برابر با یک‌هزارم ثانیه است، قرار بگیرد. 5000 برابر با 5 ثانیه است. زمانی که برنامه به این کد می­رسد تا 5 ثانیه هیچ کاری را انجام نمی­دهد. و این کمکی است برای سایر برنامه ها که کارشان را سریع تر انجام بدهند. لازم است زمان استفاده از این کد دقت کافی را داشته باشید. کم یا زیاد به آن Sleep ندهید.

Compile را کلیک کنید و خواهی دید که بعد از وارد شدن در ontick ، 5 ثانیه بعد از آن خارج می­شود و مجدداً فراخوانی می­شود. یعنی هر 5 ثانیه قیمت ترید خواهد شد.

مشاهده می­کنید عددی چاپ شده و دیگر متوقف شده است. بعد از هر 5 ثانیه یک bid چاپ خواهد شد.

نکته :

Sleep بر روی اندیکاتور کار نمی­کند. تنها بر روی اکسپرت پاسخ می­دهد.

مورد دیگری که بعد از آپدیت mql به آن اضافه شد داده های شمارشی هستند. برای ساخت آنها ابتدا باید (کلمه کلیدی)  enum و سپس اسم داده را بنویسید. با انواع enum ها آشنا خواهید شد.

enum months

{

January,

February,

March,

April,

May,

June,

July,

August,

September,

October,

November,

December,

};

 بعد از هر داده کاما بگذارید. می­توانید به شکل بالا یا به صورت خطی موارد بنویسید تفاوتی در اجرا ندارد.

می­توانید از چنین داده ای یک متغیر بسازید به عنوان مثال:

months    x= January;

در کدنویسی ضمن آشنایی بیشتر ، با نوع استفاده و فایده آن آشنا خواهید شد.

متغیر enum

متغیر enum بسازید. سپس اسم دلخواه را وارد کنید. در رشته تعریف شده مقادیر را یک به یک تعریف کنید. لازم است بدانید که نباید فاصله بگذارید بلکه با آندرلاین (_) فاصله گذاری کنید. برای ساخت متغیر ابتدا اسم تعریف شده (test1) را بنویسید سپس یک فاصله ، اسم متغیر دلخواه، در آخر با یکی از مقدارهای (test1) مساوی کنید. با این کار شما یک متغیر از نوع ترید ax ساختید.

و برای پرینت دستور زیر را وارد کنید و Compile را کلیک کنید.

مقدار متغیر ترید صفر

مقدار متغیر ترید صفر می­باشد بدین معنا که مقدار اولین ورودی صفر می­باشد مقدار دومین ورودی یک و مقدار سومین ورودی دو می­باشد.

مقدار-متغیر-ترید-صفر

مقدار صفر چاپ شده است.

چنانچه دستور را تغییر دهید و مقدار ترید را ma قرار دهید.

مقدار-متغیر-ترید-صفر 3

در چارت مقدار یک خواهد بود.

مقدار-متغیر-ترید-صفر 4

مقدار-متغیر-ترید-صفر 5

فایده دستور بالا :

یکی از کارای خوبی که می­تواند انجام دهد این است که شما می­توانید متغیر را extern کنید. (از کاربر بگیرید)

Compile را کلیک کنید.

کلاس را داخل چارت درگ کنید .

Compile

 

Compile 2

در سربرگ Inputs ترید جدیدی را مشاهدی می­کنید که در قسمت value تریدرهای دیگر را نیز می­توانید انتخاب نمایید.

بنابراین از این طریق نیز می­توانید انتخاب کاربر نیز داشته باشید.

تریدهای-جدید

با انتخاب cci عدد 2 چاپ شد.

همانگونه که قبلا اشاره شد که مقدار اولین ورودی (trade_ax) صفر، مقدار دومین ورودی (trade_ma) یک و مقدار سومین ورودی(trade_cci) دو می­باشد؛ می­توانید برای ورودی ها نیز مقدار تعریف کنید.

Compile

Compile را کلیک کنید.

بنابراین زمانی که هر کدام از متغیرها انتخاب شوند صفر و یک و دو نخواهند بود، بلکه مقدارها به 10، 20 و 30 تغییر کرده است.

با انتخاب ترید دوم باید عدد 20 نمایش شود.

انتخاب-ترید-دوم

 

انتخاب-ترید-دوم-1

همچنین می­توانید تریدرها را زیر هم قرار دهید تا دستور شما از نظر ظاهری مرتب باشد.

همچنین می­توانید مانند متغیر کامنت بنویسید.

در این حالت نام تریدرها نمایش نمی­شود و نام دوم نمایش می­شود.

نام کلاس را درون چارت درگ  کنید.

نمایش-نام-دوم

مشاهده می­کنید نام تریدها تغییر کرده و نام های جدید نمایش شده اند.

طبق دستورها در متاتریدر ، عدد 10 به معنای انتخاب ورودی اول می­باشد.

نمایش-نام-دوم-3

دقت نمایید که مقدار را باید قبل از خط دستور extern بنویسید. ابتدا باید تعریف(مقداردهی) شود بعد از آن انتخاب شود.

تعدادی enum وجود دارد که متاتریدر آن ها را ساخته است. با انتخاب F1 وارد MQL4 Reference می­شوید در جعبه جستجو واژه  enum را وارد کنید. لیستی از enum ها قابل مشاهده خواهد بود.

خط دستور extern

به معرفی برخی از آن ها اشاره کوتاه خواهیم داشت اما در طول دوره کارایی بیشتری خواهید داشت.

خط-دستور-extern--2

 

خط-دستور-extern-- 3

 

خط-دستور-extern--4

یکی از مواردی که کاربرد دارد ENUM_DAY_OF_WEEK می­باشد عبارت را کپی کرده و وارد دستورات متاتریدر کنید.

خط-دستور-extern--5

Compile را کلیک کنید.

week اضافه شده

 

week-اضافه-شدن-گزینه-2

مورد دیگری که کارای دارد ENUM_LINE_STYLE می­باشد.

با استفاده از آن می­توان استایل خطی را داشته باشید.

ENUM_LINE_STYLE

همچنین ENUM_Timeframes با استفاده از آن، می­توانید یکی از مقدارها را داشته باشید. و خروجی اعداد روی به روی آن (value) خواهد بود. دستور را درون برنامه چک کنید.

ENUM_Timeframes

 

ENUM_Timeframes-2

با درگ کردن نام کلاس درون چارت تغییرات را درون جعبه مشاهده می­کنید. و یکی از انواع تایم فریم را می­توانید انتخاب کنید.

با انتخاب 4 hours باید عدد 240 نمایش شود.

ENUM_Timeframes 3

سایر مقالات مرتبط

متا تریدر چیست؟
متاتریدر

متا تریدر چیست؟

متا تریدر چیست؟ اولین سوالی که هر فرد وقتی می خواهد آموزش های متاتریدر مانند آموزش صفر تا صد mql5،

کامل ترین و بهترین آموزش متاتریدر 4
mql4

کامل ترین آموزش متاتریدر 4

بهترین آموزش متاتریدر 4 متاتریدر4 یک پلتفرم معاملاتی محسوب می‌ شود که دارای رابط کاربری ساده است و همین یادگیری

پاسخ‌ها

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