
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.
Calcule uma média móvel ponderada de um determinado período (default 400 periodos) vwma como um indicador de linha média.
Para determinar se a VWMA está subindo, configure um sinal de uptrend se estiver subindo; configure um sinal de downtrend se estiver caindo.
Quando a tendência de alta for verdadeira, faça mais; quando a tendência de baixa for verdadeira, feche a posição.
Calcule o rendimento estratégico bar_pnl e o rendimento de compra e manutenção bar_bh para cada linha K.
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.
A tabela mostra a taxa de retorno estratégico e a taxa de retorno de compra e venda por trimestre de cada ano.
A estratégia baseia-se principalmente na mediana para determinar a direção da tendência do mercado, com as seguintes vantagens:
A operação é simples, com indicadores de linha média para avaliar a tendência do mercado, fácil de entender e dominar.
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.
Com menos parâmetros configuráveis, o principal é ajustar o ciclo de mediana, fácil de testar e otimizar.
A utilização de tabelas para visualizar os lucros é óbvia.
Adicionar a receita de compra e posse na tabela de receita para comparação, pode esclarecer a estratégia de receita incremental.
A posição do formulário pode ser ajustada de forma flexível para que seja possível combiná-lo com outras estratégias.
A estratégia também apresenta alguns riscos:
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.
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.
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.
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.
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.
A estratégia pode ser melhorada em vários aspectos:
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.
Adicionar condições de filtragem, como o ponto mais alto antes da ruptura, para reduzir o whipsaw.
Experimente diferentes tipos de médias, como médias móveis ponderadas, médias móveis de dois índices, etc.
A paralisação pode ser definida como uma paralisação dinâmica ou uma redução de posição.
Enriquecer o conteúdo da tabela, adicionar indicadores como o Sharpe Ratio e o Maximum Retraction.
Combinado com outros indicadores, como o MACD, Bollinger Bands e outros, para avaliar a tendência.
Optimizar a gestão de posições, ajustando as posições de acordo com a dinâmica do mercado.
Teste a eficácia de diferentes padrões de funcionamento para encontrar o melhor alcance de aplicação.
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.
/*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)