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

pin-bar.mq4

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

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

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

О программе

pin-bar.mq4 — это пользовательский индикатор для платформы MetaTrader 4, отображающий аналитические данные в виде стрелок и маркеров на графике цены. Индикатор использует 6 буферов с различными цветами и стилями отображения для визуализации разных типов ценовых паттернов.

В активной части кода индикатор определяет паттерны Pin Bar BUY и Pin Bar SELL (бычий и медвежий пин-бар), рисуя соответствующие стрелки на графике. При обнаружении паттерна на текущем баре срабатывает звуковое оповещение и всплывающее уведомление с информацией о символе, таймфрейме и размере диапазона.

В коде также реализованы функции обнаружения Inside Bar, GAP, Outside Bar и уровней поддержки/сопротивления (Sup-Res), а также вспомогательные функции расчёта среднего диапазона, размера лота, корреляции между инструментами и значения пипа. Часть этих функций в данный момент закомментирована в основном цикле расчёта.

Индикатор определяет текущий таймфрейм и формирует его текстовое обозначение (M15, M30, H1, H4, D1). При инициализации удаляются все объекты на графике, а основной расчёт выполняется при появлении нового бара.

Получить полный код

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

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 MediumVioletRed
#property indicator_color4 DodgerBlue
#property indicator_color5 Bisque
#property indicator_color6 DeepPink

double buyPB[];
double sellPB[];
double insideBar[];
double arrayGaps[];
double outsideBars[];
double smallSR[];
int startDay=2000;
static int prevTime;
double dayRange = 0.0;
int outsideBarsCount=0;
string period="";

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

int deinit()
{

return(0);
}

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

double AveRange4(int pos)
{
   double sum;
   double rangeSerie[4];

   int i=0;
   int ind=1;
   int startYear=1995;
   int den;

   if(pos<=0)den=1;
   else den = pos;
   if (TimeYear(Time[den-1])>=startYear)
   {
      while (i<4)
      {

         if(TimeDayOfWeek(Time[pos+ind])!=0)
         {
            sum+=High[pos+ind]-Low[pos+ind];//make summation
            i++;
         }
         ind++;   

      }

      return (sum/4.0);//make average, don't count min and max, this is why I divide by 4 and not by 6
   } 
      return (50*Point);

}//------------END FUNCTION-------------

bool IsBuyPinbar(double& dayRange, int pos)
{

   double actOp,actCl,actHi,actLo,preHi,preLo,preCl,preOp,actRange,preRange,actHigherPart,actHigherPart1;
   actOp=Open[pos+1];
   actCl=Close[pos+1];
   actHi=High[pos+1];
   actLo=Low[pos+1];
   preOp=Open[pos+2];
   preCl=Close[pos+2];
   preHi=High[pos+2];
   preLo=Low[pos+2];

   actRange=actHi-actLo;
   preRange=preHi-preLo;
   actHigherPart=actHi-actRange*0.4;//helping variable to not have too much counting in IF part
   actHigherPart1=actHi-actRange*0.4;//helping variable to not have too much counting in IF part

   dayRange=AveRange4(pos);
   if((actCl>actHigherPart1&&actOp>actHigherPart)&&  //Close&Open of PB is in higher 1/3 of PB
      (actRange>dayRange*0.5)&& //PB is not too small

      (actLo+actRange*0.25<preLo)) //Nose of the PB is at least 1/3 lower than previous bar
   {

      if(Low[ArrayMinimum(Low,3,pos+3)]>Low[pos+1])
         return (true);
   }
   return(false);

}//------------END FUNCTION-------------

bool IsSellPinbar(double& dayRange, int pos)
{

   double actOp,actCl,actHi,actLo,preHi,preLo,preCl,preOp,actRange,preRange,actLowerPart, actLowerPart1;
   actOp=Open[pos+1];
   actCl=Close[pos+1];
   actHi=High[pos+1];
   actLo=Low[pos+1];
   preOp=Open[pos+2];
   preCl=Close[pos+2];
   preHi=High[pos+2];
   preLo=Low[pos+2];

   actRange=actHi-actLo;
   preRange=preHi-preLo;
   actLowerPart=actLo+actRange*0.4;//helping variable to not have too much counting in IF part
   actLowerPart1=actLo+actRange*0.4;//helping variable to not have too much counting in IF part

   dayRange=AveRange4(pos);
   if((actCl<actLowerPart1&&actOp<actLowerPart)&&  //Close&Open of PB is in higher 1/3 of PB
      (actRange>dayRange*0.5)&& //PB is not too small

      (actHi-actRange*0.25>preHi)) //Nose of the PB is at least 1/3 lower than previous bar

   {
      if(High[ArrayMaximum(High,3,pos+3)]<High[pos+1])
         return (true);
   }
}//------------END FUNCTION-------------

