pin-bar.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.