Tendência na sequência da estratégia da média móvel adaptativa

Autora:ChaoZhang, Data: 2023-10-10 15:21:45
Tags:

Resumo

Esta estratégia gera sinais de negociação baseados no cruzamento entre médias móveis rápidas e lentas, pertencentes às estratégias de tendência seguinte.

Estratégia lógica

  1. Calcule as médias móveis rápidas e lentas. o comprimento padrão MA rápido é 21, e o comprimento padrão MA lento é 34.

  2. Quando o MA rápido cruza o MA lento, indica uma tendência de alta e gera um sinal de compra.

  3. Quando o MA rápido cruza abaixo do MA lento, indica uma tendência de baixa e gera um sinal de venda.

  4. Ao ajustar automaticamente o comprimento das médias móveis, a estratégia adapta-se dinamicamente à tendência do mercado para acompanhar os lucros.

Análise das vantagens

  1. A estratégia é simples e clara, fácil de compreender e implementar.

  2. Pode acompanhar eficazmente as tendências do mercado com um grande potencial de lucro.

  3. O ajustamento dinâmico dos parâmetros adapta-se às alterações das condições do mercado.

  4. Algoritmos MA personalizáveis aumentam a flexibilidade da estratégia.

  5. Configuração lógica de compra e venda flexível.

Análise de riscos

  1. O comércio frequente leva a custos de transacção mais elevados.

  2. Os lags de MA podem perder os melhores pontos de entrada e saída durante os mercados voláteis.

  3. O parâmetro MA inadequado e a otimização da frequência de ajuste causam falha da estratégia.

  4. O valor da posição em risco deve ser calculado em função da posição em risco.

  5. A inversão da tendência pode levar a enormes perdas flutuantes.

Orientações de otimização

  1. Otimizar os parâmetros de MA para uma melhor detecção de mudanças de tendência.

  2. Adicione a lógica de stop loss para controlar a perda de uma única negociação.

  3. Adicionar indicadores de avaliação da tendência para evitar perdas de reversão da tendência.

  4. Melhorar a estratégia de ajustamento da MA para que seja mais inteligente e automatizada.

  5. Adicionar módulo de otimização de parâmetros usando aprendizado de máquina.

Resumo

A lógica da estratégia é simples e clara, gerando negócios baseados em cruzamento de MAs rápido e lento. Captura efetivamente tendências, mas tem riscos. A otimização contínua de parâmetros, a lógica de stop loss é necessária para tornar a estratégia mais robusta.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)

Mais.