Ценовую разницу между барами будем возвращать в пунктах.
В качестве параметров функции выберем:
- имя торгового инструмента;
- рабочий ТФ;
- номер левого бара;
- номер правого бара.
Поскольку расчет в МТ идет справа налево, то правый бар всегда имеет меньший индекс чем левый. Т.е. чтобы, к примеру, задать условие расчета гэпа между только что закрытым баром и предшествующим ему, нужно задать в качестве левого бара - 2, а в качестве правого бара - 1. Расчет разрыва будет осуществлен между 1 и 2 барами.
- Код: выделить все
/*
Функция возвращает разницу в пунктах между двумя барами
Параметры:
sy - наименование инструмента ("0" - текущий символ)
tf - таймфрейм (0 - текущий таймфрейм)
bar2 - номер левого бара (2 - второй бар)
bar1 - номер правого бара (1 - первый бар)
Возвращаемое значение:
положительное - между барами bar2 и bar1 был рост курса
отрицательное - между барами bar2 и bar1 было снижение курса
*/
int f_GetGap(string sy, int tf, int bar1, int bar2)
{
if(sy == "0") sy = Symbol();
double dbl_Point = MarketInfo(sy, MODE_POINT);
int dbl_Digit = (int) MarketInfo(sy, MODE_DIGITS);
int dd = 0, int_Bars = iBars(sy, tf);
if(bar1 > int_Bars || bar2 > int_Bars) Print("f_GetGap(): Недостаточно баров для ", sy);
else
{
if(bar1 > 0 && bar2 > 0)
{
int d1 = (int) NormalizeDouble((iHigh(sy, tf, bar1) - iLow(sy, tf, bar2)) / dbl_Point, dbl_Digit);
int d2 = (int) NormalizeDouble((iLow(sy, tf, bar1) - iHigh(sy, tf, bar2)) / dbl_Point, dbl_Digit);
if(MathAbs(d1) > MathAbs(d2)) dd = d1;
if(MathAbs(d1) < MathAbs(d2)) dd = d2;
if(MathAbs(d1) == MathAbs(d2))
{
if(iOpen(sy, tf, bar2) > iClose(sy, tf, bar1)) dd = d2; else dd = d1;
}
}
}
return(dd);
}
Функция возвращает значение типа int:
- положительное между барами bar2 и bar1, когда был рост курса;
- отрицательное между барами bar2 и bar1, когда было снижение курса.