Estrategia de Martingale con rango de media móvil ampliado para el comercio de acciones

El autor:¿ Qué pasa?, fecha: 2023-11-02 17:16:08
Las etiquetas:

img

Resumen general

Esta estrategia identifica tendencias ampliando el intervalo entre las medias móviles. Cuando se identifica una tendencia al alza, se construyen gradualmente posiciones largas para beneficiarse de la tendencia. Al mismo tiempo, se establecen puntos de stop loss para controlar los riesgos.

Estrategia lógica

  1. Establecer dos medias móviles, EMA1 y EMA2, con períodos ligeramente diferentes, por ejemplo, 55 y 89.

  2. Cuando el precio se rompe por encima de los MAs, se señala una tendencia al alza.

  3. Después de tomar una posición, continúa con la pirámide cuando el precio siga subiendo.

  4. Establezca un punto de stop loss por debajo de los MA. Cuando el precio cae por debajo de los MA, cierre los tramos largos para detener la pérdida. El stop loss flota con el precio de entrada.

  5. Esto permite que las posiciones de pirámide se beneficien de una tendencia, mientras se establece un stop loss para controlar los riesgos.

Análisis de ventajas

  1. El amplio rango de MA ayuda a identificar claramente las tendencias.

  2. La pirámide crea mayores rendimientos de las tendencias.

  3. El stop loss dinámico obtiene ganancias de las tendencias mientras limita las pérdidas.

  4. Adecuado para el comercio de tendencias a largo plazo.

Análisis de riesgos

  1. La tendencia debe identificarse correctamente, de lo contrario las pérdidas se aceleran.

  2. La piramidalización debe controlarse para evitar los riesgos de margen.

  3. El stop loss debe ser ajustado razonablemente, demasiado ancho puede expandir las pérdidas, demasiado apretado puede causar golpes.

  4. Se debe tener en cuenta la liquidez, los activos de baja liquidez no son adecuados.

Sugerencias para optimizar

  1. Añadir más indicadores como RSI, KD para confirmar las tendencias y evitar fallas.

  2. Optimizar los períodos de admisión en función de las características de los activos para encontrar las mejores combinaciones.

  3. Investiga modelos óptimos de pirámide para controlar los riesgos de dimensionamiento de posición.

  4. Considere la obtención de ganancias parciales para bloquear las ganancias y reducir las reducciones.

  5. Establecer un stop loss basado en la volatilidad de los activos para equilibrar la protección y evitar los golpes de arco.

Resumen de las actividades

Esta estrategia identifica tendencias con un rango MA más amplio, posiciones de pirámides para beneficiarse de las tendencias y establece un stop loss flotante para controlar los riesgos.


/*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)

Más.