Esta estratégia usa o golden cross e o death cross princípios de médias móveis simples para implementar posições longas e curtas para ações.
A estratégia define, em primeiro lugar, o prazo de backtesting e, em seguida, define os parâmetros de cálculo das duas médias móveis, incluindo o tipo de MA e a duração do período.
A função getMAType () calcula os valores dos dois MA. fastMA é o MA de período mais curto e slowMA é o MA de período mais longo.
A lógica central:
Quando o fastMA cruza acima do slowMA, um sinal longo é acionado.
Quando o fastMA cruza abaixo do slowMA, um sinal curto é acionado.
Por último, durante o backtesting, tomar posição longa quando se vê sinal longo e tomar posição curta quando se vê sinal curto.
Possíveis otimizações face aos riscos:
Adicionar outros indicadores técnicos para a identificação de tendências.
O valor da posição em risco deve ser calculado em função do valor da posição em risco.
Adicione indicadores de volume para evitar mercados de fenda.
Construir mecanismos de otimização de parâmetros para encontrar conjuntos de parâmetros ideais automaticamente.
A estratégia pode ser ainda melhorada nos seguintes aspectos:
Adicione estratégias de stop loss como pontos de stop loss fixos ou stop loss de trailing para controlar as perdas.
Adicionar estratégias de dimensionamento de posições, como dimensionamento fixo ou dinâmico de posições, para controlar os riscos comerciais.
Adicionar filtros combinando com outros indicadores técnicos para identificar tendências e melhorar a taxa de vitória.
Otimizar parâmetros por métodos como busca de grade e regressão linear para encontrar valores ideais.
Expandir as estratégias de entrada, como o retiro da fuga, escalar as ordens para enriquecer as táticas comerciais.
Adicione indicadores de volume para evitar mercados de fenda.
Expandir produtos para índices de ações, forex, criptomoedas etc.
Esta estratégia implementa a seleção de ações longas / curtas com base nos princípios de cruzamento de MA. A ideia da estratégia é simples e clara, amplamente usada, altamente adaptável e praticamente valiosa. Mas também tem alguns problemas de atraso e filtragem de fenda. As otimizações futuras podem se concentrar em melhorar o stop loss, otimização de parâmetros, adição de filtros etc. para torná-lo mais vantajoso.
/*backtest start: 2023-09-10 00:00:00 end: 2023-10-10 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //strategy("Golden X BF Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// MA Params ///////////// source1 = input(title="MA Source 1", defval=close) maType1 = input(title="MA Type 1", defval="sma", options=["sma", "ema", "swma", "wma"]) length1 = input(title="MA Length 1", defval=50) source2 = input(title="MA Source 2", defval=close) maType2 = input(title="MA Type 2", defval="sma", options=["sma", "ema", "swma", "wma"]) length2 = input(title="MA Length 2", defval=200) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) res ///////////// MA ///////////// fastMA = getMAType(maType1, source1, length1) slowMA = getMAType(maType2, source2, length2) long = crossover(fastMA, slowMA) short = crossunder(fastMA, slowMA) /////////////// Plotting /////////////// checkColor() => fastMA > slowMA colCheck = checkColor() ? color.lime : color.red p1 = plot(fastMA, color = colCheck, linewidth=1) p2 = plot(slowMA, color = colCheck, linewidth=1) fill(p1, p2, color = checkColor() ? color.lime : color.red) bgcolor(long ? color.lime : short ? color.red : na, transp=20) /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short)