
Esta estratégia gera sinais de compra e venda através da comparação entre a linha rápida e a linha lenta do indicador MACD. Quando o sinal de compra é gerado, uma posição é aberta com a participação da conta em uma determinada proporção. Depois, uma posição é adicionada em um determinado ponto de retorno. Quando o lucro da posição atinge o ponto de parada configurado, a posição é vendida completamente.
A lógica central desta estratégia é comparar os cruzamentos das linhas rápida e lenta do MACD para determinar a tendência. O MACD é o diferencial de uma média móvel, que determina a tendência e a energia do mercado, calculando o diferencial entre as médias de curto e longo prazo. O cruzamento das linhas rápida e lenta é o golden fork e o dead fork.
Quando a linha rápida atravessa a linha lenta, gera um furco de ouro, indicando que o mercado está em uma tendência de baixa, quando a estratégia abre mais posições; quando a linha rápida atravessa a linha lenta, gera um furco morto, indicando uma tendência de baixa, quando a estratégia abre posições vazias.
Depois de abrir uma posição, a estratégia pode adicionar ou fechar uma posição em um determinado ponto de retirada. Isso pode aumentar a margem de lucro através do princípio de Martingale. Quando o lucro acumulado da posição atinge o ponto de parada de configuração, a estratégia vende ou compra todas as posições livres.
A estratégia tem as seguintes vantagens:
O MACD é um indicador de análise técnica clássico e confiável para determinar as tendências do mercado.
A abertura de posições em lotes permite controlar o risco de transações individuais.
A abertura de posições adicionais pode ampliar a margem de lucro através do Princípio de Martingale.
Configurar pontos de parada para limitar perdas.
A estratégia também apresenta alguns riscos:
O indicador MACD não é perfeito para prever a tendência do mercado e pode apresentar sinais errados.
Há um risco de expansão ou retirada de todas as posições adicionadas. A porcentagem de posições adicionadas pode ser adequadamente ajustada.
A configuração de ponto de parada muito pequena pode limitar o espaço de ganho. Pode ser ajustado de acordo com as diferentes variedades.
É necessário um equilíbrio razoável entre o capital aberto e a taxa de transação de cada variedade para evitar que a transação ultrapasse o limite da conta.
A estratégia pode ser melhorada em alguns aspectos:
Teste os indicadores MACD com diferentes parâmetros para encontrar os indicadores mais adequados para uma variedade de negociação específica.
Optimizar a percentagem de capital adicionado e a amplitude de retirada de cada posição para encontrar a melhor combinação de parâmetros.
Teste os parâmetros de ponto de parada de operação de linha longa e curta, separadamente, para determinar o nível de parada ideal.
Avaliar a capacidade de adição de posição da conta e estabelecer limites razoáveis de posições máximas para uma variedade.
Aumentar a lógica de stop-loss. Quando o mercado muda drasticamente, o stop-loss pode controlar os prejuízos de forma eficaz.
Esta estratégia é, em geral, uma estratégia típica de acompanhamento de tendências. Utiliza o indicador MACD para determinar a direção da tendência do mercado, seguindo a tendência de forma a aumentar a posição em lotes, parando e saindo do campo quando o lucro atinge um determinado nível. Esta estratégia é simples, prática e fácil de implementar, adequada para iniciantes em negociação quantitativa.
/*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)