
Esta estratégia usa uma média móvel simples para determinar a direção da tendência, fazendo mais em um cenário de alta contínua, fazendo um corte em um cenário de baixa contínua, e fazendo negociações bidirecionais.
Esta estratégia usa a média móvel ponderada VWMA para determinar a direção da tendência do mercado. Quando a VWMA sobe, faça mais; quando a VWMA desce, faça menos.
Concretamente, a estratégia primeiro calcula o VWMA de um determinado período, e então julga se o VWMA subiu mais de 5 dias, se sim, abre uma posição maior; se o VWMA caiu mais de 5 dias, abre uma posição com a posição em branco. A condição para a posição em branco é a inversão da direção do VWMA após mais de 5 dias.
Para calcular o desempenho mensal e anual dos ganhos, a estratégia registra os ganhos mensais e anuais. Ao comparar a estratégia com o ganho de referência do mercado, é possível ver o desempenho da estratégia em relação ao mercado.
A estratégia tem as seguintes vantagens:
Usando o VWMA para julgar tendências, pode-se filtrar o ruído do mercado de forma eficaz, capturando as principais tendências.
O risco de uma reversão de tendência pode ser evitado abrindo uma posição somente após a confirmação da tendência.
Com a negociação bidirecional, pode-se lucrar com o aumento ou com a queda do mercado.
Registre os resultados mensais e anuais para avaliar a eficácia da estratégia.
Adicione o lucro de referência do mercado à tabela de lucros para que você possa comparar intuitivamente o desempenho relativo da estratégia com o mercado.
A estratégia também apresenta alguns riscos:
Usando o VWMA, é possível que a tendência esteja atrasada e que se perca a oportunidade de iniciar a tendência.
A partir da confirmação da tendência, é possível perder parte do Movement.
A negociação bidirecional requer um ponto de parada, caso contrário, os prejuízos podem aumentar.
As grandes flutuações do mercado podem provocar que o stop loss seja acionado e não possa manter a tendência intacta.
A inversão de tendência pode ser imprecisa e aumentar os prejuízos.
Esta estratégia pode ser melhorada em:
Otimizar os parâmetros do ciclo VWMA para melhorar o julgamento de tendências.
Ajustar o número de dias de confirmação de tendências para melhorar o tempo de entrada e saída.
Adicionar estratégias de stop loss para controlar perdas individuais.
A análise de tendências, em combinação com outros indicadores, pode ajudar a determinar a inversão de tendências e aumentar a certeza.
Optimizar a gestão de posições, ajustando as posições de acordo com as condições do mercado.
O custo de transação é considerado e o lucro mínimo é estabelecido.
A estratégia global é clara e simples, usa o VWMA para determinar a direção da tendência, e depois da confirmação da tendência, as negociações bidirecionais podem acompanhar efetivamente o movimento do mercado. Mas também há um certo risco, e é necessário testar e otimizar os parâmetros, ajustar a lógica de saída e controlar adequadamente o tamanho da posição. Esta estratégia é baseada na estratégia de negociação bidirecional e estabelece a base para negociação quantitativa.
/*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)