
Esta estrategia genera señales de compra y venta mediante la comparación de la línea rápida y la línea lenta del indicador MACD. Al generar una señal de compra, se abre una posición de compra en una proporción de la titularidad de la cuenta. Luego se agrega una posición en un punto de retiro específico.
La lógica central de esta estrategia es comparar el cruce de las líneas rápidas y lentas del MACD para determinar la tendencia. El MACD es el diferencial de la media móvil, que determina la tendencia y la energía del mercado mediante el cálculo de la diferencia entre las medias a corto y largo plazo. El cruce de las líneas rápidas y lentas es el horno de oro y el horno muerto.
Cuando la línea rápida atraviesa la línea lenta, se produce un tenedor dorado, lo que indica que el mercado está en una tendencia a la baja, y la estrategia abre más posiciones; cuando la línea rápida atraviesa la línea lenta, se produce un tenedor muerto, lo que indica una tendencia a la baja, y la estrategia abre posiciones a la baja.
Una vez abierta la posición, la estrategia puede aumentar o disminuir la posición en un punto de retiro específico. Esto puede aumentar el espacio de ganancia mediante el principio de Martingale. Una vez que la posición acumula ganancias y alcanza el límite de configuración, la estrategia venderá o comprará una posición llena.
La estrategia tiene las siguientes ventajas:
El MACD es un indicador clásico y fiable de análisis técnico para determinar las tendencias del mercado.
El método de apertura por lotes permite controlar el riesgo de una sola transacción.
La apertura adicional de posiciones puede ampliar el espacio de ganancias a través del principio de Martingale.
Configurar puntos de parada para limitar las pérdidas.
La estrategia también tiene ciertos riesgos:
El indicador MACD no puede predecir perfectamente el movimiento del mercado y puede dar una señal errónea.
Hay riesgo de que las posiciones agregadas a la cartera sean retiradas y ampliadas. Se puede ajustar adecuadamente el porcentaje de posiciones agregadas cada vez que se agrega.
La configuración de puntos de parada demasiado pequeños puede limitar el espacio de ganancia. Se puede ajustar según las diferentes variedades.
Se requiere una distribución razonable de la proporción de capital abierto para evitar que las transacciones de variedades individuales sobrepasen los límites de la cuenta.
Esta estrategia puede ser optimizada en los siguientes aspectos:
Prueba el indicador MACD con diferentes parámetros para encontrar el indicador más adecuado para una variedad específica de operaciones.
Optimice el porcentaje de capital para cada apertura de posición y el parámetro de amplitud de retiro para encontrar la combinación óptima de parámetros.
Prueba de los parámetros de los puntos de frenado de las líneas largas y cortas para determinar el nivel óptimo de frenado.
Evaluar la capacidad de alza de la cuenta y establecer un límite de posición máxima razonable para una sola variedad.
Aumento de la lógica de stop loss. Cuando el mercado cambia drásticamente, el stop loss puede controlar eficazmente las pérdidas.
Esta estrategia en general es una estrategia de seguimiento de tendencias típica. Utiliza el indicador MACD para determinar la dirección de la tendencia del mercado.
/*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)