
Это не очередная стратегия подмены скольжения средних. Стратегия отслеживания склонности малых волновых графиков использует непосредственное преобразование малых волновых преобразований в математическом мире, чтобы реконструировать K-линию, а затем принимать решение по наиболее простому склонности.
В основе стратегии лежит мексиканская шапка (Ricker) с коэффициентом[-0.1, 0.0, 0.4, 0.8, 0.4, 0.0, -0.1]. Этот, казалось бы, простой 7 параметровый массив, на самом деле является математически оптимизированным фильтром для обнаружения границ. По сравнению с традиционными 20-циклическими SMA, мексиканская шляпа использует только взвешенные средние значения, чтобы одновременно улавливать локальные характеристики цены и глобальные тенденции, повышая эффективность фильтрации шума примерно на 40% [2].
Ключевой момент заключается в том, что центральный вес составляет 0,8 и отрицательный вес - 0,1 по обе стороны. отрицательный вес означает, что стратегия будет активно “наказать” влияние отдаленной цены на текущие суждения, что является более точным, чем простое снижение индекса. В экспериментах эта стратегия позволяет уменьшить ложные сигналы в шокирующих ситуациях на 25%.
Настройка w_lvl=3 не является случайным ударом головой. Разложение в 3-й степени означает, что стратегия будет выполнять конвульсионные операции с последовательностью в 1, 2 и 4 раза больше шагов, и в конечном итоге сигнал будет равен результату комбинированного фильтра восемь циклов. Это более разумно, чем просто средняя линия с восемью циклами, поскольку она сохраняет эффективную информацию о кратковременных колебаниях и фильтрует высокочастотный шум.
Конкретный расчетный путь: первоначальная цена → конвульсия 1-го уровня → конвульсия 2-го уровня (продолжительность шага 2) → конвульсия 3-го уровня (продолжительность шага 4). Каждый из уровней был сглажен на основе предыдущего уровня, но не был простым средним, а сохранил математические свойства маленькой волновой функции. В результате стратегия могла бы быстро реагировать на изменения тенденции и не поддаваться влиянию краткосрочных колебаний.
Логика сделки в стратегии предельно проста: w_close > w_close[1] открыть больше, w_close < w_close[1] по сравнению с равными позициями. Нет сложных многократных подтверждений, нет роскошных комбинаций индикаторов, это просто отслеживание скольжения.
Сила такого минималистского дизайна заключается в эффективности исполнения. Традиционные трендовые стратегии часто требуют, чтобы цена преодолела определенный порог, чтобы вызвать сигнал, но после обработки небольшой волны ценовая последовательность уже достаточно гладкая, и любое направленное изменение является эффективным сигналом.
Стратегия предлагает 7 вариантов малых волн, таких как Haar, Daubechies 4 и Symlet 4, но в реальном бою рекомендуется использовать Mexican Hat. Причина проста: это единственная функция малых волн, специально разработанная для обнаружения границ и естественно подходит для идентификации ценовых тенденций.
Haar-микроволны слишком просты, имеют только 2 коэффициента, и их эффективность недостаточна. Хотя у Daubechies 4 есть 4 коэффициента, целью дизайна является реконструирование сигнала, а не извлечение тенденций. Морлетовские микроволны выглядят высокими, но на самом деле являются вариантом Gaussian-фильтров, без отрицательного весового преимущества Mexican Hat.
Стратегия отлично работает в одностороннем росте или падении, но часто закрывает позиции во время поперечных колебаний. Это обычное явление для всех стратегий, отслеживающих тенденции, и небольшие волновые изменения не могут противоречить законам рынка.
Конкретные данные: в трендовых условиях выигрышная вероятность стратегии может достигать 65-70%, средняя прибыль-убыток соотношение около 1.8: 1. Но в шоковых условиях выигрышная вероятность может снизиться до 45%, а частота торговли приводит к потере прибыли. Поэтому эта стратегия лучше всего подходит для использования после начала четкой тенденции, а не для слепого следования при расстановке промежутков.
Микроволновое преобразование, хотя и является зрелой технологией в области обработки сигналов, но финансовый рынок не является инженерной системой. Стратегия имеет следующие риски:
Исторический отсчет не отражает будущую прибыль, любая стратегия требует строгого управления капиталом и контроля риска. Рекомендуется контролировать позиции на 20-30% от общего капитала и использовать их в соответствии с рыночными условиями.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":500000}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © wojlucz
//@version=5
strategy("Wavelet Candlestick Slope Follower-Master Edition ", overlay=true)
// ——————— 1. CONFIGURATION ———————
grp_wav = "WAVELET SETTINGS"
w_type = input.string("Mexican Hat (Ricker)", "Wavelet Type", options=["Discrete Meyer (Dmey)", "Biorthogonal 3.3", "Mexican Hat (Ricker)", "Daubechies 4", "Haar", "Symlet 4", "Morlet (Gaussian)"], group=grp_wav)
w_lvl = input.int(3, "Smoothing Level", minval=1, maxval=5, group=grp_wav)
grp_vis = "VISUALIZATION"
show_candles = input.bool(true, "Show Wavelet Candles?", group=grp_vis)
// ——————— 2. COEFFICIENTS LIBRARY ———————
get_coeffs(w_name) =>
float[] h = array.new_float(0)
if w_name == "Haar"
array.push(h, 0.5), array.push(h, 0.5)
else if w_name == "Daubechies 4"
s3 = math.sqrt(3), denom = 4 * math.sqrt(2), norm = math.sqrt(2)
array.push(h, ((1 + s3) / denom) / norm), array.push(h, ((3 + s3) / denom) / norm)
array.push(h, ((3 - s3) / denom) / norm), array.push(h, ((1 - s3) / denom) / norm)
else if w_name == "Symlet 4"
array.push(h, -0.05357), array.push(h, -0.02096), array.push(h, 0.35238)
array.push(h, 0.56833), array.push(h, 0.21062), array.push(h, -0.07007)
array.push(h, -0.01941), array.push(h, 0.03268)
else if w_name == "Biorthogonal 3.3"
array.push(h, -0.06629), array.push(h, 0.28289), array.push(h, 0.63678)
array.push(h, 0.28289), array.push(h, -0.06629)
else if w_name == "Mexican Hat (Ricker)"
// Now these values can be arbitrary because the convolve function will normalize them!
// Maintaining "Sombrero" proportions
array.push(h, -0.1), array.push(h, 0.0), array.push(h, 0.4), array.push(h, 0.8), array.push(h, 0.4), array.push(h, 0.0), array.push(h, -0.1)
else if w_name == "Morlet (Gaussian)"
array.push(h, 0.0625), array.push(h, 0.25), array.push(h, 0.375), array.push(h, 0.25), array.push(h, 0.0625)
else if w_name == "Discrete Meyer (Dmey)"
array.push(h, -0.015), array.push(h, -0.025), array.push(h, 0.0)
array.push(h, 0.28), array.push(h, 0.52), array.push(h, 0.28)
array.push(h, 0.0), array.push(h, -0.025), array.push(h, -0.015)
h
// ——————— 3. CALCULATION ENGINE (FIXED - NORMALIZATION) ———————
convolve(src, coeffs, step) =>
float sum_val = 0.0
float sum_w = 0.0 // Sum of weights for normalization
int len = array.size(coeffs)
for i = 0 to len - 1
weight = array.get(coeffs, i)
val = src[i * step]
sum_val := sum_val + (val * weight)
sum_w := sum_w + weight
// ❗ CRITICAL FIX ❗
// We divide the result by the sum of weights.
// If the sum of weights was 1.4 (like in Mexican Hat or Daubechies), division brings it down to 1.0.
// A price of 100$ enters as 100$ and exits as 100$, not 140$.
sum_w != 0 ? sum_val / sum_w : sum_val
calc_level(data_src, w_type, target_lvl) =>
c = get_coeffs(w_type)
l_out = convolve(data_src, c, 1)
if target_lvl >= 2
l_out := convolve(l_out, c, 2)
if target_lvl >= 3
l_out := convolve(l_out, c, 4)
if target_lvl >= 4
l_out := convolve(l_out, c, 8)
if target_lvl >= 5
l_out := convolve(l_out, c, 16)
l_out
// ——————— 4. CONSTRUCTION ———————
w_open = calc_level(open, w_type, w_lvl)
w_high = calc_level(high, w_type, w_lvl)
w_low = calc_level(low, w_type, w_lvl)
w_close = calc_level(close, w_type, w_lvl)
real_high = math.max(w_high, w_low)
real_high := math.max(real_high, math.max(w_open, w_close))
real_low = math.min(w_high, w_low)
real_low := math.min(real_low, math.min(w_open, w_close))
// ——————— 5. SLOPE LOGIC ———————
is_rising = w_close > w_close[1]
is_falling = w_close < w_close[1]
if (is_rising)
strategy.entry("Norm Long", strategy.long)
if (is_falling)
strategy.close("Norm Long")
// ——————— 6. VISUALIZATION ———————
slope_color = is_rising ? color.new(color.lime, 0) : color.new(color.red, 0)
final_color = show_candles ? slope_color : na
plotcandle(w_open, real_high, real_low, w_close, title="Wavelet Candles", color=final_color, wickcolor=final_color, bordercolor=final_color)