digital 123pattern.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «digital 123pattern.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный индикатор для MetaTrader 5 предназначен для визуального обнаружения трёхточечных ценовых паттернов «123» на графиках. Он автоматически распознаёт последовательности из трёх точек, формирующие разворотные модели, и отмечает их на графике пронумерованными текстовыми метками. Индикатор различает нисходящие паттерны (отмечены красным) и восходящие паттерны (отмечены зелёным), что позволяет трейдеру быстро идентифицировать потенциальные точки разворота цены.
Параметр aggression управляет чувствительностью поиска паттернов: при низких значениях индикатор требует дополнительных подтверждений перед размещением меток, а при высоких — распознаёт паттерны более агрессивно. Параметр maxbars ограничивает количество анализируемых баров, влияя на глубину истории. Настройки шрифта и размера текста позволяют адаптировать внешний вид меток под предпочтения пользователя.
При изменении параметров или размера графика индикатор автоматически пересчитывает все маркеры, удаляя устаревшие и размещая новые. Параметр PipTextHeight задаёт ручную высоту текста в пунктах; если он установлен в ноль, высота рассчитывается автоматически на основе видимой области графика. Индикатор работает в окне графика и использует два буфера для отрисовки.
Настройки программы
| Настройка | Описание |
|---|---|
| maxbars | Максимальное количество баров для поиска паттерна — Максимальное количество баров для поиска паттерна |
| aggression | Агрессивность поиска паттерна — Число, определяющее, насколько агрессивно ищется паттерн. Чем выше число, тем больше шансов на появление паттерна |
| fontname | Шрифт отображения цифр паттерна — Название шрифта для отображения цифр паттерна |
| fontsize | Размер шрифта отображения цифр паттерна — Размер шрифта для отображения цифр паттерна |
| PipTextHeight | Верхняя граница поиска третьей точки — Верхняя граница области, в которой ищется третья точка паттерна |
Поиск по коду файла
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
extern int maxbars=200;
extern int aggression=1;
extern string fontname="Arial Black";
extern int fontsize=8;
extern int PipTextHeight=0;
int oldmaxbars=0;
double estpiptexth=0.0;
int lastDNcheckpos=0;
int lastUPcheckpos=0;
int init()
{
// код доступен только после оплаты
}
void movemarkers(string obname)
{
double yp=0;
int obindx=0;
string tstr;
int pos;
pos=0;
while (Time[pos] > StrToDouble(StringSubstr(obname,7,StringLen(obname)-7))) pos++;
if ((StringSubstr(obname,3,3) == "Dp2") || (StringSubstr(obname,3,3) == "Up1") || (StringSubstr(obname,3,3) == "Up3"))
{
yp = Low[pos];
tstr ="123Dp2,"+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}
tstr ="123Up1,"+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}
tstr ="123Up3,"+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp-estpiptexth;
}
}
else
{
yp = High[pos]+estpiptexth;
tstr ="123Up2,"+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}
tstr ="123Dp1,"+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}
tstr ="123Dp3,"+StringSubstr(obname,7,StringLen(obname)-7);
obindx = ObjectFind(tstr);
if (obindx !=-1)
{
ObjectSet(tstr,OBJPROP_PRICE1,yp);
yp=yp+estpiptexth;
}
}
}
void deleteoldmarkers(string mtype,int frompos)
{
int pos=0;
string tstr;
pos = 0;
while (pos < ObjectsTotal())
{
tstr = ObjectName(pos);
if (StringSubstr(tstr,0,3+StringLen(mtype)) =="123"+mtype)
{
if (frompos ==-1)
{
ObjectDelete(tstr);
pos = 0;
}
else
{
if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) >= frompos)
{
ObjectDelete(tstr);
movemarkers(tstr);
pos = 0;
}
else pos++;
}
}
else
pos++;
}
}
int deinit()
{
deleteoldmarkers("",-1);
return(0);
}
bool obinset(string obname,string typeset)
{
if (typeset=="T")
{
if ((StringSubstr(obname,0,6) =="123Dp1") || (StringSubstr(obname,0,6) =="123Dp3") ||
(StringSubstr(obname,0,6) =="123Up2")) return(true);
}
else
if (typeset=="B")
{
if ((StringSubstr(obname,0,6) =="123Up1") || (StringSubstr(obname,0,6) =="123Up3") ||
(StringSubstr(obname,0,6) =="123Dp2")) return(true);
}
return(false);
}
int findobatpos(int barnum,string pointtype,string typeset)
{
int inx=0;
int res=0;
string tstr;
string fstr;
inx = ObjectsTotal();
while ((inx >=0)&& (res==0))
{
tstr = ObjectName(inx);
fstr = "123"+pointtype;
if (((StringSubstr(tstr,0,StringLen(fstr)) ==fstr) && (typeset =="")) ||
((typeset!= "") && (obinset(tstr,typeset)) ))
{
if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) == barnum)
{
res++;
inx--;
if (pointtype =="")
{
while (inx >=0)
{
tstr = ObjectName(inx);
fstr = "123"+pointtype;
if (((StringSubstr(tstr,0,StringLen(fstr)) ==fstr) && (typeset=="")) ||
((typeset!= "") && (obinset(tstr,typeset)) ))
{
if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) == barnum)
res++;
}
inx--;
}
}
}
}
inx--;
}
return(res);
}
double getestpiptexth()
{
double range=0;
int st=0;
double result;
int texth=0;
st=FirstVisibleBar();
st = st-BarsPerWindow();
if (st <0) st=0;
range =High[Highest(NULL,0,MODE_HIGH,BarsPerWindow(),st)];
range = range - Low[Lowest(NULL,0,MODE_LOW,BarsPerWindow(),st)];
range = range+((range*0.08)*Point);
result = fontsize;
texth= MathRound((result /8)*4);
result = (Point*texth)*(range/(range/(range/(Point*100))));
if (result < Point ) result = Point;
return(result);
}
void CheckDowns()
{
int pos=0;
int dn1pos =-1;
int dn2pos=-1;
int dn3pos=-1;
double yadj=0;
pos = lastDNcheckpos;
while ((pos >0) && (!IsStopped() ))
{
while ((pos >0) && (High[pos+1]>= High[pos])) pos--;
while ((pos >0) && (dn1pos ==-1))
{
if (!(High[pos+1]<= High[pos]))
{
dn1pos =pos+1;
dn2pos = pos;
}
else pos--;
}
pos--;
while ((pos>0) && (dn3pos==-1))
{
if (High[pos] >High[dn1pos])
{
pos = dn1pos-1;
dn1pos =-1;
dn2pos =-1;
dn3pos=-1;
break;
}
else
if (Low[pos]< Low[dn2pos])
{
dn2pos = pos;
pos--;
}
else
if (High[pos] > High[dn2pos])
{
dn3pos = pos;
}
else pos--;
}
if (dn3pos !=-1)
{
pos--;
if (pos==0)
{
if (High[0] > High[dn1pos]) dn3pos =-1;
}
else
{
while ((pos >0) && (dn3pos !=-1))
{
if (High[pos] > High[dn1pos])
{
pos = dn1pos-1;
dn1pos =-1;
dn2pos=-1;
dn3pos=-1;
}
else
if ((Low[pos] < Low[dn3pos])&& (High[pos]<= High[dn3pos]))
{
break;
}
else
if (High[pos] >= High[dn3pos])
{
dn3pos = pos;
pos--;
}
else pos--;
}
}
}
if ((dn1pos !=-1) && (dn2pos !=-1) && (dn3pos !=-1) )
{
if ((findobatpos(Time[dn1pos],"Dp3","") > 0) && (aggression <3))
{
if (aggression < 2 ) pos = dn2pos-1; else pos=dn1pos-1;
dn1pos =-1;
dn2pos=-1;
dn3pos=-1;
}
else
if ((findobatpos(Time[dn3pos],"DПоказано первые 50% кода (символов: 8775)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.