
Strategi ini menghasilkan isyarat beli dan jual dengan membandingkan garis cepat dan garis lambat indikator MACD. Apabila menghasilkan isyarat beli, anda akan membeli dan membuka kedudukan mengikut peratusan kepentingan akaun. Kemudian anda akan menambah kedudukan pada titik penarikan tertentu. Apabila keuntungan kedudukan mencapai titik tolak yang dikonfigurasi, anda akan menjual semua kedudukan yang tidak rata.
Logik teras strategi ini adalah membandingkan persilangan MACD garis cepat dan garis perlahan untuk menentukan trend. MACD adalah perbezaan rata-rata bergerak, untuk menentukan trend dan tenaga pasaran dengan mengira perbezaan antara purata jangka pendek dan jangka panjang.
Apabila garis cepat melintasi garis perlahan, menghasilkan garpu emas, menunjukkan bahawa pasaran berada dalam trend bullish, ketika ini strategi akan membuka lebih banyak kedudukan; apabila garis cepat melintasi garis perlahan, menghasilkan garpu mati, menunjukkan trend penurunan, ketika ini strategi akan membuka posisi kosong.
Selepas membuka kedudukan, strategi akan menambah atau menutup kedudukan pada titik penarikan balik tertentu. Ini dapat meningkatkan ruang keuntungan melalui prinsip Martinegall. Apabila keuntungan kumulatif kedudukan mencapai titik tolak konfigurasi, strategi akan menjual atau membeli semua kedudukan kosong.
Strategi ini mempunyai kelebihan berikut:
Menggunakan indikator MACD untuk menentukan trend pasaran, yang merupakan indikator analisis teknikal klasik dan boleh dipercayai.
Menggunakan kaedah pembukaan kumpulan, risiko transaksi tunggal dapat dikendalikan.
Penambahan kedudukan boleh meluaskan ruang keuntungan melalui prinsip Martinegle.
Pengaturcaraan titik berhenti untuk mengehadkan kerugian
Strategi ini juga mempunyai risiko:
Penunjuk MACD tidak dapat meramalkan pergerakan pasaran dengan sempurna, dan ia mungkin memberi isyarat yang salah.
Terdapat risiko untuk menarik balik dan memperluaskan kedudukan tambahan keseluruhan. Peratusan setiap tambahan boleh disesuaikan dengan betul.
Tetapan titik penamat yang terlalu kecil boleh menyebabkan ruang keuntungan terhad. Ia boleh disesuaikan mengikut jenis yang berbeza.
Peratusan dana yang dibuka perlu disusun dengan munasabah, supaya perdagangan dalam satu jenis tidak melebihi had akaun.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Uji parameter MACD yang berbeza untuk mencari parameter yang lebih sesuai untuk jenis perdagangan tertentu.
Mengoptimumkan peratusan dana untuk setiap penambahan dan penarikan balik parameter untuk mencari kombinasi parameter yang optimum.
Uji parameter titik penangguhan operasi garis panjang dan garis pendek untuk menentukan tahap penangguhan optimum.
Menilai keupayaan akaun untuk menambah kedudukan dan menetapkan had kedudukan maksimum yang munasabah untuk satu jenis.
Menambah logik stop loss. Apabila pasaran berubah secara drastik, stop loss dapat mengawal kerugian dengan berkesan.
Strategi ini secara keseluruhan adalah strategi pengesanan trend yang tipikal. Ia menggunakan petunjuk MACD untuk menentukan arah trend pasaran, mengikuti trend dengan cara menaikkan saham secara berturut-turut, dan berhenti setelah keuntungan mencapai tahap tertentu. Strategi ini sederhana, mudah dilaksanakan, sesuai 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)