
Strategi ini menghasilkan sinyal beli dan jual dengan membandingkan garis cepat dan garis lambat dari indikator MACD. Pada saat menghasilkan sinyal beli, posisi akan dibuka dengan mengambil keuntungan akun dalam proporsi tertentu. Posisi akan ditambahkan pada titik penarikan tertentu.
Logika inti dari strategi ini adalah membandingkan persilangan garis cepat dan lambat MACD untuk menilai tren. MACD adalah diferensial dari rata-rata bergerak, untuk menilai tren dan energi pasar dengan menghitung diferensial antara rata-rata jangka pendek dan jangka panjang.
Ketika garis cepat melewati garis lambat, menghasilkan garpu emas, menunjukkan bahwa pasar berada dalam tren bullish, saat ini strategi akan membuka posisi lebih banyak; ketika garis cepat melewati garis lambat, menghasilkan garpu mati, menunjukkan tren turun, saat ini strategi akan membuka posisi kosong.
Setelah membuka posisi, strategi akan menambah atau mengurangi posisi pada titik penarikan tertentu. Ini dapat meningkatkan ruang keuntungan melalui prinsip Martingale. Setelah posisi mencapai titik tolak yang dikonfigurasi, strategi akan menjual atau membeli semua posisi kosong.
Strategi ini memiliki keuntungan sebagai berikut:
Menggunakan indikator MACD untuk menilai tren pasar, ini adalah indikator analisis teknis klasik dan andal.
Menggunakan metode peluncuran saham dalam jumlah besar, Anda dapat mengendalikan risiko transaksi tunggal.
Penambahan posisi dapat memperluas ruang keuntungan melalui prinsip Martingale.
Konfigurasi Stop Stop untuk membatasi kerugian
Strategi ini juga memiliki beberapa risiko:
Indikator MACD tidak dapat memprediksi pergerakan pasar dengan sempurna, dan dapat memberikan sinyal yang salah.
Posisi yang ditambahkan pada seluruh posisi berisiko untuk ditarik kembali dan diperluas. Persentase dari setiap posisi tambahan dapat disesuaikan dengan tepat.
Penetapan titik tolak terlalu kecil dapat menyebabkan keterbatasan ruang panen. Bisa disesuaikan dengan varietas yang berbeda.
Perlu ada pertimbangan untuk mengalokasikan dana yang cukup untuk setiap varietas agar tidak melebihi batas akun.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Uji indikator MACD dengan parameter yang berbeda untuk menemukan parameter yang lebih cocok untuk jenis perdagangan tertentu.
Mengoptimalkan persentase dana yang ditambahkan dan parameter amplitudo penarikan setiap kali Anda membuka posisi untuk menemukan kombinasi parameter optimal.
Uji parameter titik tolak operasi jalur panjang dan jalur pendek secara terpisah untuk menentukan tingkat tolak optimal.
Evaluasi kemampuan akun untuk melakukan pertaruhan dan menetapkan batas posisi maksimum yang wajar untuk satu varietas.
Meningkatkan logika stop loss. Ketika pasar berubah drastis, stop loss dapat secara efektif mengendalikan kerugian.
Strategi ini secara keseluruhan adalah strategi pelacakan tren yang khas. Ini menggunakan indikator MACD untuk menentukan arah tren pasar, mengikuti tren dengan cara menaikkan posisi secara batch, dan berhenti setelah keuntungan mencapai tingkat tertentu. Strategi ini sederhana, praktis, mudah diimplementasikan, dan cocok untuk pemula perdagangan kuantitatif.
/*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)