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

search_patterns.mq5

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Парсер паттернов — пользовательский индикатор для MetaTrader 4, который строит ZigZag и анализирует гармонические графические паттерны на ценовых графиках. Поддерживается поиск фигур Гартли, Бабочка, Краб, Летучая мышь, паттерна 5-0, AB=CD и Волчьих волн.

Индикатор отрисовывает на графике треугольники, трендовые линии, уровни Фибоначчи и текстовые метки для обнаруженных паттернов. Имеется режим отображения будущих (прогнозных) паттернов, позволяющий видеть потенциальные зоны развития цены.

Настройки позволяют включать и отключать отдельные типы паттернов, задавать глубину ZigZag, допуски по ценовым и временным соотношениям, а также настраивать цвета отображения. Информация о найденных паттернах выводится в комментарий графика.

Настройки программы

НастройкаОписание
FuturePattern Будущие паттерны — Включает режим отображения будущих (прогнозных) паттернов
ExtSave Сохранять время — При значении true сохраняет время последнего обновления паттернов для имен объектов
ExtDepth Глубина ZigZag — Глубина ZigZag; при значении 0 используется стандартная глубина, при ненулевом значении minDepth и maxDepth устанавливаются равными этому параметру
ExtPoint Количество экстремумов — Количество экстремумов ZigZag, используемых для поиска паттернов
minDepth Минимальная глубина — Минимальная глубина ZigZag для поиска экстремумов
maxDepth Максимальная глубина — Максимальная глубина ZigZag для поиска экстремумов
ExtDopusk Допуск по ценовым соотношениям — Допуск по ценовым соотношениям ретрейсмента при проверке паттернов
TimeDopusk Допуск по временным соотношениям — Допуск по временным соотношениям при проверке паттернов
Gartley Гартли — Включает или отключает поиск паттерна Гартли и связанных фигур (Бабочка, Краб, Летучая мышь)
Pattern_50 Паттерн 5-0 — Включает или отключает поиск паттерна 5-0
ABCD AB=CD — Включает или отключает поиск паттерна AB=CD
WolfWaves Волчьи волны — Включает или отключает поиск Волчьих волн
SweetZoneStart Зона начала WW — Включает или отключает отображение зоны начала для Волчьих волн
SweetZoneEnd Зона окончания WW — Включает или отключает отображение зоны окончания для Волчьих волн
SZScolor Цвет зоны начала WW — Цвет объектов зоны начала Волчьих волн
SZEcolor Цвет зоны окончания WW — Цвет объектов зоны окончания Волчьих волн
ExtColorGartley Цвет паттернов — Цвет объектов обнаруженных паттернов
ExtColorRet Цвет ретрейсмента — Цвет линий ретрейсмента и текстовых меток
Получить полный код

Поиск по коду файла

#property stacksize 16384

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 CLR_NONE
#import "user32.dll"
int GetClientRect(int hWnd,int lpRect[]);
#import
extern bool FuturePattern =false; /* true - ???? ????????????? ????????, ?.?. ????? ?????????? ??????? ?? ???????? ?? ?????????? ????????, ??? "???????????" ????????????? ????????? ;) */
extern bool ExtSave=false; /* ???? true, ?? ?????????? ????? ????????? ?? ??????? */
extern int ExtDepth=0; /* ???????? ??? ZZ,???? 0, ?? ????? ???? ????? ?????????, ????? ????????? ???????(???? ?? ????) ? ????????? ?????????? Depth */
extern int ExtPoint=5; /* ?????????? ????? ???????, ???? ?????? ?????? 5, ?? ????? ???????????? ???????? ?? ??????? (???? ??? ????) */
extern int minDepth=3; /* ???????? ??? ?????? ????????? */
extern int maxDepth=50;/* ???????? ??? ?????? ????????? */
/*extern*/ int ExtIndicator=0; /* ?????????? ????????, ??????? ????? ?????? ????? ??? ?????????? ???????? */
extern double ExtDopusk=0.05; /* ????????? ???????? ????? ?????????? ?? ????? ??? ???????? ExtDopusk */
extern double TimeDopusk=0.2; /*????????? ???????? ?? ??????? ????? ?????????? ?? ????? ??? ???????? TimeDopusk */
extern bool Gartley=true; /* true - ???? ???????? ??????, false - ??? */
extern bool Pattern_50=true; /* true - ???? ??????? 5-0, false - ??? */
extern bool ABCD=true; /* true - ???? ??????? AB=CD, false - ??? */
extern bool WolfWaves=false; /* true - ???? ??????? WW, false - ??? */
extern bool SweetZoneStart=true; /* true - ?????????? ???????? ?????? ????????? WW ? ??????? ?????? ??????? ?.5, false - ??? */
extern bool SweetZoneEnd=true; /* true - ?????????? ???????? ????????? WW ? ??????? ?????? ??????? ?.6, false - ??? */
extern color SZScolor=Blue; /* ???? ??? SweetZoneStart */
extern color SZEcolor=DarkGreen; /* ???? ??? SweetZoneEnd */
extern color ExtColorGartley=White; /* ???? ??? ????????? ?????? */
extern color ExtColorRet=Black; /* ???? ????? ????????????? */

