Как определить, когда 3 скользящих средних пересекаются в течение 4 свечей или меньше

Я работал с двумя пересечениями скользящих средних, что довольно прямолинейно. Я хочу добавить треть к смеси, и я пытаюсь выяснить, происходит ли это в течение 4 свечей или меньше.

Для двух скользящих средних я использовал следующее:

  // if shift5MA > shift0MA 
   if (shift5MAArray[1] > shift0MAArray[1]) {
      
      //if shift5MA < shift0MA VALID SELL
      if (shift5MAArray[2] < shift0MAArray[2]) {
         signal = "sell";
      }
      }
   
   if (shift5MAArray[1] < shift0MAArray[1]) {
      
      //if shift5MA > shift0MA
      if (shift5MAArray[2] > shift0MAArray[2]) {
         signal = "buy";
      }
      }

Как я могу проверить, когда 3 скользящих средних пересекаются друг с другом в пределах 4 свечей или меньше, как на изображении три пересекаются:

введите здесь описание изображения


person IronThrone    schedule 07.09.2020    source источник
comment
Прежде всего, каково ваше определение пересечения линий более 2, например, с 3 линиями, вы считаете пересечением, когда порядок переходит от 1-2-3 к 2-3-1, или только когда порядок полностью инвертируется в конце наблюдаемого времени. Я почти уверен, что решение заключается в сравнении порядка сортировки средних значений между первой и последней свечами.   -  person redheness    schedule 11.09.2020


Ответы (1)


Этот код не оптимизирован по скорости, но показывает в общих чертах, как можно решить эту проблему. Этот ответ отвечает только на ваш вопрос о том, пересеклись ли три скользящие средние. Он не дает вам сигнала на продажу или покупку, но вы можете легко реализовать его, проверив, в каком направлении меняются знаки в массивах diff.

Примечание. В настоящее время код может давать дубликаты пересечения трех скользящих средних из-за поиска в диапазоне 4 свечей.

import numpy as np

MA1 = np.asarray([0, 1, 4, 3, 4, 5,  6,  7, 8,   9, 10])
MA2 = np.asarray([0, 2, 3, 4, 5, 6,  7,  8, 9,  10, 11])
MA3 = np.asarray([0, 0, 6, 7, 8, 9, 10, 10, 11, 12, 13])

haveCrossed = False
for i in range(len(MA1)-3):
  # These are the differences between the moving averages, if one MA
  # crosses another the sign of the difference changes from positive to 
  # negative or vice versa.
  diff1 = MA1[i:i+4] - MA2[i:i+4]
  diff2 = MA1[i:i+4] - MA3[i:i+4]
  diff3 = MA2[i:i+4] - MA3[i:i+4]

  # Check if all signs are equal. If the signs are equal, the moving averages
  # did not intersect.

  # Check if MA1 and MA2 crossed.
  if np.all(diff1 > 0) if diff1[0] > 0 else np.all(diff1 < 0):
    cross1Flag = False
  else:
    cross1Flag = True

  # Check if MA1 and MA3 crossed.
  if np.all(diff2 > 0) if diff2[0] > 0 else np.all(diff2 < 0):
    cross2Flag = False
  else:
    cross2Flag = True

  # Check if MA2 and MA3 crossed.
  if np.all(diff3 > 0) if diff3[0] > 0 else np.all(diff3 < 0):
    cross3Flag = False
  else:
    cross3Flag = True

  if cross1Flag and cross2Flag and cross3Flag:
    haveCrossed = True
    print(f"The three Moving Averages crossed at time: [{i}, {i+3}]")

if not haveCrossed:
  print("The three Moving Averages have not crossed.")

Выход:

The three Moving Averages crossed at time: [0, 3]
The three Moving Averages crossed at time: [1, 4]
person Michael    schedule 11.09.2020