Estratégia de negociação para quando o preço ultrapassa a média móvel


Data de criação: 2023-12-15 16:28:12 última modificação: 2023-12-15 16:28:12
cópia: 0 Cliques: 575
1
focar em
1621
Seguidores

Estratégia de negociação para quando o preço ultrapassa a média móvel

Visão geral

A estratégia de negociação de dupla direção de preço de ruptura de média móvel de tempo é uma estratégia de negociação quantitativa que utiliza a ruptura de preço de média para determinar o momento de compra e venda. A estratégia usa o preço para comparar com a média móvel de um determinado período, para produzir uma negociação de acordo com o preço de subir ou descer a média.

Princípio da estratégia

A lógica central da estratégia é:

  1. Utilize a função EMA para calcular a média móvel de um período especificado (por exemplo, 200 dias).

  2. Comparar a relação entre o preço de fechamento e a magnitude da EMA para determinar se o preço quebrou a EMA. Concretamente, quando o preço de fechamento do dia é maior do que a EMA, o preço é considerado acima da EMA; quando o preço de fechamento do dia é menor do que a EMA, o preço é considerado abaixo da EMA.

  3. Quando o preço está acima do EMA, gera um sinal de compra; quando o preço está abaixo do EMA, gera um sinal de venda.

  4. Ao gerar o sinal, faça um pedido em uma proporção determinada (como o estoque total) e depois defina o preço de stop loss e stop loss.

  5. Quando o preço atingir o preço de stop loss ou stop loss, apague a posição.

  6. O ciclo é assim, aproveitando a oportunidade de quebrar a linha média para lucrar.

A estratégia é simples, direta, fácil de entender e implementar. A melhor puntualidade é obtida por meio da captura de sinais de ruptura em linhas curtas. Mas há também um certo atraso e o risco de múltiplos tremores.

Vantagens estratégicas

  • A lógica da estratégia é simples, clara, fácil de entender e verificar.
  • A utilização de características de linha média, com uma certa capacidade de acompanhamento de tendências.
  • O número de transações é elevado, o que permite operações de linha curta.
  • A partir de agora, a empresa pode responder rapidamente às mudanças de preços e aproveitar as melhores oportunidades.

Risco estratégico

  • O preço do petróleo, por sua vez, está muito mais baixo do que o preço do petróleo, mas o preço do petróleo está muito mais baixo do que o preço do petróleo.
  • O problema é que, quando há várias rupturas de tremores, as transações podem ser frequentes.
  • A inversão é muito grande, mas pode ser compensada.

Pode ser otimizado por meio de ajustes de parâmetros, como ajustes de parâmetros de linha média, uso de indicadores de julgamento mais eficientes, redução da frequência de negociação e outros métodos. Também pode ser configurado um stop loss adaptativo ou introduzir condições de filtragem para controlar o risco.

Direção de otimização da estratégia

  • Experimente diferentes tipos e parâmetros de medianas para encontrar soluções mais favoráveis, como EMA, SMA, LWMA, etc.
  • Aumentar as condições de filtragem para evitar transações com várias convulsões. Introduzir julgamentos auxiliares, como volume de transação, linha de Brin, ATR.
  • Otimizar e testar estratégias de suspensão de perdas para reduzir o risco.
  • A ideia é criar um sistema de negociação integrado, combinando várias estratégias, como tendências e reversões.
  • Aumentar a configuração de parâmetros para tornar a estratégia mais universal.

Resumir

A estratégia geral é simples e intuitiva, e a idéia central é seguir a linha média para capturar brechas de curto prazo nos preços. A vantagem é a agilidade de reação e a facilidade de implementação; A desvantagem é a lagarda e a lentitude.

Código-fonte da estratégia
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 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/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='RF - B&S Signals', initial_capital=1000, currency=currency.GBP, default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, overlay=true)


i_startTime = input(defval=timestamp('01 Jan 2020 12:00 +0000'), title='Backtest Start')
i_endTime = input(defval=timestamp('01 Jan 2024 12:00 +0000'), title='Backtest End')

inDateRange     = true
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

    // Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC
    rng_size

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close,emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)

if  inDateRange and close>ema
    strategy.entry("Long", strategy.long, when=longCondition)
    
if   inDateRange and close<ema
    strategy.entry("Short", strategy.short, when=shortCondition)


plot(ema)




//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')

if strategy.position_size > 0
    strategy.exit(id='Long', stop=longStopPrice, limit=longTakePrice)

if strategy.position_size < 0
    strategy.exit(id='Short', stop=shortStopPrice, limit=shortTakePrice)