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.
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.
Esta estrategia tiene las siguientes ventajas:
Utiliza el indicador MACD para determinar la tendencia del mercado, que es un indicador clásico y fiable de análisis técnico.
Adopta el enfoque de la apertura de posiciones en lotes, que puede controlar el riesgo de una operación única.
La adición a las posiciones puede ampliar el potencial de ganancia a través del principio de Martingale.
Configurar el punto de ganancia para limitar las pérdidas.
Esta estrategia también tiene algunos riesgos:
El indicador MACD no puede predecir perfectamente los movimientos del mercado, pueden ocurrir señales falsas.
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.
Si el punto de toma de ganancias es demasiado bajo, puede limitar el potencial de ganancias.
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.
Esta estrategia puede optimizarse en los siguientes aspectos:
Prueba los parámetros MACD, encuentra parámetros que se adapten mejor a productos comerciales específicos.
Optimizar el porcentaje de dinero y el porcentaje de retracement para cada posición añadida, encontrar combinaciones óptimas de parámetros.
Prueba los puntos de ganancia a largo plazo y a corto plazo respectivamente para determinar los niveles óptimos.
Evaluar la capacidad de margen de la cuenta, establecer un límite máximo razonable de posición por producto.
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.
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)