A estratégia baseia-se em um cruzamento de média móvel rápida e média móvel lenta como um sinal de compra e venda e pertence à classe de estratégia de acompanhamento de tendências. A maximização de receita é alcançada ajustando automaticamente os parâmetros da média móvel e adaptando-se dinamicamente à tendência do mercado.
Calcule a média móvel rápida e a média móvel lenta. O parâmetro da média móvel rápida é assumido como 21, o parâmetro da média móvel lenta é assumido como 34.
Quando a linha média de movimentação rápida atravessa a linha média de movimentação lenta, indica que o mercado está em alta e emite um sinal de compra.
Quando a linha média de movimentos rápidos atravessa a linha média de movimentos lentos, a tendência é para baixo, emitindo um sinal de venda.
A função é de ajustar automaticamente os parâmetros de comprimento da linha média móvel, adaptando-a dinamicamente às tendências do mercado e seguindo as tendências para obter lucro.
As estratégias são simples, claras e fáceis de entender.
O blogueiro também conta com uma lista de blogs que podem ser usados para compartilhar informações sobre o mercado de trabalho.
Adapta-se a mudanças de cenário, ajustando os parâmetros de forma dinâmica.
Algoritmo de linha média móvel configurável para aumentar a flexibilidade da estratégia.
A aplicação é flexível, com uma lógica de compra e venda de configuração livre.
A estratégia de linha média móvel pode gerar transações frequentes e custos mais elevados.
Quando as coisas estão muito flutuantes, a média móvel fica atrasada e pode perder o melhor momento para comprar e vender.
Otimizar os parâmetros de média móvel e a frequência de ajuste é necessário, pois uma configuração incorreta pode causar falhas na estratégia.
O que é necessário é um controle rigoroso do stop loss para evitar a expansão dos prejuízos.
A tendência é de que os investidores deveriam investir mais em ações, e isso pode levar a perdas enormes.
Otimizar os parâmetros da média móvel para torná-los mais sensíveis e captar as mudanças de tendência em tempo hábil.
Aumentar a lógica de stop loss e controlar rigorosamente as perdas individuais.
Aumentar os indicadores de avaliação de tendências para evitar que a reversão de tendências cause perdas.
Otimizar a estratégia de ajuste de linha média móvel para torná-la mais inteligente e automatizada.
Adição de módulos de otimização de parâmetros, otimização automática usando métodos de aprendizado de máquina.
A estratégia é uma estratégia típica de acompanhamento de tendências. A vantagem da estratégia é que as regras de negociação são simples, fáceis de implementar e podem efetivamente capturar tendências. Mas também existe um certo risco, que requer otimizar constantemente a configuração de parâmetros e a lógica de parada de perda, para tornar a estratégia mais estável e confiável.
/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy,
// A simple strategy based on crossing Moving Averages of
// different lengths (a fast moving average and slow one)
//
strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)
//
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len = input(title = "Fast MA Length", defval = 21, type = input.integer, minval = 1, step = 1)
var _slowMA_len = input(title = "Slow MA Length", defval = 34, type = input.integer, minval = 1, step = 1)
var _ma_algo_id = input(title = "MA Algorithm", defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear = input(defval = 2020, title = "Start Year", type = input.integer, minval = 1976)
var _startMonth = input(defval = 1, title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay = input(defval = 1, title = "Start Day", type = input.integer, minval = 1, maxval = 31)
var _closeYear = input(defval = 2020, title = "Close Year", type = input.integer, minval = 1984)
var _closeMonth = input(defval = 9, title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay = input(defval = 1, title = "Close Day", type = input.integer, minval = 1, maxval = 31)
//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00) // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59) // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
(len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))
//
// -- strategy logic and calculation(s)
ma_fast = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA
//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)
//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)