В функции, приведенной ниже, решается эта задача. При этом, может быть возвращена цена не только последнего пересечения, но и заданного по номеру. Т.е. 1- последнее пересечение, 2 - второе назад пересечение, ... , 20 - двадцатое назад пересечение и т.д. Можно также задавать условие какое именно по типу пересечение нужно (на покупку, на продажу, любое).
- Код: выделить все
double f_GetPriceMACross(int pef, int pes, int mef, int mes, int apf, int aps, string ty, int shi)
{
/*
Описание:
Функция возвращает цену закрытия бара, на котором пересеклись скользящие средние. Если
таковая не была найдена, то функция вернет -1.
Параметры:
pef - период быстрой МАшки
pes - период медленной МАшки
mef - метод усреднения быстрой МАшки
mes - метод усреднения медленной МАшки
apf - тип цены быстрой МАшки
aps - тип цены медленной МАшки
ty - тип пересечения (на покупку - "B", или продажу - "S" или любое - "A")
shi - номер пересечения МАшек (от последнего к началу, т.е. 1 - последние пересечение)
*/
double dblMAF_1, // значение быстрой MA на i-ом баре
dblMAF_2, // значение быстрой MA на i + 1 баре
dblMAS_1, // значение медленной MA на i-ом баре
dblMAS_2; // значение медленной MA i + 1 баре
bool bol_B,
bol_S;
int int_N = 0; // кол-во найденных пересечений
for(int i = 1; i < Bars - pes - 2; i++)
{
dblMAF_1 = iMA(NULL, 0, pef, 0, mef, apf, i);
dblMAF_2 = iMA(NULL, 0, pef, 0, mef, apf, i + 1);
dblMAS_1 = iMA(NULL, 0, pes, 0, mes, apf, i);
dblMAS_2 = iMA(NULL, 0, pes, 0, mes, apf, i + 1);
if((dblMAF_1 > dblMAS_1) && (dblMAF_2 < dblMAS_2)) bol_B = true;
else bol_B = false;
if((dblMAF_1 < dblMAS_1) && (dblMAF_2 > dblMAS_2)) bol_S = true;
else bol_S = false;
if(ty == "B")
{
if(bol_B)
{
int_N++;
if(int_N == shi) return(Close[i]);
}
}
else if(ty == "S")
{
if(bol_S)
{
int_N++;
if(int_N == shi) return(Close[i]);
}
}
else if(ty == "A")
{
if(bol_B || bol_S)
{
int_N++;
if(int_N == shi) return(Close[i]);
}
}
}
return(-1);
}
На рисунке ниже видно как советник, использующий данную функцию выводит в комментарий значение цены закрытия бара на котором произошло 2-ое назад пересечение скользящих средних на покупку: