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.
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.
Quando o MA rápido cruza o MA lento, indica uma tendência de alta e gera um sinal de compra.
Quando o MA rápido cruza abaixo do MA lento, indica uma tendência de baixa e gera um sinal de venda.
Ao ajustar automaticamente o comprimento das médias móveis, a estratégia adapta-se dinamicamente à tendência do mercado para acompanhar os lucros.
A estratégia é simples e clara, fácil de compreender e implementar.
Pode acompanhar eficazmente as tendências do mercado com um grande potencial de lucro.
O ajustamento dinâmico dos parâmetros adapta-se às alterações das condições do mercado.
Algoritmos MA personalizáveis aumentam a flexibilidade da estratégia.
Configuração lógica de compra e venda flexível.
O comércio frequente leva a custos de transacção mais elevados.
Os lags de MA podem perder os melhores pontos de entrada e saída durante os mercados voláteis.
O parâmetro MA inadequado e a otimização da frequência de ajuste causam falha da estratégia.
O valor da posição em risco deve ser calculado em função da posição em risco.
A inversão da tendência pode levar a enormes perdas flutuantes.
Otimizar os parâmetros de MA para uma melhor detecção de mudanças de tendência.
Adicione a lógica de stop loss para controlar a perda de uma única negociação.
Adicionar indicadores de avaliação da tendência para evitar perdas de reversão da tendência.
Melhorar a estratégia de ajustamento da MA para que seja mais inteligente e automatizada.
Adicionar módulo de otimização de parâmetros usando aprendizado de máquina.
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)