Strategi ini menghasilkan isyarat beli dan jual dengan membandingkan persilangan garis cepat dan garis perlahan penunjuk MACD. Apabila isyarat beli dihasilkan, ia akan membuka kedudukan dengan peratusan tertentu ekuiti akaun. Posisi tambahan kemudian akan ditambah pada titik retracement tertentu. Apabila keuntungan terkumpul kedudukan mencapai titik keuntungan yang dikonfigurasi, semua kedudukan akan ditutup. Logik isyarat jual adalah sama dengan isyarat beli.
Logik teras strategi ini adalah untuk membandingkan persilangan garis cepat MACD dan garis perlahan untuk menentukan trend. MACD adalah perbezaan antara purata bergerak, dengan mengira perbezaan antara purata bergerak jangka pendek dan jangka panjang, ia menilai trend dan momentum pasaran.
Apabila garis pantas melintasi di atas garis perlahan, salib emas dihasilkan, yang menunjukkan pasaran berada dalam trend menaik, dan strategi akan membuka kedudukan panjang. Apabila garis pantas melintasi di bawah garis perlahan, salib kematian dihasilkan, yang menunjukkan trend menurun, dan strategi akan membuka kedudukan pendek.
Selepas membuka kedudukan, strategi akan menambah kedudukan panjang atau pendek yang ada pada titik retracement tertentu. Ini boleh meningkatkan potensi keuntungan melalui prinsip Martingale. Apabila keuntungan terkumpul mencapai titik keuntungan yang dikonfigurasi, strategi akan menutup semua kedudukan.
Strategi ini mempunyai kelebihan berikut:
Menggunakan penunjuk MACD untuk menentukan trend pasaran, yang merupakan penunjuk analisis teknikal klasik dan boleh dipercayai.
Mengambil pendekatan pembukaan kedudukan dalam kumpulan, yang boleh mengawal risiko perdagangan tunggal.
Menambah kedudukan boleh meningkatkan potensi keuntungan melalui prinsip Martingale.
Menetapkan titik keuntungan untuk mengehadkan kerugian.
Strategi ini juga mempunyai beberapa risiko:
Indikator MACD tidak dapat meramalkan pergerakan pasaran dengan sempurna, isyarat palsu mungkin berlaku.
Terdapat risiko bahawa retracement akan berkembang dengan kedudukan penuh menambah.
Menetapkan titik keuntungan yang terlalu kecil boleh mengehadkan potensi keuntungan.
Memerlukan untuk menetapkan peratusan modal yang munasabah untuk membuka kedudukan setiap produk untuk mengelakkan melebihi had akaun.
Strategi ini boleh dioptimumkan dalam aspek berikut:
Uji parameter MACD, cari parameter yang lebih sesuai untuk produk perdagangan tertentu.
Mengoptimumkan peratusan wang dan peratusan retracement untuk setiap kedudukan ditambah, mencari kombinasi parameter optimum.
Uji mata keuntungan jangka panjang dan jangka pendek masing-masing untuk menentukan tahap optimum.
Menilai keupayaan margin akaun, menetapkan had kedudukan maksimum yang munasabah untuk setiap produk.
Tambah logik stop loss. Stop loss boleh mengawal kerugian dengan berkesan apabila perubahan pasaran yang drastik berlaku.
Ringkasnya, ini adalah strategi trend berikut yang tipikal. Ia menggunakan penunjuk MACD untuk menentukan arah trend pasaran, mengambil pendekatan menambah kedudukan dalam batch untuk mengikuti trend, dan mengambil keuntungan apabila keuntungan terkumpul mencapai tahap tertentu. Strategi yang mudah dan praktikal ini mudah dilaksanakan dan sesuai untuk pemula perdagangan kuantitatif. Dengan mengoptimumkan parameter dan memperluaskan logika kawalan risiko, strategi boleh menjadi lebih mantap.
/*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)