نکته های مدیریت حافظه ، داده شمار
در ابتدای درس به بررسی حافظه و مشکلات عدم مدیریت آن می پردازیم.
در متاتریدر اکپسرت ساخته و نام گذاری کنید. سپس در تابع OnTick دستورها را وارد کنید.
دستور بالا به معنای پرینت کردن (Bid) قیمت بازار میباشد. Compile را کلیک کنید و وارد متاتریدر شوید.
نام کلاس تعریف شده را درون چارت درگ کنید و ok را انتخاب کنید.
در سربرگ Experts مشاهده میکنید با تغییر قیمت بازار، قیمت ها نیز در حال تغییر میباشند.
چنانچه در کدنویسی حلقه while را بنویسید تا وقتی که i کوچک تر از 10000000 باشد i را پرینت کرده و در پایان i را ++ کند. Compile را کلیک کنید.
در متاتریدر جهت راحتی در شناخت قیمت ، به سراغ کدها رفته و bid را مساوی کنید. Compile را کلیک کنید. به عنوان مثال:
مقدار bid را مشاهده خواهید کرد.
اگر دقت کنید مقدار bid ثابت میباشد و اعداد تغییر نمیکند. در حالی که در قسمت بالا مقدار در حال تغییر میباشد. دلیل آن را بررسی خواهیم کرد.
در کد بالا زمانی که وارد حلقه while میشود bid مقداری دارد ، زمان ورود به حلقه bid را چاپ میکند. دوباره وارد حلقه میشود و مجددا bid را چاپ میکند. برای همین است که تغییر نمیکند. بنابراین bid را تابع OnTick مقداردهی میکند. به بیان دیگر، زمانی bid مقدار آن تغییر میکند که تابع OnTick فراخوانی شود. البته بعد از تمام شدن همه دستورات و بعد از اینکه OnTick به پایان برسد و OnTick جدیدی به وجود بیاید و بار دیگر تابع فراخوانی شود. در این حالت است که مقدار bid تغییر خواهد کرد. در غیر این صورت مقدار bid ثابت میماند.
در حال حاضر برنامه کنونی در حلقه گیرکرده و در حال چرخش میباشد به همین دلیل مقدار bid ثابت میباشد. زیرا شرط حلقه درست بوده و از حلقه خارج نشده است لذا تابع فراخوانی نمیشود.
فرض کنید با کدهای زیادی سرکار دارید و بخواهید چندین مرتبه bid را بررسی کنید چون تابع از اول فراخوانی نشده شما دارید bid گذشته را فراخوانی میکنید، این مسئله احتمال سبب به وجود آمدن خطا درون سیستم شما باشد در حالی که سبب و علت آن را ندانید که چرا پوزیشن به موقع باز یا بسته نشده است.
و برای رفع این مشکل میتوانید قبل از این که از توابع bid استفاده کنید کدی را تعریف کنید که مجبوراً مقدارها را تولید کند. به عنوان مثال:
تابع RefreshRates تابعی است که ورودی ندارد. زمانی که برنامه به این تابع برسد مقدار bid (یاهر مقدار دیگری) را یکبار دیگری آپدیت میکند. در پایان دستور Compile را کلیک کنید تا شاهد اجرای دستور در برنامه شوید.
با اجرای کد، مقدار bid متناسب با قیمت بازار در حال حرکت و تغییر میباشد. با اینکه حلقه هنوز تمام نشده است.
روش دیگر؛ استفاده از حافظه است.
به بیان ساده تر، 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 بسازید. سپس اسم دلخواه را وارد کنید. در رشته تعریف شده مقادیر را یک به یک تعریف کنید. لازم است بدانید که نباید فاصله بگذارید بلکه با آندرلاین (_) فاصله گذاری کنید. برای ساخت متغیر ابتدا اسم تعریف شده (test1) را بنویسید سپس یک فاصله ، اسم متغیر دلخواه، در آخر با یکی از مقدارهای (test1) مساوی کنید. با این کار شما یک متغیر از نوع ترید ax ساختید.
و برای پرینت دستور زیر را وارد کنید و Compile را کلیک کنید.
مقدار متغیر ترید صفر میباشد بدین معنا که مقدار اولین ورودی صفر میباشد مقدار دومین ورودی یک و مقدار سومین ورودی دو میباشد.
مقدار صفر چاپ شده است.
چنانچه دستور را تغییر دهید و مقدار ترید را ma قرار دهید.
در چارت مقدار یک خواهد بود.
فایده دستور بالا :
یکی از کارای خوبی که میتواند انجام دهد این است که شما میتوانید متغیر را extern کنید. (از کاربر بگیرید)
Compile را کلیک کنید.
کلاس را داخل چارت درگ کنید .
در سربرگ Inputs ترید جدیدی را مشاهدی میکنید که در قسمت value تریدرهای دیگر را نیز میتوانید انتخاب نمایید.
بنابراین از این طریق نیز میتوانید انتخاب کاربر نیز داشته باشید.
با انتخاب cci عدد 2 چاپ شد.
همانگونه که قبلا اشاره شد که مقدار اولین ورودی (trade_ax) صفر، مقدار دومین ورودی (trade_ma) یک و مقدار سومین ورودی(trade_cci) دو میباشد؛ میتوانید برای ورودی ها نیز مقدار تعریف کنید.
Compile را کلیک کنید.
بنابراین زمانی که هر کدام از متغیرها انتخاب شوند صفر و یک و دو نخواهند بود، بلکه مقدارها به 10، 20 و 30 تغییر کرده است.
با انتخاب ترید دوم باید عدد 20 نمایش شود.
همچنین میتوانید تریدرها را زیر هم قرار دهید تا دستور شما از نظر ظاهری مرتب باشد.
همچنین میتوانید مانند متغیر کامنت بنویسید.
در این حالت نام تریدرها نمایش نمیشود و نام دوم نمایش میشود.
نام کلاس را درون چارت درگ کنید.
مشاهده میکنید نام تریدها تغییر کرده و نام های جدید نمایش شده اند.
طبق دستورها در متاتریدر ، عدد 10 به معنای انتخاب ورودی اول میباشد.
دقت نمایید که مقدار را باید قبل از خط دستور extern بنویسید. ابتدا باید تعریف(مقداردهی) شود بعد از آن انتخاب شود.
تعدادی enum وجود دارد که متاتریدر آن ها را ساخته است. با انتخاب F1 وارد MQL4 Reference میشوید در جعبه جستجو واژه enum را وارد کنید. لیستی از enum ها قابل مشاهده خواهد بود.
به معرفی برخی از آن ها اشاره کوتاه خواهیم داشت اما در طول دوره کارایی بیشتری خواهید داشت.
یکی از مواردی که کاربرد دارد ENUM_DAY_OF_WEEK میباشد عبارت را کپی کرده و وارد دستورات متاتریدر کنید.
Compile را کلیک کنید.
مورد دیگری که کارای دارد ENUM_LINE_STYLE میباشد.
با استفاده از آن میتوان استایل خطی را داشته باشید.
همچنین ENUM_Timeframes با استفاده از آن، میتوانید یکی از مقدارها را داشته باشید. و خروجی اعداد روی به روی آن (value) خواهد بود. دستور را درون برنامه چک کنید.
با درگ کردن نام کلاس درون چارت تغییرات را درون جعبه مشاهده میکنید. و یکی از انواع تایم فریم را میتوانید انتخاب کنید.
با انتخاب 4 hours باید عدد 240 نمایش شود.
پاسخها