Напишем необходимую функцию, которая будет не слишком отличаться от рассмотренной в указанной выше теме в первом посте, т.е. функции с именем f_GetPriceMACross():
- Код: выделить все
datetime f_GetTimeMACross(int pef, int pes, int mef, int mes, int apf, int aps, string ty, int shi)
{
/*
Описание:
Функция возвращает время открытия бара, на котором пересеклись скользящие средние. Если
таковая не была найдена, то функция вернет 01.01.1970
Параметры:
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; // кол-во найденных пересечений
datetime t = D'01.01.1970 00:00:00'; // Диапазон значений от 1 января 1970 года
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(Time[i]);
}
}
else if(ty == "S")
{
if(bol_S)
{
int_N++;
if(int_N == shi) return(Time[i]);
}
}
else if(ty == "A")
{
if(bol_B || bol_S)
{
int_N++;
if(int_N == shi) return(Time[i]);
}
}
}
return(t);
}
Данная функция f_GetTimeMACross() имеет тип времени datetime. Возвращает время открытия бара, на котором пересеклись скользящие средние. Если таковое не была найдено, то функция вернет 01.01.1970 (своего рода, инициация нулем).
Напомню, что данные функции нам потребуются для определения наличия позиции после поступления сигнала, т.е. это будет решением ситуации, когда по тем или иным причинам не была открыта позиция после поступления сигнала, но открыть её по прежнему нужно. Упоминание об этой проблематике см. здесь.