Функция mql4 определения пин-бара.
int pinBar(int minSizeCandle, ENUM_TIMEFRAMES tf, double percent)
{
double size=0, body = 0;
for(int i = 1; i <= livSignalCandle; i++)
{
size = iHigh(Symbol(),tf,i) - iLow(Symbol(),tf,i);
if(size < minSizeCandle * _Point)
continue;
body = MathAbs(iOpen(Symbol(),tf,i) - iClose(Symbol(),tf,i));
if(size <= 0 || body <= 0)
continue;
if(body/size*100 <= percent)
{
if(iClose(Symbol(),tf,i) > (iHigh(Symbol(),tf,i) + iLow(Symbol(),tf,i))/2)
{
return(i);
}
if(iClose(Symbol(),tf,i) < (iHigh(Symbol(),tf,i) + iLow(Symbol(),tf,i))/2)
{
return(0-i);
}
}
}
return(0);
}
Параметры:
livSignalCandle — Во внешних переменных программы. Определяет, сколько свечей будет «жив» сигнал Пин-Бара.
- minSizeCandle — Минимальный размер свечи;
- tf — таймфрейм, на котором определяются пин-бары;
- percent — Максимальный процент тела свечи по отношению к ее размеру.
Функция возвращает номер бара, а котором зафиксирован последний ПинБар. Если Значение отрицательное — медвежий пинбар, положительное — бычий.
Отрисовка пинбара стрелками на графике
Код в OnTick() для отрисовки пинбара на графике:
if(pinArrowSize>0)
{
if(pin>0)
SetArrow(241, clrGreen,"PinTrade_" + iTime(Symbol(),pinBarTF,pin), iTime(Symbol(),pinBarTF,pin), iLow(Symbol(),pinBarTF,pin) - from, pinArrowSize);
if(pin<0)
SetArrow(242, clrGreen,"PinTrade_" + iTime(Symbol(),pinBarTF,MathAbs(pin)), iTime(Symbol(),pinBarTF,MathAbs(pin)), iHigh(Symbol(),pinBarTF,MathAbs(pin))+from*3*pinArrowSize, pinArrowSize);
}
где pinArrowSize — внешний параметр размера стрелки.
Функция вставки любой стрелки на графике:
//+----------------------------------------------------------------------------+
//| Параметры: |
//| cd - код значка |
//| cl - цвет значка |
//| nm - наименование ("" - время открытия текущего бара) |
//| t1 - время открытия бара (0 - текущий бар) |
//| p1 - ценовой уровень (0 - Bid) |
//| sz - размер значка (0 - по умолчанию) |
//+----------------------------------------------------------------------------+
void SetArrow(int cd, color cl,
string nm="", datetime t1=0, double p1=0, int sz=0)
{
if(nm=="")
nm=DoubleToStr(Time[0], 0);
if(t1<=0)
t1=Time[0];
if(p1<=0)
p1=Bid;
if(ObjectFind(nm)<0)
ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
ObjectSet(nm, OBJPROP_TIME1, t1);
ObjectSet(nm, OBJPROP_PRICE1, p1);
ObjectSet(nm, OBJPROP_ARROWCODE, cd);
ObjectSet(nm, OBJPROP_COLOR, cl);
ObjectSet(nm, OBJPROP_WIDTH, sz);
}