static int endbar=0;
static double endpr=0;
static bool fl;
string com1="",com2="",com3="",com4="",com5="",com6="",com7="",com8="",com9="";
string save="";
static int GPixels,VPixels;
int rect[4],hwnd;

double zz[];

int init()
  {
      // код доступен только после оплаты
   }

int deinit()
  {
   string NamePattern[7]={"Gartley","Butterfly","Crab","Bat","Pattern_5-0","AB=CD","WolfeWaves"};

   Comment("");
   for(int b=0;b<7;b++)
     {
      for(int k=0;k<=maxDepth;k++)
        {
         ObjectDelete("RealTargetD_"+NamePattern[b]+k);
         ObjectDelete("RealTextTargetD_"+NamePattern[b]+k);
         ObjectDelete("RealFiboTarget_"+NamePattern[b]+k);
         ObjectDelete("Real1_"+NamePattern[b]+k);
         ObjectDelete("Real2_"+NamePattern[b]+k);
         ObjectDelete("Real3_"+NamePattern[b]+k);
         ObjectDelete("RealRetXB_"+NamePattern[b]+k);
         ObjectDelete("RealRetAC_"+NamePattern[b]+k);
         ObjectDelete("RealRetBD_"+NamePattern[b]+k);
         ObjectDelete("RealRetXD_"+NamePattern[b]+k);
         ObjectDelete("RealTextRetXB_"+NamePattern[b]+k);
         ObjectDelete("RealTextRetAC_"+NamePattern[b]+k);
         ObjectDelete("RealTextRetBD_"+NamePattern[b]+k);
         ObjectDelete("RealTextRetXD_"+NamePattern[b]+k);
         ObjectDelete("RealLineXA_"+NamePattern[b]+k);
         ObjectDelete("RealLineAB_"+NamePattern[b]+k);
         ObjectDelete("RealLineBC_"+NamePattern[b]+k);
         ObjectDelete("RealLineCD_"+NamePattern[b]+k);
         ObjectDelete("Future1_"+NamePattern[b]+k);
         ObjectDelete("Future2_"+NamePattern[b]+k);
         ObjectDelete("Future3_"+NamePattern[b]+k);
         ObjectDelete("FutureTargetC_"+NamePattern[b]+k);
         ObjectDelete("FutureTextTargetC_"+NamePattern[b]+k);
         ObjectDelete("FutureMinTargetD_"+NamePattern[b]+k);
         ObjectDelete("FutureTextMinTargetD_"+NamePattern[b]+k);
         ObjectDelete("FutureMaxTargetD_"+NamePattern[b]+k);
         ObjectDelete("FutureTextMaxTargetD_"+NamePattern[b]+k);
         ObjectDelete("FutureRetXB_"+NamePattern[b]+k);
         ObjectDelete("FutureTextRetXB_"+NamePattern[b]+k);
         ObjectDelete("FutureRetAC_"+NamePattern[b]+k);
         ObjectDelete("FutureTextRetAC_"+NamePattern[b]+k);
        }
     }
   return(0);
  }

int start()
  {
      // код доступен только после оплаты
   }
/*------------------------------------------------------------------+
|  ZigZag_Talex, ???? ????? ???????? ?? ???????. ?????????? ?????   |
|  ???????? ??????? ?????????? ExtPoint.                            |
+------------------------------------------------------------------*/

