A estratégia de negociação de cruzamento de média móvel triangular (TMA) é uma estratégia típica de análise técnica. Utiliza três linhas de média móvel de diferentes comprimentos de tempo para capturar tendências e implementar negociações de baixo risco. Quando a média móvel de curto prazo cruza a média móvel de médio prazo para cima e a média móvel de médio prazo está acima da média móvel de longo prazo, um sinal de compra é gerado. Quando a média móvel de curto prazo cruza abaixo da média móvel de médio prazo para baixo e a média móvel de médio prazo está abaixo da média móvel de longo prazo, um sinal de venda é gerado.
A estratégia TMA baseia-se principalmente em três linhas de média móvel para determinar a direção da tendência. A média móvel de curto prazo responde de forma sensível às mudanças de preços; a média móvel de médio prazo fornece um julgamento mais claro da tendência; a média móvel de longo prazo filtra o ruído do mercado e determina a direção da tendência de longo prazo.
Quando a média móvel de curto prazo cruza a média móvel de médio prazo para cima, isso indica que o preço começou a sair para cima. Neste momento, se a média móvel de médio prazo estiver acima da média móvel de longo prazo, significa que o mercado atual está em uma tendência de alta. Portanto, um sinal de compra é gerado aqui.
Ao contrário, quando a média móvel de curto prazo cruza abaixo da média móvel de médio prazo para baixo, isso indica que o preço começou a sair para baixo. Neste momento, se a média móvel de médio prazo estiver abaixo da média móvel de longo prazo, significa que o mercado atual está em uma tendência de queda. Como resultado, um sinal de venda é gerado.
Esta estratégia também define linhas de stop-loss e take-profit. Após entrar em uma negociação, os preços de stop-loss e take-profit serão calculados com base nas configurações percentuais. Se o preço tocar qualquer uma das linhas, a posição será fechada.
Sinais errados quando três MAs estão a consolidar
Solução: ajustar adequadamente os parâmetros MA para evitar sinais errados
Percentagem excessivamente agressiva de stop loss/take profit
Solução: percentagens de ajuste fino; não podem ser demasiado grandes nem demasiado pequenas
Configurações incorretas de parâmetros que conduzem a um número excessivo ou a um número reduzido de operações
Solução: Teste diferentes combinações de parâmetros para encontrar o ideal
A estratégia TMA pode ser otimizada a partir dos seguintes aspectos:
Teste diferentes combinações de tipo e comprimento para encontrar o ideal
Teste diferentes combinações de comprimento ou tipo de MA para obter melhores resultados
Adicionar outros indicadores técnicos como filtros de sinal
Adicionar indicadores como KDJ, MACD etc. para verificação multifatorial
Selecionar parâmetros com base nas características do produto
Redução dos períodos de MA para produtos voláteis; alargamento dos períodos de MA para produtos estacionários
Utilize o aprendizado de máquina para encontrar parâmetros ideais
Parâmetro automático varrendo para localizar rapidamente o ideal
A estratégia TMA Crossover é uma estratégia de tendência fácil de usar. Utiliza três MAs juntos para capturar tendências e define stop-loss / take-profit para controlar riscos, permitindo lucros estáveis.
/*backtest start: 2024-01-08 00:00:00 end: 2024-01-15 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5) // // author: Kozlod // date: 2018-03-25 // //////////// // INPUTS // //////////// ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA']) short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1) short_ma_src = input(title = "Short MA Source", defval = close) medium_ma_len = input(title = "Medium MA Length", defval = 20, minval = 2) medium_ma_src = input(title = "Medium MA Source", defval = close) long_ma_len = input(title = "Long MA Length", defval = 100, minval = 3) long_ma_src = input(title = "Long MA Source", defval = close) sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) // Set initial values to 0 short_ma = 0.0 long_ma = 0.0 medium_ma = 0.0 // Simple Moving Average (SMA) if ma_type == 'SMA' short_ma := sma(short_ma_src, short_ma_len) medium_ma := sma(medium_ma_src, medium_ma_len) long_ma := sma(long_ma_src, long_ma_len) // Exponential Moving Average (EMA) if ma_type == 'EMA' short_ma := ema(short_ma_src, short_ma_len) medium_ma := ema(medium_ma_src, medium_ma_len) long_ma := ema(long_ma_src, long_ma_len) // Weighted Moving Average (WMA) if ma_type == 'WMA' short_ma := wma(short_ma_src, short_ma_len) medium_ma := wma(medium_ma_src, medium_ma_len) long_ma := wma(long_ma_src, long_ma_len) // Hull Moving Average (HMA) if ma_type == 'HMA' short_ma := wma(2*wma(short_ma_src, short_ma_len / 2) - wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len))) medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len))) long_ma := wma(2*wma(long_ma_src, long_ma_len / 2) - wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len))) // Volume-weighted Moving Average (VWMA) if ma_type == 'VWMA' short_ma := vwma(short_ma_src, short_ma_len) medium_ma := vwma(medium_ma_src, medium_ma_len) long_ma := vwma(long_ma_src, long_ma_len) // Smoothed Moving Average (SMMA) if ma_type == 'SMMA' short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len // Double Exponential Moving Average (DEMA) if ma_type == 'DEMA' e1_short = ema(short_ma_src , short_ma_len) e1_medium = ema(medium_ma_src, medium_ma_len) e1_long = ema(long_ma_src, long_ma_len) short_ma := 2 * e1_short - ema(e1_short, short_ma_len) medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len) long_ma := 2 * e1_long - ema(e1_long, long_ma_len) ///////////// // SIGNALS // ///////////// long_signal = crossover( short_ma, medium_ma) and medium_ma > long_ma short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma // Calculate PT/SL levels // Initial values last_signal = 0 prev_tr_price = 0.0 pt_level = 0.0 sl_level = 0.0 // Calculate previous trade price prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na // Calculate SL/PT levels pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na // Calculate if price hit sl/pt long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level // What is last active trade? last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1]) ////////////// // PLOTTING // ////////////// // Plot MAs plot(short_ma, color = red, linewidth = 2) plot(medium_ma, color = green, linewidth = 2) plot(long_ma, color = yellow, linewidth = 2) // Plot Levels plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small) plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small) plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small) ////////////// // STRATEGY // ////////////// strategy.entry("long", true, when = long_signal) strategy.entry("short", false, when = short_signal) strategy.close("long", when = long_hit_pt or long_hit_sl) strategy.close("short", when = short_hit_pt or short_hit_sl)