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

پیدا کردن نقاط حمایت و مقاومت - ورژن 1

(آپدیت: کد هارو وسط متن ها نوشته بودم ولی چک کردم دیدم جالب نشده - گذاشتم آخر نوشته ها کدهارو)

امروز می خواستم یک اندیکاتور بنویسم که خیلی ساده بتونه نقاط حمایت و مقاومت رو بهم نشون بده - خیلی برنامه پیچیده ای نمی خوام باشه فقط اینکه بتونه نقاط رو بررسی کنه که هر کندل نسبت به کندل قبل و بعدش اگر High بالاتر یا اگر Low پایین تری داشت اون نقطه رو یک نقطه حمایت و مقاومت در نظر بگیره.


تو تیکه پایین خیلی موضوع خاصی رو نداریم و Property های برنامه رو تعیین می کنیم

اما با توجه به اینکه قراره روی خود چارت علامت بزنیم حتما property سوم که indicator_chart_window هست رو انتخاب می کنیم.

یک متغیر برای شمارش تو OnCalculator نیاز داریم که حتما باید به صورت Global تعریف بشه که اسمش رو خیلی ساده j گذاشتم.

تو OnInit چیز خاصی نیز نیست بنویسیم چون چیزی به صورت پیش فرض نداریم.

تو Event OnCalculate چند تا نکته خیلی مهم هست که باید حتما بهش دقت بشه.

تابع CopyRate رو نیازی نیست حتما تو هربار فراخانی OnCalculate به صورت کامل برای همه کندل ها فراخانی کنیم (این خیلی خیلی مهمه و قطعا اگر درست اجرا نشه باعث میشه برنامه منابع خیلی بیشتری رو از سرور بگیره)

همینطور برای اینکه تو هر بار فراخانی تابع OnCalculate برنامه مدام وارد حلقه های بلا استفاده نشه می تونیم از prev_calculate استفاده کنیم. تو کدنویسی چند تا از برنامه نویس های خوب mql5 دیدم که متاسفانه از prev_calculate استفاده نمی کنن و این خب باعث میشه الکی منابع اضافه مصرف بشه.

راستی ما دو تا فاز داریم که تو کد بالا بهش اشاره کردم قشنگ

فاز اول فاز کندل های قبل از "حال حاضره" و فاز دوم فاز کندل های بعد از "حال حاضر"

این برنامه با Object ها کار می کنه و OBJ_ARROW میذاره پایین وبالای کندل ها

#property copyright &quotCopyright 2023, MetaQuotes Software Corp.&quot
#property version &quot1.00&quot
#property indicator_chart_window
int j = 0;
int OnInit()
{
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int limit = rates_total - prev_calculated;
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(limit == rates_total)
{
int count = CopyRates(_Symbol,PERIOD_CURRENT,1,rates_total,rates);
for(int i=1; i<count-1; i++)
{
if(rates[i].low < rates[i+1].low & rates[i].low < rates[i-1].low)
{
ObjectCreate(0,IntegerToString(j),OBJ_ARROW_BUY,0,rates[i].time,rates[i].low);
j++;
}
if(rates[i].high > rates[i + 1].high & rates[i].high > rates[i-1].high)
{
ObjectCreate(0,IntegerToString(j),OBJ_ARROW_SELL,0,rates[i].time,rates[i].high);
j++;
}
}
}
else if(limit){
CopyRates(_Symbol,PERIOD_CURRENT,1,3,rates);
if(rates[1].low < rates[2].low & rates[1].low < rates[0].low)
{
ObjectCreate(0,IntegerToString(j),OBJ_ARROW_BUY,0,rates[1].time,rates[1].low);
j++;
}
if(rates[1].high > rates[2].high & rates[1].high > rates[0].high)
{
ObjectCreate(0,IntegerToString(j),OBJ_ARROW_SELL,0,rates[1].time,rates[1].high);
j++;
}
}
return(rates_total);
}

خروجی برنامه



می خوام تو یک برنامه دیگه همین کار رو با یک اندیکاتور انجام بدم نه اینکه با Object باشه


حمایت مقاومتforexربات فارکس
الان در حال یادگیری MQL5 - کنجکاوی هام درباره برنامه نویسی رو اینجا می نویسم.
شاید از این پست‌ها خوشتان بیاید