В качестве первого шага, чтобы рассчитать количество скрещиваний и когда они происходят, вы можете сделать
что-то вроде ниже. Считайте это псевдокодом, чтобы получить представление.
# MA: list containing the values of the moving average for each time period
# High: list containing the highs of each bar
# Low: list containing the lows of each bar
MA = [...]
High = [...]
Low = [...]
count = 0 # the number of crosses
index_cross = [] # the indices where crosses occur
for i in range(len(MA)):
if Low[i] < MA[i] and High[i] > MA[i]:
index_cross.append(i)
count += 1
Теперь у вас есть количество крестов и когда они произошли. Это предполагает, что бары пересекают МА.
(то есть нет пробелов, где минимум предыдущего бара выше МА и текущего
максимум бара ниже МА).
Затем вы можете продолжить, используя индексы index_cross, чтобы найти максимальное отклонение цены от места пересечения. Вы должны рассмотреть, будете ли вы использовать цены закрытия или в случае восходящих трендов-максимумов и в случае нисходящих трендов-минимумов.
В качестве примечания, чтобы аннотировать график с интересующими вас точками, вы можете заглянуть в панды (библиотека для анализа данных). Также такие аннотации имеют тенденцию становиться довольно грязными, когда рынки находятся в диапазоне.
Надеюсь, что это дает направление ...