Strategi ini menghasilkan sinyal beli dan jual dengan membandingkan silang garis cepat dan garis lambat indikator MACD. Ketika sinyal beli dihasilkan, itu akan membuka posisi dengan persentase tertentu dari ekuitas akun. Posisi tambahan kemudian akan ditambahkan pada titik retracement tertentu. Ketika keuntungan akumulasi posisi mencapai titik mengambil keuntungan yang dikonfigurasi, semua posisi akan ditutup. Logika untuk sinyal jual mirip dengan sinyal beli.
Logika inti dari strategi ini adalah untuk membandingkan persilangan garis cepat MACD dan garis lambat untuk menentukan tren. MACD adalah perbedaan antara rata-rata bergerak, dengan menghitung perbedaan antara rata-rata bergerak jangka pendek dan jangka panjang, ia menilai tren dan momentum pasar.
Ketika garis cepat melintasi di atas garis lambat, sebuah salib emas dihasilkan, yang menunjukkan bahwa pasar berada dalam tren naik, dan strategi akan membuka posisi panjang.
Setelah membuka posisi, strategi akan menambahkan posisi panjang atau pendek yang ada pada titik retracement tertentu. Ini dapat meningkatkan potensi keuntungan melalui prinsip Martingale. Ketika keuntungan terkumpul mencapai titik take profit yang dikonfigurasi, strategi akan menutup semua posisi.
Strategi ini memiliki keuntungan berikut:
Menggunakan indikator MACD untuk menentukan tren pasar, yang merupakan indikator analisis teknis klasik dan andal.
Mengadopsi pendekatan pembukaan posisi dalam batch, yang dapat mengendalikan risiko perdagangan tunggal.
Menambahkan posisi dapat memperluas potensi keuntungan melalui prinsip Martingale.
Mengkonfigurasi mengambil keuntungan titik untuk membatasi kerugian.
Strategi ini juga memiliki beberapa risiko:
Indikator MACD tidak dapat memprediksi pergerakan pasar dengan sempurna, sinyal palsu dapat terjadi.
Ada risiko bahwa retracement akan berkembang dengan posisi penuh menambahkan.
Menetapkan titik mengambil keuntungan terlalu kecil dapat membatasi potensi keuntungan.
Kebutuhan untuk mengkonfigurasi persentase modal yang wajar untuk membuka posisi per produk untuk menghindari melebihi batas akun.
Strategi ini dapat dioptimalkan dalam aspek berikut:
Uji parameter MACD, temukan parameter yang lebih cocok untuk produk perdagangan tertentu.
Mengoptimalkan persentase uang dan persentase retracement untuk setiap posisi yang ditambahkan, menemukan kombinasi parameter yang optimal.
Uji titik keuntungan jangka panjang dan jangka pendek masing-masing untuk menentukan tingkat optimal.
Mengevaluasi kemampuan margin akun, menetapkan batas posisi maksimum yang wajar per produk.
Tambahkan logika stop loss. Stop loss dapat secara efektif mengendalikan kerugian ketika perubahan pasar drastis terjadi.
Singkatnya, ini adalah strategi trend following yang khas. Ini menggunakan indikator MACD untuk menentukan arah tren pasar, mengambil pendekatan menambahkan posisi dalam batch untuk mengikuti tren, dan mengambil keuntungan ketika keuntungan terkumpul mencapai tingkat tertentu. Strategi sederhana dan praktis ini mudah diterapkan dan cocok untuk pemula perdagangan kuantitatif. Dengan mengoptimalkan parameter dan memperluas logika kontrol risiko, strategi dapat menjadi lebih kuat.
/*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)