Estratégia de negociação de média móvel


Data de criação: 2023-10-30 15:53:25 última modificação: 2023-10-30 15:53:25
cópia: 3 Cliques: 611
1
focar em
1617
Seguidores

Estratégia de negociação de média móvel

Visão geral

Esta estratégia usa o sistema de linha de equilíbrio para determinar a direção da tendência atual, fazendo mais curto-circuito de acordo com a direção da tendência. Quando a linha de equilíbrio sobe, é julgada como alta confiança em baixa, fazendo mais; Quando a linha de equilíbrio desce, é julgada como alta confiança em baixa, fazendo curto-circuito.

Princípio da estratégia

  1. Calcule uma média móvel ponderada de um determinado período (default 400 periodos) vwma como um indicador de linha média.

  2. Para determinar se a VWMA está subindo, configure um sinal de uptrend se estiver subindo; configure um sinal de downtrend se estiver caindo.

  3. Quando a tendência de alta for verdadeira, faça mais; quando a tendência de baixa for verdadeira, feche a posição.

  4. Calcule o rendimento estratégico bar_pnl e o rendimento de compra e manutenção bar_bh‬ para cada linha K.

  5. De acordo com o intervalo trimestral e anual, o rendimento estratégico de cada trimestre e ano é calculado em quarter_pnl e rendimento anual em year_pnl, e o correspondente rendimento de compra e manutenção em quarter_bh e year_bh.

  6. A tabela mostra a taxa de retorno estratégico e a taxa de retorno de compra e venda por trimestre de cada ano.

Análise de vantagens estratégicas

A estratégia baseia-se principalmente na mediana para determinar a direção da tendência do mercado, com as seguintes vantagens:

  1. A operação é simples, com indicadores de linha média para avaliar a tendência do mercado, fácil de entender e dominar.

  2. A capacidade de controle de retração é forte, acompanha a operação da tendência, e pode controlar efetivamente os prejuízos de mercados não-trend.

  3. Com menos parâmetros configuráveis, o principal é ajustar o ciclo de mediana, fácil de testar e otimizar.

  4. A utilização de tabelas para visualizar os lucros é óbvia.

  5. Adicionar a receita de compra e posse na tabela de receita para comparação, pode esclarecer a estratégia de receita incremental.

  6. A posição do formulário pode ser ajustada de forma flexível para que seja possível combiná-lo com outras estratégias.

Análise de risco estratégico

A estratégia também apresenta alguns riscos:

  1. O risco de mercado em massa, em um mercado de alta de longo prazo, pode ser um pouco menor do que a estratégia de compra e manutenção. O ciclo de linha média pode ser adequadamente ajustado para otimizar.

  2. O risco de whipsaw é maior em situações de turbulência. Pode-se considerar o aumento de condições de filtragem, como o pico anterior à ruptura, para reduzir as transações repetidas.

  3. O sistema de mediana não é adequado para a curva e pode perder o ponto de viragem da tendência. Pode-se experimentar diferentes tipos de mediana.

  4. Sem considerar o mecanismo de parada de perda, existe um risco de retirada substancial. Pode ser configurado um stop loss dinâmico ou considerar a redução da posição.

  5. No que diz respeito à otimização da tabela, pode-se considerar a adição de indicadores de risco, como o índice de sharpe e a retirada máxima.

Direção de otimização da estratégia

A estratégia pode ser melhorada em vários aspectos:

  1. Optimizar os parâmetros da linha média e ajustar o ciclo da linha média para adaptar-se a diferentes condições de mercado.

  2. Adicionar condições de filtragem, como o ponto mais alto antes da ruptura, para reduzir o whipsaw.

  3. Experimente diferentes tipos de médias, como médias móveis ponderadas, médias móveis de dois índices, etc.

  4. A paralisação pode ser definida como uma paralisação dinâmica ou uma redução de posição.

  5. Enriquecer o conteúdo da tabela, adicionar indicadores como o Sharpe Ratio e o Maximum Retraction.

  6. Combinado com outros indicadores, como o MACD, Bollinger Bands e outros, para avaliar a tendência.

  7. Optimizar a gestão de posições, ajustando as posições de acordo com a dinâmica do mercado.

  8. Teste a eficácia de diferentes padrões de funcionamento para encontrar o melhor alcance de aplicação.

Resumir

A estratégia de negociação de linha de equilíbrio é mais simples e direta, com uma operação de tendência de julgamento de linha de equilíbrio e um controle de retração mais forte, adequada para traders que seguem a tendência. Há um grande espaço para otimização, que pode ser otimizado em termos de sistema de linha de equilíbrio, mecanismo de parada de perda e gerenciamento de posição, para que a estratégia se adapte mais ao ambiente de mercado complexo. O design da tabela mostra a estratégia em comparação com a receita de compra e venda, mostrando visualmente o valor agregado da estratégia.

Código-fonte da estratégia
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Dannnnnnny

//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3)  != ceil(month(time[1])/3)
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_quarter_pnl = 0.0
cur_year_pnl  = 0.0
cur_quarter_bh = 0.0
cur_year_bh  = 0.0

// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 : 
                 (1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1 
cur_quarter_bh := new_quarter ? 0.0 : 
                 (1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl  = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

end_time = false

end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory

if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
    if (end_time[1])
        array.pop(quarter_pnl)
        array.pop(quarter_time)
        
    array.push(quarter_pnl , cur_quarter_pnl[1])
    array.push(quarter_time, time[1])
    array.push(quarter_bh , cur_quarter_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or end_time))
    if (end_time[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

// Quarterly P&L Table    
var quarterly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0 or pnl < 2 * bh
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if (end_time and enableQuarterlyTable)
    quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(quarterly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(quarterly_table, 1,  0, "Q1",  bgcolor = #cccccc)
    table.cell(quarterly_table, 2,  0, "Q2",  bgcolor = #cccccc)
    table.cell(quarterly_table, 3,  0, "Q3",  bgcolor = #cccccc)
    table.cell(quarterly_table, 4,  0, "Q4",  bgcolor = #cccccc)
    table.cell(quarterly_table, 5,  0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(quarterly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
        
    for mi = 0 to array.size(quarter_time) - 1
        m_row   = year(array.get(quarter_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = ceil(month(array.get(quarter_time, mi)) / 3)
        m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
        
        table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ?  tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)