← К каталогу
Исходный код · ID 963

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 и перейдите к оплате.

Стоимость полного кода
877,50₽ ≈ $10.72