Estratégia de Martingale com gama de média móvel alargada para negociação de ações

Autora:ChaoZhang, Data: 2023-11-02 17:16:08
Tags:

img

Resumo

Esta estratégia identifica tendências ampliando o intervalo entre as médias móveis. Quando uma tendência ascendente é identificada, é gradualmente construída posições longas para lucrar com a tendência. Ao mesmo tempo, pontos de stop loss são definidos para controlar os riscos.

Estratégia lógica

  1. Estabelecer duas médias móveis, EMA1 e EMA2, com períodos ligeiramente diferentes, por exemplo, 55 e 89.

  2. Quando o preço ultrapassa os MAs, indica uma tendência ascendente. As posições longas podem então ser gradualmente construídas.

  3. Depois de tomar uma posição, continue a piramidagem quando o preço continuar a subir. Isso permite maiores lucros da tendência.

  4. Configure um ponto de stop loss abaixo dos MA. Quando o preço cair abaixo do MA, feche longs para parar a perda. O stop loss flutua com o preço de entrada.

  5. Isto permite que as posições de pirâmide lucrem com uma tendência, ao mesmo tempo que definem um stop loss para controlar os riscos.

Análise das vantagens

  1. A gama mais ampla de MA ajuda a identificar claramente as tendências.

  2. A pirâmide cria maiores retornos das tendências.

  3. O stop loss dinâmico obtém lucros das tendências, limitando as perdas.

  4. Adequado para negociação de tendências de longo prazo.

Análise de riscos

  1. A tendência deve ser corretamente identificada, caso contrário as perdas aceleram.

  2. A piramidagem deve ser controlada para evitar riscos de chamada de margem.

  3. O stop loss deve ser ajustado razoavelmente, muito largo pode expandir as perdas, muito apertado pode causar batidas.

  4. A liquidez deve ser considerada, os activos de baixa liquidez não são adequados.

Sugestões de otimização

  1. Adicione mais indicadores como RSI, KD para confirmar tendências e evitar falhas.

  2. Otimizar os períodos de MA com base nas características dos ativos para encontrar as melhores combinações.

  3. Pesquisar modelos de pirâmide ideais para controlar os riscos de dimensionamento de posição.

  4. Considere a tomada parcial de lucro para bloquear os ganhos e reduzir os drawdowns.

  5. Estabelecer um stop loss baseado na volatilidade dos ativos para equilibrar a proteção e evitar falhas.

Resumo

Esta estratégia identifica tendências com um intervalo MA mais amplo, posições de pirâmide para lucrar com as tendências e define um stop loss flutuante para controlar os riscos.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title='Super Simple Martingale Buying', shorttitle="Martingale v5",overlay=true, pyramiding = 10, initial_capital=1, calc_on_order_fills = true)


// Revision:        1
// Author:          @ToS_MavericK

// === INPUT SMA ===
EMA1  = input(55)
EMA2  = input(89)

Amount  = input(defval = 6, type = float, title = "Max open Orders", minval = 1, step = 1)
Multiplier  = input(defval = 2  , type = float, title = "Multiplier", minval = 1, step = 0.1)
BuyLvl  = input(defval = 1, type = float, title = "BuyLvl", minval = 0, step = 0.1)
Profit  = input(3)
DoubleUpLimit    = input(2)

// === INPUT BACKTEST RANGE ===
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth   = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear    = input(defval = 2019, title = "From Year", minval = 2012)
ToDay   = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear  = input(defval = 2020, title = "To Year", minval = 2012)

RSIFilter = input(false)
minRSI  = input(defval = 35,  title = "RSI", minval = 1, step = 1)
lengthRSI = input(14, minval=1)
src = input(close, title="RSI Source")

StochRSIFilter = input(false)
lengthStoch = input(14, minval=1)
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)

rsi = rsi(src, lengthRSI)
k = sma(stoch(rsi, rsi, rsi, lengthStoch), smoothK)
d = sma(k, smoothD)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// === SERIES SETUP ===
vEMA1 = ema(close, EMA1)
vEMA2 = ema(close, EMA2)

buy  =  (rsi < minRSI or RSIFilter == false) and ((crossover(k,d) and k < 20) or StochRSIFilter == false) and ((close < vEMA1 * (1 - BuyLvl/100) and vEMA1 < vEMA2) or (close < vEMA2 * (1 - BuyLvl/100) and vEMA2 < vEMA1))

BuyPrice = strategy.position_avg_price * (1 - DoubleUpLimit/50)
SellPrice = strategy.position_avg_price * (1 + Profit/(100*strategy.opentrades))

// Exit first, due to the limit orders, which can be hit on the same bar
strategy.exit("EMA1", limit = SellPrice, when = window() and strategy.opentrades > 0)
strategy.close("EMA1",when = time > finish) // close positions at the end of the specified time period

// Normal entry
strategy.entry("EMA1", strategy.long,qty = strategy.equity/ (close * pow(2,Amount - 1)), when = window() and strategy.opentrades == 0 and buy)
// Martingale
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = strategy.position_avg_price * (1 - DoubleUpLimit/100), when = window() and strategy.opentrades == 1)
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = BuyPrice, when = window() and strategy.opentrades > 1 and strategy.opentrades < Amount)

plot(vEMA1, title = 'EMA1', color = orange, linewidth = 2, style = line)
plot(vEMA2, title = 'EMA2', color = yellow, linewidth = 2, style = line)
plot(BuyPrice[1], title = 'BuyPrice', color = red, linewidth = 2, style = line)
plot(SellPrice[1], title = 'SellPrice', color = green, linewidth = 2, style = line)

Mais.