double LotSize(double pbDay)
{
   pbDay=pbDay+MarketInfo(Symbol(),MODE_SPREAD)*Point;
   double actBalance=AccountBalance();
   double tickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
   double myBet=0;
   double lot=0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   myBet=actBalance*0.02; //2 percent of account
   lot=myBet/(pbDay/Point*tickValue);
   lot=MathRound(lot*10.0)/10.0;
   if(lot<minLot) 
      lot = minLot;
   return (lot);
}

bool IsInsideBar(int pos)
{
   int i = 0;
   int x = 0;

   int takenDays[3];
   if(Period()==1440) //v dennim grafu vynechame nedele tak, ze zaznamenam indexy jednotlivych dni mimo nedeli a pak to zpracuju
   {
      while(i<3)
      {
         if(TimeDayOfWeek(Time[pos+1+x])!=0) 
         {
            takenDays[i]=pos+1+x;
            i++;
         }
         x++;
      }
      if(Low[takenDays[0]]>=Low[takenDays[1]]&&Low[takenDays[1]]>=Low[takenDays[2]])
         if (High[takenDays[0]]<=High[takenDays[1]]&&High[takenDays[1]]<=High[takenDays[2]])
            return (true);

   }
   else 
   {
      if(Low[pos+1]>=Low[pos+2]&&Low[pos+2]>=Low[pos+3])
         if (High[pos+1]<=High[pos+2]&&High[pos+2]<=High[pos+3])
            return (true);

   }
   return (false);
}

int IsOutsideBar(int pos)
{
   int i = 0;

   if(TimeDayOfWeek(Time[pos+2])!=0) 

   if(Low[pos+2]>=Low[pos+1]&&High[pos+2]<=High[pos+1])
   {
      if(Open[pos+1]<Close[pos+1]&&Close[pos+1]>High[pos+2])
         return (1);
      else if(Open[pos+1]>Close[pos+1]&&Close[pos+1]<Low[pos+2])    
         return (-1);
   }
   return (0);
}

int FindMarketIndex()//, 
{
   string tradedMarkets[]={"EURCHF","AUDUSD","USDCZK","USDCAD","EURUSD","GBPUSD","EURJPY","USDJPY","USDCHF","EURCAD","EURCZK","AUDJPY","NZDUSD","EURGBP"};

   int marketCount=ArraySize(tradedMarkets);
   string mySymbol=Symbol();
   for(int i=0;i<marketCount;i++)
      if(tradedMarkets[i]==mySymbol)
         return (i);

}

bool IsSmallBuySR(int pos)//, 
{
   int countMatching,ind,takenBars,difference,matching;

   if (TimeDayOfWeek(Time[pos])==0)
         return(false);
   double refHigh=High[pos];
   int symbol=FindMarketIndex();
   switch(Period())
   {
      case 1440:
         switch(symbol)
         {
            case 0:
               takenBars=6;difference=4;matching=3;
               break;
            case 1:
               takenBars=6;difference=9;matching=3;
               break;
            case 2:
               takenBars=6;difference=11;matching=3;
               break;
            case 3:
               takenBars=6;difference=6;matching=3;
               break;
            case 4:
               takenBars=6;difference=6;matching=3;
               break;
            case 5:
               takenBars=6;difference=6;matching=3;
               break;        
            case 6:
               takenBars=6;difference=7;matching=3;
               break;        
            case 7:
               takenBars=6;difference=6;matching=3;
               break;        
            case 8:
               takenBars=6;difference=6;matching=3;
               break;   
            case 9:
               takenBars=6;difference=7;matching=3;
               break;        
            case 10:
               takenBars=6;difference=5;matching=3;
               break;        
            case 11:
               takenBars=6;difference=7;matching=3;
               break;        
            case 12:
               takenBars=6;difference=6;matching=3;
               break;      
            case 13:
               takenBars=5;difference=2;matching=3;
               break; 
            default:   
               takenBars=5;difference=5;matching=3;
         }

      case 240:
          switch(sy

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

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

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

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

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

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

Стоимость полного кода
1 729,30₽ ≈ $21.14