Heiken Ashi Момент Quant Стратегия

Автор:Чао Чжан, Дата: 2024-01-19 15:29:35
Тэги:

img

Обзор

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

Логика стратегии

  1. Вычислить цены закрытия свечей Heiken Ashi в разные временные рамки, как основу для последующего анализа импульса.

  2. Вычислить процентное изменение между открытыми ценами и историческими закрытыми ценами за разные периоды, как для ежемесячных, так и для ежедневных временных рамок.

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

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

  5. Когда цена закрытия превышает порог импульса, длинные позиции начинаются ежемесячно.

Анализ плюсов

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

Кроме того, все базовые данные получены из свечей Хайкена Аши, что по своей сути помогает уменьшить проблему чрезмерной зависимости от связанных временных рамок, которая существует в других типах стратегий свечей.

Анализ рисков

Наибольший риск заключается в том, что расчеты импульса основаны исключительно на исторических ценах.

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

Возможные способы смягчения включают в себя включение данных с более высокой частотой и обратную связь в режиме реального времени о фундаментальных принципах компании.

Руководство по оптимизации

Есть несколько способов дальнейшего совершенствования стратегии:

  1. Дальнейшее улучшение самих свечей Хайкена Аши, то есть оптимизация конфигурации веса.

  2. Включить больше временных рамок, построить экспоненциально средний механизм оценки для повышения стабильности.

  3. Внедрение данных с более высокой частотой, таких как минутные строки, для улучшения реального времени.

  4. Включите предупреждения о прибыли, слухи о слияниях и поглощениях в расчеты импульса, чтобы добавить основы компании.

  5. Подумайте о добавлении механизмов получения прибыли и повторного ввода на основе дня и недели в дополнение к ежемесячным записям.

Заключение

В целом, стратегия очень стабильна, при этом отслеживание импульса эффективно контролирует риски. Самое большое преимущество заключается в использовании основной силы за ценами, а не самих цен для определения истинных рыночных условий для входов и выходов. Следующим шагом является дальнейшее улучшение путем включения более частотных и более информативных данных для лучшего использования рыночных возможностей.


/*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)

Больше