[сначала проверьте изображение] https://i.stack.imgur.com/LEHZr.jpg
Я хочу проверить, находится ли отмеченная свеча на 60% внутри зоны (больше). У меня есть значения OHLC свечи и верхнего и нижнего уровня зоны.
open = 868.72
high = 871
low = 868.72
close = 870.74
upper_level = 870
lower_level = 868
Как это сделать . Я просто не знаю, как начать?
Для тестирования массивами numpy предоставьте воспроизводимый пример с результатами, которые должен получить код.
Вопрос написан недостаточно хорошо, чтобы на него можно было ответить полностью. Он должен содержать небольшие примеры, которые будут воспроизведены предлагаемыми кодами для проверки и оценки. Тем не менее, я создаю образец и надеюсь быть репрезентативным. Мы можем работать с нужными парами, т.е. открытым и Закрыть (тела свечей) или низкий и высоко (тени свечей); Используя первую пару (при условии, что вы ищете тела свечей):
open = np.array([70, 30, 100, 100, 30, 10], dtype=np.float64)
close = np.array([100, 10, 50, 150, 100, 200], dtype=np.float64)
upper_level = np.array([90], dtype=np.float64)
lower_level = np.array([40], dtype=np.float64)
desired_percent = 0.6 # desired body containing related percentage
Эту проблему можно решить циклами python на всех свечах и проверкой условий; Но, как я думаю, эти проблемы должны решаться массивами (из-за больших объемов ввода) с точки зрения производительности и эффективности, поэтому я предлагаю следующее NumPy
вспомогательное решение.
False
заполненным значением, которое будет заполняться True
s, если свечи удовлетворяют заданному условию.Для этой задачи я рассматриваю 5 различных ситуаций:
resulted_masked_array = np.full(shape=open.shape, fill_value=False, dtype=bool)
top = np.maximum(open, close) # top of the candles
bottom = np.minimum(open, close) # bottom of the candles
level_height = upper_level - lower_level
# reducing the arrays by removing candles outside the limit zone
btm_upper_up = np.greater_equal(bottom, upper_level) # if candle is upper the limit zone
top_lower_down = np.less_equal(top, lower_level) # if candle is under the limit zone
candle_complete_outside = np.logical_or(btm_upper_up, top_lower_down)
candle_not_complete_outside = np.invert(candle_complete_outside)
top = top[candle_not_complete_outside]
bottom = bottom[candle_not_complete_outside]
candles_height = top - bottom
# if limit zone length be a part of candle body --> needs to check if the zone height >= the desired percentage of the candles' body
btm_lower_down = np.less_equal(bottom, lower_level)
top_upper_up = np.greater_equal(top, upper_level)
percentage_check = (level_height / candles_height) >= desired_percent
# if just candle bottom be in the limit zone
btm_upper_down = np.greater_equal(bottom, lower_level)
btm_lower_up = np.less_equal(bottom, upper_level)
up_to_btm = upper_level - bottom
percentage_check_utb = (up_to_btm / candles_height) >= desired_percent
# if just candle top be in the limit zone
top_upper_down = np.greater_equal(top, lower_level)
top_lower_up = np.less_equal(top, upper_level)
top_to_down = top - lower_level
percentage_check_ttd = (top_to_down / candles_height) >= desired_percent
candle_complete_inside = np.logical_and(btm_upper_down, top_lower_up)
body_contain_limits = np.logical_and.reduce((btm_lower_down, top_upper_up, percentage_check))
btm_contained_limits = np.logical_and.reduce((btm_upper_down, btm_lower_up, percentage_check_utb))
top_contained_limits = np.logical_and.reduce((top_upper_down, top_lower_up, percentage_check_ttd))
result = np.logical_or.reduce((candle_complete_inside, body_contain_limits, btm_contained_limits, top_contained_limits))
# filling the main False filled Boolean array by Trues (for satisfied conditions)
resulted_masked_array[candle_not_complete_outside] = result
# resulted_masked_array --> [ True False True False True False]
Результаты должны быть проверены реальными входными данными; Здесь я проверил их на небольшом созданном примере.
Это не похоже на вопрос, связанный с программированием. Ваш вопрос больше связан с решением проблем.