Estrategia cuantitativa de banda de Bollinger cruzada entre pares

El autor:¿ Qué pasa?, Fecha: 2023-12-27 14:28:21
Las etiquetas:

img

Resumen general

Esta estrategia genera señales de compra y venta al comparar el cruce de la línea rápida y la línea lenta del indicador MACD. Cuando se genera una señal de compra, se abrirá una posición con un cierto porcentaje del capital de la cuenta. Luego se agregarán posiciones adicionales en puntos de retroceso específicos. Cuando la ganancia acumulada de las posiciones alcance el punto de ganancia configurado, todas las posiciones se cerrarán. La lógica de las señales de venta es similar a las señales de compra.

Estrategia lógica

La lógica central de esta estrategia es comparar el cruce de la línea rápida y la línea lenta del MACD para determinar la tendencia.

Cuando la línea rápida cruza por encima de la línea lenta, se genera una cruz dorada, lo que indica que el mercado está en una tendencia al alza, y la estrategia abrirá posiciones largas.

Después de abrir posiciones, la estrategia se sumará a las posiciones largas o cortas existentes en puntos de retroceso específicos. Esto puede aumentar el potencial de ganancia a través del principio de Martingale. Cuando el beneficio acumulado alcanza el punto de ganancia configurado, la estrategia cerrará todas las posiciones.

Análisis de ventajas

Esta estrategia tiene las siguientes ventajas:

  1. Utiliza el indicador MACD para determinar la tendencia del mercado, que es un indicador clásico y fiable de análisis técnico.

  2. Adopta el enfoque de la apertura de posiciones en lotes, que puede controlar el riesgo de una operación única.

  3. La adición a las posiciones puede ampliar el potencial de ganancia a través del principio de Martingale.

  4. Configurar el punto de ganancia para limitar las pérdidas.

Análisis de riesgos

Esta estrategia también tiene algunos riesgos:

  1. El indicador MACD no puede predecir perfectamente los movimientos del mercado, pueden ocurrir señales falsas.

  2. El riesgo de que el retracement se expanda con la adición de la posición completa puede ajustar adecuadamente el porcentaje de cada posición añadida.

  3. Si el punto de toma de ganancias es demasiado bajo, puede limitar el potencial de ganancias.

  4. Necesidad de configurar un porcentaje razonable de capital para la apertura de posiciones por producto para evitar el exceso de los límites de cuenta.

Direcciones de optimización

Esta estrategia puede optimizarse en los siguientes aspectos:

  1. Prueba los parámetros MACD, encuentra parámetros que se adapten mejor a productos comerciales específicos.

  2. Optimizar el porcentaje de dinero y el porcentaje de retracement para cada posición añadida, encontrar combinaciones óptimas de parámetros.

  3. Prueba los puntos de ganancia a largo plazo y a corto plazo respectivamente para determinar los niveles óptimos.

  4. Evaluar la capacidad de margen de la cuenta, establecer un límite máximo razonable de posición por producto.

  5. Agregue la lógica de stop loss. El stop loss puede controlar las pérdidas de manera efectiva cuando ocurre un cambio drástico en el mercado.

Resumen de las actividades

En resumen, esta es una estrategia típica de seguimiento de tendencias. Utiliza el indicador MACD para determinar la dirección de la tendencia del mercado, toma el enfoque de agregar posiciones en lotes para seguir la tendencia y obtiene ganancias cuando el beneficio acumulado alcanza un cierto nivel. Esta estrategia simple y práctica es fácil de implementar y adecuada para principiantes en el comercio cuantitativo. Al optimizar los parámetros y ampliar la lógica de control de riesgos, la estrategia puede volverse más robusta.