void ZZTalex(int n)
  {
/*??????????*/
   int    i,j,k,zzbarlow,zzbarhigh,curbar,curbar1,curbar2,EP,Mbar[];
   double curpr,Mprice[];
   bool flag,fd;
   /*??????*/
   for(i=0;i<=Bars-1;i++)
   {zz[i]=0.0;}

   EP=ExtPoint;
   zzbarlow=iLowest(NULL,0,MODE_LOW,n,0);
   zzbarhigh=iHighest(NULL,0,MODE_HIGH,n,0);

   if(zzbarlow<zzbarhigh) {curbar=zzbarlow; curpr=Low[zzbarlow];}
   if(zzbarlow>zzbarhigh) {curbar=zzbarhigh; curpr=High[zzbarhigh];}
   if(zzbarlow==zzbarhigh){curbar=zzbarlow;curpr=funk1(zzbarlow, n);}

   ArrayResize(Mbar,ExtPoint);
   ArrayResize(Mprice,ExtPoint);
   j=0;
   endpr=curpr;
   endbar=curbar;
   Mbar[j]=curbar;
   Mprice[j]=curpr;
   EP--;
   if(curpr==Low[curbar]) flag=true;
   else flag=false;
   fl=flag;
   i=curbar+1;
   while(EP>0)
     {
      if(flag)
        {
         while(i<=Bars-1)
           {
            curbar1=iHighest(NULL,0,MODE_HIGH,n,i);
            curbar2=iHighest(NULL,0,MODE_HIGH,n,curbar1);
            if(curbar1==curbar2){curbar=curbar1;curpr=High[curbar];flag=false;i=curbar+1;j++;break;}
            else i=curbar2;
           }
         Mbar[j]=curbar;
         Mprice[j]=curpr;
         EP--;
        }
      if(EP==0) break;
      if(!flag)
        {
         while(i<=Bars-1)
           {
            curbar1=iLowest(NULL,0,MODE_LOW,n,i);
            curbar2=iLowest(NULL,0,MODE_LOW,n,curbar1);
            if(curbar1==curbar2){curbar=curbar1;curpr=Low[curbar];flag=true;i=curbar+1;j++;break;}
            else i=curbar2;
           }
         Mbar[j]=curbar;
         Mprice[j]=curpr;
         EP--;
        }
     }
   /* ??????????? ?????? */
   if(Mprice[0]==Low[Mbar[0]])fd=true; else fd=false;
   for(k=0;k<=ExtPoint-1;k++)
     {
      if(k==0)
        {
         if(fd==true)
           {
            Mbar[k]=iLowest(NULL,0,MODE_LOW,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=Low[Mbar[k]];endbar=ExtDepth;
           }
         if(fd==false)
           {
            Mbar[k]=iHighest(NULL,0,MODE_HIGH,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=High[Mbar[k]];endbar=ExtDepth;
           }
        }
      if(k<ExtPoint-2)
        {
         if(fd==true)
           {
            Mbar[k+1]=iHighest(NULL,0,MODE_HIGH,Mbar[k+2]-Mbar[k]-1,Mbar[k]+1);Mprice[k+1]=High[Mbar[k+1]];
           }
         if(fd==false)
           {
            Mbar[k+1]=iLowest(NULL,0,MODE_LOW,Mbar[k+2]-Mbar[k]-1,Mbar[k]+1);Mprice[k+1]=Low[Mbar[k+1]];
           }
        }
      if(fd==true)fd=false;else fd=true;

    /* ????????? ZigZag'a */
      zz[Mbar[k]]=Mprice[k];

     }
  }
/*-------------------------------------------------------------------+
/  ZigZag_Talex ?????                                                |
/-------------------------------------------------------------------*/

/*-------------------------------------------------------------------+
/ ?????? ??? ?????? ? ??????? ???? (???? ?? ???????) ????? ????????? |
/ ????? ???????????? ? ???????? ???????.                             |
/-------------------------------------------------------------------*/

double funk1(int zzbarlow, int ExtDepth)
  {
   double pr;
   int fbarlow,fbarhigh;
   fbarlow=iLowest(NULL,0,MODE_LOW,ExtDepth,zzbarlow);
   fbarhigh=iHighest(NULL,0,MODE_HIGH,ExtDepth,zzbarlow);

   if(fbarlow>fbarhigh) pr=High[zzbarlow];
   if(fbarlow<fbarhigh) pr=Low[zzbarlow];
   if(fbarlow==fbarhigh)
     {
      fbarlow=iLowest(NULL,0,MODE_LOW,2*ExtDepth,zzbarlow);
      fbarhigh=iHighest(NULL,0,MODE_HIGH,2*ExtDepth,zzbarlow);
      if(fbarlow>fbarhigh) pr=High[zzbarlow];
      if(fbarlow<fbarhigh) pr=Low[zzbarlow];
      if(fbarlow==fbarhigh)
        {
         fbarlow=iLowest(NULL,0,MODE_LOW,3*ExtDepth,zzbarlow);
         fbarhigh=iHighest(NULL,0,MODE_HIGH,3*ExtDepth,zzbarlow);
         if(fbarlow>fbarhigh) pr=High[zzbarlow];
         if(fbarlow<fbarhigh) pr=Low[zzbarlow];
        }
     }
   return(pr);
  }

string TimeFrame()
  {
   string TF;
   switch(Period())
     {
      case 1: return("M1");
      case 5: return("M5");
      case 15: return("M15");
      case 30: return("M30");
      case 60: return("H1");
      case 240: return("H4");
      case 1440: return("D1");
      case 10080: return("W1");
      case 43200: return("MN1");
     }
  }

void GartleyPatternsSearch(int X,int A,int B,int C,int D,int Depth)
  {
/* ?????????? ?????????? */
   double R0382=0.382,
   R0500=0.500,
   R0618=0.618,
   R0786=0.786,
   R0886=0.886,
   R1128=1.128,
   R1236=1.236,
   R1272=1.272,
   R1618=1.618,
   R2236=2.236,
   R2618=2.618,
   R3618=3.618;
   int XB,AC,BD,XD;
   double   retXD, retXB, retBD, retAC, minret, maxret;
   string BullBear="", NamePattern="",MinMax="";
   static int varX,varA,varB,varC,varD;
   double PriceD_XD,PriceD_BD;

   if(varX==X && varA==A && varB==B && varC==C && varD==D)return;
   else {varX=X; varA=A; varB=B; varC=C; varD=D;}
   minret=1-ExtDopusk; maxret=1+ExtDopusk;
  /* ???? ???????? ?? 5-?? ?????? */
   if(FuturePattern==false)
     {
      if(zz[D]<zz[B] && zz[C]>zz[B] && zz[C]<zz[A] && zz[B]>zz[X])
        {
         BullBear="Bullish";
         MinMax="Min";
        }
      if(zz[D]>zz[B] && zz[C]<zz[B] && zz[C]>zz[A] && zz[B]<zz[X])
        {
         BullBear="Bearish";
         MinMax="Max";
        }
   /* ??????? ???????????? */
      if(BullBear!="")
        {
         retXB=(zz[A]-zz[B])/(zz[A]-zz[X]+0.000001);
         retAC=(zz[C]-zz[B])/(zz[A]-zz[B]+0.000001);
         retBD=(zz[C]-zz[D])/(zz[C]-zz[B]+0.000001);
         retXD=(zz[A]-zz[D])/(zz[A]-zz[X]+0.000001);
    /* ????? ?????????? ???????????? */
         if((retXB>=R0382*minret) && (retXB<=R0618*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret) && (retBD>=R1128*minret) && (retBD<=R2236*maxret) && (retXD>=R0618*minret) && (retXD<=R0786*maxret))
           {
            NamePattern="Gartley";
           }
         else if ((retXB>=R0618*minret) && (retXB<=R0886*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret) && (retBD>=R1272*minret) && (retBD<=R2618*maxret) && (retXD>=R1272*minret) && (retXD<=R1618*maxret))
              {
               NamePattern="Butterfly";
              }
            else if ((retXB>=R0382*minret) && (retXB<=R0886*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret) && (retBD>=R1618*minret) && (retBD<=R3618*maxret) && (retXD>=R1618*minret) && (retXD<=R1618*maxret))
                 {
                  NamePattern="Crab";
                 }
               else if ((retXB>=R0382*minret) && (retXB<=R0618*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret) && (retBD>=R1272*minret) && (retBD<=R2618*maxret) && (retXD>=R0886*minret) && (retXD<=R0886*maxret))
                    { // ??? ???????????? ????? ?? ?????? ?????????? ? ?????  ? ????? ?????? TSD ? ????? ????? ?????????? (??????? Nen'? ?? ??????)
                     NamePattern="Bat";
                    }
        }
      if (NamePattern!="")
        {
         CreateRealPattern(NamePattern,BullBear,Depth,X,A,B,C,D,retXB,retAC,retBD,retXD,minret,maxret);
         TargetAndFibo(NamePattern,BullBear,MinMax,maxret,Depth,X,A,B,C,D);
        }
     }
   if(FuturePattern==true)
     {
      int X4,A4,B4,C4;
      double retBDminD,retBDmaxD,retXDminD,retXDmaxD,minD,maxD,maxAC;
      X4=A;A4=B;B4=C;C4=D;
      if(zz[B4]<zz[A4] && zz[B4]>zz[X4] && zz[C4]<zz[A4] && zz[C4]>zz[B4])
        {
         BullBear="Bullish";
         MinMax="Max";
        }
      if(zz[B4]>zz[A4] && zz[B4]<zz[X4] && zz[C4]>zz[A4] && zz[C4]<zz[B4])
        {
         BullBear="Bearish";
         MinMax="Min";
        }
   /* ??????? ???????????? */
   /* ??? ???????????? ????? ?? ?????? ?????????? ? ?????  ? ????? ?????? TSD ? ????? ????? ?????????? (??????? Nen'? ?? ??????)*/
      if(BullBear!="")
        {
         retXB=(zz[A4]-zz[B4])/(zz[A4]-zz[X4]+0.000001);
         retAC=(zz[C4]-zz[B4])/(zz[A4]-zz[B4]+0.000001);
    /* ????? ?????????? ???????????? */
         if((retXB>=R0382*minret) && (retXB<=R0618*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret))
           {
            NamePattern="Gartley";
            retBDminD=zz[C4]-R1128*minret*(zz[C4]-zz[B4]);
            retBDmaxD=zz[C4]-R2236*maxret*(zz[C4]-zz[B4]);
            retXDminD=zz[A4]-R0618*minret*(zz[A4]-zz[X4]);
            retXDmaxD=zz[A4]-R0786*maxret*(zz[A4]-zz[X4]);
            maxAC=0.886*maxret*(zz[A4]-zz[B4])+zz[B4];
            if(BullBear=="Bullish")
              {
               if(retBDminD<retXDminD)minD=retBDminD;else minD=retXDminD;
               if(retBDmaxD>retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
              }
            if(BullBear=="Bearish")
              {
               if(retBDminD>retXDminD)minD=retBDminD;else minD=retXDminD;
               if(retBDmaxD<retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
              }
            CreateFuturePattern(X4,A4,B4,C4,Depth,minD,maxD,maxAC,retXB,retAC,BullBear,NamePattern,MinMax);
           }
         else if ((retXB>=R0618*minret) && (retXB<=R0886*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret))
              {
               NamePattern="Butterfly";
               retBDminD=zz[C4]-R1272*minret*(zz[C4]-zz[B4]);
               retBDmaxD=zz[C4]-R2618*maxret*(zz[C4]-zz[B4]);
               retXDminD=zz[A4]-R1272*minret*(zz[A4]-zz[X4]);
               retXDmaxD=zz[A4]-R1618*maxret*(zz[A4]-zz[X4]);
               maxAC=0.886*maxret*(zz[A4]-zz[B4])+zz[B4];
               if(BullBear=="Bullish")
                 {
                  if(retBDminD<retXDminD)minD=retBDminD;else minD=retXDminD;
                  if(retBDmaxD>retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
                 }
               if(BullBear=="Bearish")
                 {
                  if(retBDminD>retXDminD)minD=retBDminD;else minD=retXDminD;
                  if(retBDmaxD<retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
                 }
               CreateFuturePattern(X4,A4,B4,C4,Depth,minD,maxD,maxAC,retXB,retAC,BullBear,NamePattern,MinMax);
              }
            else if ((retXB>=R0382*minret) && (retXB<=R0886*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret))
                 {
                  NamePattern="Crab";
                  retBDminD=zz[C4]-R1618*minret*(zz[C4]-zz[B4]);
                  retBDmaxD=zz[C4]-R3618*maxret*(zz[C4]-zz[B4]);
                  retXDminD=zz[A4]-R1618*minret*(zz[A4]-zz[X4]);
                  retXDmaxD=zz[A4]-R1618*maxret*(zz[A4]-zz[X4]);
                  maxAC=0.886*maxret*(zz[A4]-zz[B4])+zz[B4];
                  if(BullBear=="Bullish")
                    {
                     if(retBDminD<retXDminD)minD=retBDminD;else minD=retXDminD;
                     if(retBDmaxD>retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
                    }
                  if(BullBear=="Bearish")
                    {
                     if(retBDminD>retXDminD)minD=retBDminD;else minD=retXDminD;
                     if(retBDmaxD<retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
                    }
                  CreateFuturePattern(X4,A4,B4,C4,Depth,minD,maxD,maxAC,retXB,retAC,BullBear,NamePattern,MinMax);
                 }
               else if ((retXB>=R0382*minret) && (retXB<=R0618*maxret) && (retAC>=R0382*minret) && (retAC<=R0886*maxret))
                    {
                     NamePattern="Bat";
                     retBDminD=zz[C4]-R1272*minret*(zz[C4]-zz[B4]);
                     retBDmaxD=zz[C4]-R2618*maxret*(zz[C4]-zz[B4]);
                     retXDminD=zz[A4]-R0886*minret*(zz[A4]-zz[X4]);
                     retXDmaxD=zz[A4]-R0886*maxret*(zz[A4]-zz[X4]);
                     maxAC=0.886*maxret*(zz[A4]-zz[B4])+zz[B4];
                     if(BullBear=="Bullish")
                       {
                        if(retBDminD<retXDminD)minD=retBDminD;else minD=retXDminD;
                        if(retBDmaxD>retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
                       }
                     if(BullBear=="Bearish")
                       {
                        if(retBDminD>retXDminD)minD=retBDminD;else minD=retXDminD;
                        if(retBDmaxD<retXDmaxD)maxD=retBDmaxD;else maxD=retXDmaxD;
                       }
                     CreateFuturePattern(X4,A4,B4,C4,Depth,minD,maxD,maxAC,retXB,retAC,BullBear,NamePattern,MinMax);
                    }
        }
     }
  }

void Patterns50Search(int X,int A,int B,int C,int D,int Depth)
  {
   double   R0500=0.500,
   R1128=1.128,
   R1236=1.236,
   R1272=1.272,
   R1618=1.618,
   R2236=2.236;
   int XB,AC,BD;
   double   retXD, retXB, retBD, retAC, minret, maxret;
   string BullBear="", NamePattern="", MinMax="";
   static int var50X,var50A,var50B,var50C,var50D;

   if(var50X==X && var50A==A && var50B==B && var50C==C && var50D==D)return;
   else {var50X=X; var50A=A; var50B=B; var50C=C; var50D=D;}
   minret=1-ExtDopusk; maxret=1+ExtDopusk;
  /* ???? ???????? ?? 5-?? ?????? */
   if(FuturePattern==false)
     {
      if(zz[X]>zz[B] && zz[X]<zz[A] && zz[D]>zz[B] && zz[D]<zz[C] && zz[A]<zz[C])
        {
         BullBear="Bullish";
         MinMax="Min";
        }
      if(zz[X]<zz[B] && zz[X]>zz[A] && zz[D]<zz[B] && zz[D]>zz[C] && zz[A]>zz[C])
        {
         BullBear="Bearish";
         MinMax="Max";
        }
   /* ??????? ???????????? ??? ??????? ???????? */
      if(BullBear!="")
        {
         retXB=(zz[A]-zz[B])/(zz[A]-zz[X]+0.000001);
         retAC=(zz[C]-zz[B])/(zz[A]-zz[B]+0.000001);
         retBD=(zz[C]-zz[D])/(zz[C]-zz[B]+0.000001);
    /* ????? ?????????? ???????????? */
         if((retXB>=R1128*minret) && (retXB<=R1618*maxret) && (retAC>=R1618*minret) && (retAC<=R2236*maxret) && (retBD>=R0500*minret) && (retBD<=R0500*maxret))
           {
            NamePattern="Pattern_5-0";
           }
        }
      if (NamePattern !="")
        {
         CreateRealPattern(NamePattern,BullBear,Depth,X,A,B,C,D,retXB,retAC,retBD,retXD,minret,maxret);
         TargetAndFibo(NamePattern,BullBear,MinMax,maxret,Depth,X,A,B,C,D);
        }
     }
   if(FuturePattern==true)
     {
      int X4,A4,B4,C4;
      double retBDminD,retBDmaxD,minD,maxD,maxAC;
      X4=A;A4=B;B4=C;C4=D;
      if(zz[X4]<zz[A4] && zz[X4]>zz[B4] && zz[A4]<zz[C4])
        {
         BullBear="Bullish";
         MinMax="Max";
        }
      if(zz[X4]>zz[A4] && zz[X4]<zz[B4] && zz[A4]>zz[C4])
        {
         BullBear="Bearish";
         MinMax="Min";
        }
   /* ??????? ???????????? */
   /* ??? ???????????? ????? ?? ?????? ?????????? ? ?????  ? ????? ?????? TSD ? ????? ????? ?????????? (??????? Nen'? ?? ??????)*/
      if(BullBear!="")
        {
         retXB=(zz[A4]-zz[B4])/(zz[A4]-zz[X4]+0.000001);
         retAC=(zz[C4]-zz[B4])/(zz[A4]-zz[B4]+0.000001);
    /* ????? ?????????? ???????????? */
         if((retXB>=R1128*minret) && (retXB<=R1618*maxret) && (retAC>=R1618*minret) && (retAC<=R2236*maxret))
           {
            NamePattern="Pattern_5-0";
            retBDminD=zz[C4]-R0500*minret*(zz[C4]-zz[B4]);
            retBDmaxD=zz[C4]-R0500*maxret*(zz[C4]-zz[B4]);
            maxAC=2.236*maxret*(zz[A4]-zz[B4])+zz[B4];
            if(BullBear=="Bearish")
              {
               minD=retBDmaxD;maxD=retBDminD;
              }
            if(BullBear=="Bullish")
              {
               minD=retBDminD;maxD=retBDmaxD;
              }
            CreateFuturePattern(X4,A4,B4,C4,Depth,minD,maxD,maxAC,retXB,retAC,BullBear,NamePattern,MinMax);
           }
        }
     }
  }

void ABCDSearch(int A,int B,int C,int D,int Depth)
  {
   double   R0618=0.618,
   R0786=0.786,
   R1272=1.272,
   R1618=1.618;
   int AC,BD,X;
   double   retBD,retAC,retXB,retXD,minret,maxret;
   string BullBear="", NamePattern="",MinMax="";
   static int varabcdA,varabcdB,varabcdC,varabcdD;

   if(varabcdA==A && varabcdB==B && varabcdC==C && varabcdD==D)return;
   else {varabcdA=A; varabcdB=B; varabcdC=C; varabcdD=D;}
   minret=1-ExtDopusk; maxret=1+ExtDopusk;
 /* ???? ???????? ?? 5-?? ?????? */
   if(FuturePattern ==false)
     {
      if(MathAbs(zz[A]-zz[B])/MathAbs(zz[C]-zz[D])<=maxret && MathAbs(zz[A]-zz[B])/MathAbs(zz[C]-zz[D])>=minret && (A-C)/(1.0*(B-D))<=1+TimeDopusk && (A-C)/(1.0*(B-D))>=1-TimeDopusk)
        {
         if(zz[A]>zz[C] && zz[B]<zz[C] && zz[B]>zz[D])
           {
            BullBear="Bullish";
            MinMax="Min";
           }
         if(zz[A]<zz[C] && zz[B]>zz[C] && zz[B]<zz[D])
           {
            BullBear="Bearish";
            MinMax="Max";
           }
  /* ??????? ???????????? ??? ??????? ???????? */
         if(BullBear!="")
           {
            retAC=(zz[C]-zz[B])/(zz[A]-zz[B]+0.000001);
            retBD=(zz[C]-zz[D])/(zz[C]-zz[B]+0.000001);
    /* ????? ?????????? ???????????? */
            if((retAC>=R0618*minret) && (retAC<=R0786*maxret) && (retBD>=R1272*minret) && (retBD<=R1618*maxret))
              {
               NamePattern="AB=CD";
              }
           }
         if (NamePattern!="")
           {
            CreateRealPattern(NamePattern,BullBear,Depth,X,A,B,C,D,retXB,retAC,retBD,retXD,minret,maxret);
            TargetAndFibo(NamePattern,BullBear,MinMax,maxret,Depth,X,A,B,C,D);
           }
        }
     }
   if(FuturePattern==true)
     {
      int X4,A4,B4,C4;
      double retBDminD,retBDmaxD,minD,maxD,maxAC;

      A4=B;B4=C;C4=D;
      if(zz[A4]>zz[C4] && zz[C4]>zz[B4])
        {
         BullBear="Bullish";
         MinMax="Max";
        }
      if(zz[A4]<zz[C4] && zz[C4]<zz[B4])
        {
         BullBear="Bearish";
         MinMax="Min";
        }
      if(BullBear!="")
        {
         retAC=(zz[C4]-zz[B4])/(zz[A4]-zz[B4]+0.000001);
   /* ????? ?????????? ???????????? */
         if((retAC>=R0618*minret) && (retAC<=R0786*maxret))
           {
            NamePattern="AB=CD";
            retBDminD=zz[C4]-minret*(zz[A4]-zz[B4]);
            retBDmaxD=zz[C4]-maxret*(zz[A4]-zz[B4]);
            maxAC=0.786*maxret*(zz[A4]-zz[B4])+zz[B4];
            if(BullBear=="Bearish")
              {
               minD=retBDmaxD;maxD=retBDminD;
              }
            if(BullBear=="Bullish")
              {
               minD=retBDminD;maxD=retBDmaxD;
              }
            CreateFuturePattern(X4,A4,B4,C4,Depth,minD,maxD,maxAC,retXB,retAC,BullBear,NamePattern,MinMax);
           }
        }
     }
  }

void WolfWavesSearch(int P1,int P2,int P3,int P4,int P5,int Depth)
  {
   datetime t1,t2,t3,t4,t5,t6,t7,t8,t9;
   double p1,p2,p3,p4,p5,p6,p7,p8,p9;
   double condition1,condition2;
   string BullBear="", NamePattern="";
   static int varP1,varP2,varP3,varP4,varP5;

   if(varP1==P1 && varP2==P2 && varP3==P3 && varP4==P4 && varP5==P5)return;
   else {varP1=P1; varP2=P2; varP3=P3; varP4=P4; varP5=P5;}

   if(FuturePattern==false)
     {
      if(zz[P1]<zz[P2] && zz[P1]>zz[P3] && zz[P4]<zz[P2] && zz[P4]>zz[P1] && zz[P5]<zz[P3] && (P1-P3)/(1.0*(P3-P5))<=1+TimeDopusk && (P1-P3)/(1.0*(P3-P5))>=1-TimeDopusk && (P1-P3)/(1.0*(P2-P4))<=1+TimeDopusk && (P1-P3)/(1.0*(P2-P4))>=1-TimeDopusk && (P2-P4)/(1.0*(P3-P5))<=1+TimeDopusk && (P2-P4)/(1.0*(P3-P5))>=1-TimeDopusk)
        {
         BullBear="Bullish";
        }
      if(zz[P1]>zz[P2] && zz[P1]<zz[P3] && zz[P4]>zz[P2] && zz[P4]<zz[P1] && zz[P5]>zz[P3] && (P1-P3)/(1.0*(P3-P5))<=1+TimeDopusk && (P1-P3)/(1.0*(P3-P5))>=1-TimeDopusk && (P1-P3)/(1.0*(P2-P4))<=1+TimeDopusk && (P1-P3)/(1.0*(P2-P4))>=1-TimeDopusk && (P2-P4)/(1.0*(P3-P5))<=1+TimeDopusk && (P2-P4)/(1.0*(P3-P5))>=1-TimeDopusk)
        {
         BullBear="Bearish";
        }
      if(BullBear!="")
        {
     t1=Time[P1];p1=zz[P1]; /* ????????? ?.1 */
     t2=Time[P2];p2=zz[P2]; /* ????????? ?.2 */
     t3=Time[P3];p3=zz[P3]; /* ????????? ?.3 */
     t4=Time[P4];p4=zz[P4]; /* ????????? ?.4 */
     t5=Time[P5];p5=zz[P5]; /* ????????? ?.5 */
     t6=Time[P5];p6=zz[P3]-NormalizeDouble(((zz[P1]-zz[P3])/(P1-P3))*(P3-P5),Digits); /* ????????? ?.6 - ?? ????? 1-3 */
     t7=Time[P5];p7=zz[P3]-NormalizeDouble(((zz[P2]-zz[P4])/(P2-P4))*(P3-P5),Digits); /* ????????? ?.7 - ?? ?.3 ????? ??????????? 2-4*/
     t8=Time[0]-(2*P4-P1)*Period()*60;p8=2*zz[P4]-zz[P1]; /* ????????? ?.8 - ?? ????? 1-4 */
     t9=t8+(P1-P3)*Period()*60;p9=p8-(zz[P1]-zz[P3]); /* ????????? ?.9 - ?? ?.3 ????? ??????????? 1-4*/

         if(p7<p6){condition1=p6;condition2=p7;}
         else {condition2=p6; condition1=p7;}
         if (zz[P5]<=condition1 && zz[P5]>=condition2)
           {
            NamePattern="WolfeWaves";
            WolfWavesDraw(NamePattern,BullBear,Depth,t1,t2,t3,t4,t5,t6,t7,t8,t9,p1,p2,p3,p4,p5,p6,p7,p8,p9);
           }
        }
     }
   if(FuturePattern==true)
     {
      P1=P2;P2=P3;P3=P4;P4=P5;P5=0;
      Print("P1=",zz[P1],"; P2=",zz[P2],"; P3=",zz[P3],"; P4=",zz[P4]);
      if(zz[P1]<zz[P2] && zz[P1]>zz[P3] && zz[P4]<zz[P2] && zz[P4]>zz[P1] && (P1-P3)/(1.0*(P2-P4))<=1+TimeDopusk && (P1-P3)/(1.0*(P2-P4))>=1-TimeDopusk)
        {
         BullBear="Bull";
        }
      if(zz[P1]>zz[P2] && zz[P1]<zz[P3] && zz[P4]>zz[P2] && zz[P4]<zz[P1] && (P1-P3)/(1.0*(P2-P4))<=1+TimeDo

Показано первые 50% кода (символов: 44800)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
4 480₽ ≈ $54.75