Esta estratégia utiliza uma média móvel simples para determinar a direção da tendência e ir longo em uma tendência de alta e ir curto em uma tendência de queda para implementar a negociação de reversão.
Esta estratégia utiliza a média móvel ponderada (VWMA) para determinar a direção da tendência do mercado.
Especificamente, ele primeiro calcula o VWMA de um determinado período e, em seguida, julga se o VWMA subiu por mais de 5 dias. Se assim for, abre uma posição longa. Se o VWMA caiu por mais de 5 dias, abre uma posição curta. A condição de fechamento é quando a direção do VWMA se inverte por mais de 5 dias.
Para calcular os retornos mensais e anuais, a estratégia registra o lucro/perda de cada mês e ano.
As vantagens desta estratégia incluem:
O uso da VWMA para determinar tendências pode filtrar o ruído do mercado de forma eficaz e capturar as principais tendências.
A abertura de uma posição apenas após a confirmação da tendência pode evitar os riscos associados à inversão da tendência.
A negociação de reversão pode beneficiar tanto da tendência ascendente como da tendência descendente.
O registo de rendimentos mensais e anuais facilita a avaliação do desempenho da estratégia.
A adição de rendimentos de referência de mercado permite uma comparação direta entre estratégia e mercado.
Alguns riscos desta estratégia:
Usar o VWMA para determinar a tendência pode atrasar e perder oportunidades no início da tendência.
Abrir posição só após confirmação pode perder alguns movimentos.
A negociação de reversão deve definir o stop loss, caso contrário, a perda pode aumentar.
As flutuações significativas do mercado podem desencadear o stop loss e não ser possível manter a tendência completa.
O julgamento da inversão da tendência pode ser impreciso, aumentando as perdas.
Alguns aspectos que poderiam optimizar a estratégia:
Otimizar o parâmetro do período VWMA para melhorar a determinação da tendência.
Ajustar o número de dias para confirmar a tendência, melhorando o tempo de entrada e saída.
Adicionar estratégia de stop loss para controlar a perda de uma única negociação.
Incorporar outros indicadores para determinar reversões, melhorando a certeza.
Otimizar o dimensionamento das posições com base nas condições do mercado.
Considere o custo de negociação, defina o objetivo de lucro mínimo.
A lógica geral desta estratégia é simples e clara, usando a VWMA para determinar a direção da tendência e a reversão do comércio após a confirmação, o que pode rastrear efetivamente os movimentos do mercado.
/*backtest start: 2023-01-01 00:00:00 end: 2023-10-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", 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")// /////////////////// // MONTHLY TABLE // new_month = month(time) != month(time[1]) new_year = year(time) != year(time[1]) eq = strategy.equity bar_pnl = eq / eq[1] - 1 bar_bh = (close-close[1])/close[1] cur_month_pnl = 0.0 cur_year_pnl = 0.0 cur_month_bh = 0.0 cur_year_bh = 0.0 // Current Monthly P&L cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 cur_month_bh := new_month ? 0.0 : (1 + cur_month_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 Monthly P&Ls var month_pnl = array.new_float(0) var month_time = array.new_int(0) var month_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) last_computed = false if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory)) if (last_computed[1]) array.pop(month_pnl) array.pop(month_time) array.push(month_pnl , cur_month_pnl[1]) array.push(month_time, time[1]) array.push(month_bh , cur_month_bh[1]) if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory)) if (last_computed[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]) last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1]) // Monthly P&L Table var monthly_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 color.new(color.red, transp = 20) else if pnl < bh color.new(color.red, transp = 50) else color.new(color.red, transp = 80) if last_computed monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1) table.cell(monthly_table, 0, 0, "", bgcolor = #cccccc) table.cell(monthly_table, 1, 0, "Jan", bgcolor = #cccccc) table.cell(monthly_table, 2, 0, "Feb", bgcolor = #cccccc) table.cell(monthly_table, 3, 0, "Mar", bgcolor = #cccccc) table.cell(monthly_table, 4, 0, "Apr", bgcolor = #cccccc) table.cell(monthly_table, 5, 0, "May", bgcolor = #cccccc) table.cell(monthly_table, 6, 0, "Jun", bgcolor = #cccccc) table.cell(monthly_table, 7, 0, "Jul", bgcolor = #cccccc) table.cell(monthly_table, 8, 0, "Aug", bgcolor = #cccccc) table.cell(monthly_table, 9, 0, "Sep", bgcolor = #cccccc) table.cell(monthly_table, 10, 0, "Oct", bgcolor = #cccccc) table.cell(monthly_table, 11, 0, "Nov", bgcolor = #cccccc) table.cell(monthly_table, 12, 0, "Dec", bgcolor = #cccccc) table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999) for yi = 0 to array.size(year_pnl) - 1 table.cell(monthly_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(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color) for mi = 0 to array.size(month_time) - 1 m_row = year(array.get(month_time, mi)) - year(array.get(year_time, 0)) + 1 m_col = month(array.get(month_time, mi)) m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi)) table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)