/*backtest
start: 2023-11-26 00:00:00
end: 2023-12-26 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingSoft_tech

//@version=5
strategy("MAPM-V1", overlay=true, default_qty_value=10, max_bars_back=5000,default_qty_type = strategy.percent_of_equity, commission_value=0.1, initial_capital = 100, pyramiding=6, currency=currency.USD)

///////// Options
SignalFast = input.int(300, step=10)
SignalSlow = input.int(600, step=10)
StepAddPurchases = input.float(2.5, step=0.1)
VolumePurchases = input.int(6,step=1)
Buy = input(true)
Sell = input(true)
longProfitPerc = input.float(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01
shortProfitPerc = input.float(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01
Martingale = input.float(1.6, minval = 1, step = 0.1)
VolumeDepo = input.int(100, step=1)
PercentOfDepo = input.float(10, step=1)
Close = (close)
EnterVolume = VolumeDepo*PercentOfDepo*0.01/Close

///////// Calculation indicator
fastAverage = ta.ema(close, 8)
slowAverage = ta.ema(close, 49)
macd = fastAverage - slowAverage
macdSignalF = ta.ema(macd,SignalFast)
macdSignalS = ta.ema(macd,SignalSlow)

// Test Start
startYear = input(2005, "Test Start Year")
startMonth = input(1, "Test Start Month")
startDay = input(1, "Test Start Day")
startTest = timestamp(startYear,startMonth,startDay,0,0)

//Test End
endYear = input(2050, "Test End Year")
endMonth = input(12, "Test End Month")
endDay = input(30, "Test End Day")
endTest = timestamp(endYear,endMonth,endDay,23,59)

timeRange = time > startTest and time < endTest ? true : false

///////// Plot Data
//plot(macd, style = plot.style_histogram)
//plot(macdSignalF*10000, style = plot.style_line, color=color.red)
//plot(macdSignalS*10000, style = plot.style_line, color=color.blue)
//plot(fastAverage, style = plot.style_line, color=color.red)
//plot(slowAverage, style = plot.style_line, color=color.blue)

///////// Calculation of the updated value
var x = 0.0
if strategy.opentrades>strategy.opentrades[1]
    x := x + 1
else if strategy.opentrades==0
    x := 0
y = x+1

///////// Calculation of reference price data
entryPrice = strategy.opentrades==0? 0 : strategy.opentrades.entry_price(0)
limitLong = strategy.position_avg_price * (1 + longProfitPerc)
limitShort = strategy.position_avg_price * (1 - shortProfitPerc)
SteplimitLong = entryPrice[0]*(1-StepAddPurchases*y/100)
SteplimitShort = entryPrice[0]*(1+StepAddPurchases*y/100)

///////// Conditions for a long
bool EntryLong = ta.crossover(macdSignalF, macdSignalS) and Buy and strategy.opentrades==0 and strategy.position_size==0
bool PurchasesLong = Buy and strategy.opentrades==x and strategy.position_size>0 and x<=VolumePurchases
bool CancelPurchasesLong = strategy.position_size==0 and strategy.opentrades==0
bool TPLong = strategy.position_size>0 and strategy.opentrades!=0
///////// Entry Long + add.purchases + cancel purchases + Take profit Long
switch 
    EntryLong => strategy.entry("Entry Long", strategy.long, qty = EnterVolume)
    PurchasesLong => strategy.entry("PurchasesLong", strategy.long, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitLong)
    CancelPurchasesLong => strategy.cancel("PurchasesLong")
switch
    TPLong => strategy.exit("TPLong", qty_percent = 100, limit = limitLong)

///////// Conditions for a Short
bool EntryShort = ta.crossunder(macdSignalF, macdSignalS) and Sell and strategy.opentrades==0 and strategy.position_size==0
bool PurchasesShort = Sell and strategy.opentrades==x and strategy.position_size<0 and x<=VolumePurchases
bool CancelPurchasesShort = strategy.position_size==0 and strategy.opentrades==0
bool TPShort = strategy.position_size<0 and strategy.opentrades!=0

///////// Entry Short + add.purchases + cancel purchases + Take profit Short
switch
    EntryShort => strategy.entry("Entry Short", strategy.short, qty = EnterVolume)
    PurchasesShort => strategy.entry("PurchasesShort", strategy.short, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitShort)
    CancelPurchasesShort => strategy.cancel("PurchasesShort")
switch
    TPShort => strategy.exit("TPShort", qty_percent = 100, limit = limitShort)
    
/////////Calculation of conditions and reference data for level drawing
InTradeLong = strategy.position_size<0
InTradeShort = strategy.position_size>0
PickInLong = strategy.opentrades.entry_price(0)*(1-StepAddPurchases*y/100)
PickInShort = strategy.opentrades.entry_price(0)*(1+StepAddPurchases*y/100)

/////////Displaying the level of Take Profit
plot(InTradeLong ? na : limitLong, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1)
plot(InTradeShort ? na : limitShort, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1)

/////////Displaying the level of add.purchases
plot(InTradeLong ? na : PickInLong, color=color.white, style=plot.style_linebr, linewidth=1)
plot(InTradeShort ? na : PickInShort, color=color.white, style=plot.style_linebr, linewidth=1)

Más.