Эта стратегия основана на ежедневных свечах Хайкена Аши в сочетании с анализом импульса в разные временные рамки, чтобы динамически определить базовую поддержку за текущей ценой и определить точки входа и выхода.
Вычислить цены закрытия свечей Heiken Ashi в разные временные рамки, как основу для последующего анализа импульса.
Вычислить процентное изменение между открытыми ценами и историческими закрытыми ценами за разные периоды, как для ежемесячных, так и для ежедневных временных рамок.
Взять средние значения ежедневных и ежемесячных колебаний импульса соответственно.
На основе средних колебаний импульса мы можем рассчитать силу поддержки рынка, действительно отраженную текущей ценой, то есть порог динамического импульса без рыночного шума.
Когда цена закрытия превышает порог импульса, длинные позиции начинаются ежемесячно.
Самое большое преимущество заключается в том, что вместо того, чтобы просто преследовать цены, стратегия рассчитывает реальную силу поддержки за ценами для входов и выходов.
Кроме того, все базовые данные получены из свечей Хайкена Аши, что по своей сути помогает уменьшить проблему чрезмерной зависимости от связанных временных рамок, которая существует в других типах стратегий свечей.
Наибольший риск заключается в том, что расчеты импульса основаны исключительно на исторических ценах.
Кроме того, стратегия использует ежемесячные и ежедневные временные рамки. Это означает, что производительность в режиме реального времени не является лучшей, не имея возможности быстро реагировать на резкие изменения цен. Таким образом, существуют риски, что выходы не запускаются вовремя, когда цены внезапно поворачиваются.
Возможные способы смягчения включают в себя включение данных с более высокой частотой и обратную связь в режиме реального времени о фундаментальных принципах компании.
Есть несколько способов дальнейшего совершенствования стратегии:
Дальнейшее улучшение самих свечей Хайкена Аши, то есть оптимизация конфигурации веса.
Включить больше временных рамок, построить экспоненциально средний механизм оценки для повышения стабильности.
Внедрение данных с более высокой частотой, таких как минутные строки, для улучшения реального времени.
Включите предупреждения о прибыли, слухи о слияниях и поглощениях в расчеты импульса, чтобы добавить основы компании.
Подумайте о добавлении механизмов получения прибыли и повторного ввода на основе дня и недели в дополнение к ежемесячным записям.
В целом, стратегия очень стабильна, при этом отслеживание импульса эффективно контролирует риски. Самое большое преимущество заключается в использовании основной силы за ценами, а не самих цен для определения истинных рыночных условий для входов и выходов. Следующим шагом является дальнейшее улучшение путем включения более частотных и более информативных данных для лучшего использования рыночных возможностей.
/*backtest start: 2023-01-12 00:00:00 end: 2024-01-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © FrancoPassuello //@version=5 strategy("Heiken Ashi ADM", overlay=true) haClose = (open + high + low + close) / 4 // prevHaOpen = line.new(na, na, na, na, width = 1) haOpen = (open[1] + close[1]) / 2 // line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1])) // line.set_xy2(prevHaOpen, bar_index, haClose[1]) [monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on) [monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on) [dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on) [dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on) get_rate_of_return(price1, price2) => return_ = (price1/price2 -1)*100 return_ m0 = get_rate_of_return(monclose, monopen) m1 = get_rate_of_return(_1monclose, _1monopen) m2 = get_rate_of_return(monclose, _2monopen) m3 = get_rate_of_return(_1monclose, _3monopen) m4 = get_rate_of_return(monclose, _4monopen) m5 = get_rate_of_return(monclose, _5monopen) m6 = get_rate_of_return(_1monclose, _6monopen) MS = (m1 + m3 + m6)/100 CS = (m0 + m2 + m5)/100 d1 = get_rate_of_return(dayclose1, _21dayopen) d2 = get_rate_of_return(dayclose1, _63dayopen) d3 = get_rate_of_return(dayclose1, _126dayopen) DS = (d1 + d2 + d3)/100 //Last (DAILY) lastd_s_avg1 = DS/3 lastd_Approximate1 = dayclose1*(1-lastd_s_avg1) last_approx1_d21 = lastd_Approximate1 / _21dayopen-1 last_approx1_d63 = lastd_Approximate1 / _63dayopen-1 last_approx1_d126 = lastd_Approximate1 / _126dayopen-1 lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3 lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2)) lastd_price = lastd_approximate2 //plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold") //Last last_s_avg1 = MS/3 last_Approximate1 = _1monclose*(1-last_s_avg1) last_approx1_m1 = last_Approximate1 / _1monopen-1 last_approx1_m3 = last_Approximate1 / _3monopen-1 last_approx1_m6 = last_Approximate1 / _6monopen-1 last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3 last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2)) last_price = last_approximate2 Scoring_price = _1monclose*(1-CS) plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold") //plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold") //Long based on month close and being the first trade of the month. var int lastClosedMonth = -1 limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth) // Long based on day close and being the first trade of the month. limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth) // Close trade based on day close DCloseLongCondition = dayclose1<lastd_approximate2 //Old standard Trading rules longCondition = _1monclose > Scoring_price MCloseLongCondition = _1monclose<Scoring_price shortCondition = CS < 0 if (longCondition) strategy.entry("Long", strategy.long) if (strategy.position_size > 0 and MCloseLongCondition) strategy.close("Long") lastClosedMonth := month(time)