Bollinger Band Golden Cross dan Dead Cross Strategi Kuantitatif merentas Pasangan Dagangan


Tarikh penciptaan: 2023-12-27 14:28:21 Akhirnya diubah suai: 2023-12-27 14:28:21
Salin: 0 Bilangan klik: 567
1
fokus pada
1621
Pengikut

Bollinger Band Golden Cross dan Dead Cross Strategi Kuantitatif merentas Pasangan Dagangan

Gambaran keseluruhan

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.

Prinsip Strategi

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.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan indikator MACD untuk menentukan trend pasaran, yang merupakan indikator analisis teknikal klasik dan boleh dipercayai.

  2. Menggunakan kaedah pembukaan kumpulan, risiko transaksi tunggal dapat dikendalikan.

  3. Penambahan kedudukan boleh meluaskan ruang keuntungan melalui prinsip Martinegle.

  4. Pengaturcaraan titik berhenti untuk mengehadkan kerugian

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Penunjuk MACD tidak dapat meramalkan pergerakan pasaran dengan sempurna, dan ia mungkin memberi isyarat yang salah.

  2. Terdapat risiko untuk menarik balik dan memperluaskan kedudukan tambahan keseluruhan. Peratusan setiap tambahan boleh disesuaikan dengan betul.

  3. Tetapan titik penamat yang terlalu kecil boleh menyebabkan ruang keuntungan terhad. Ia boleh disesuaikan mengikut jenis yang berbeza.

  4. Peratusan dana yang dibuka perlu disusun dengan munasabah, supaya perdagangan dalam satu jenis tidak melebihi had akaun.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Uji parameter MACD yang berbeza untuk mencari parameter yang lebih sesuai untuk jenis perdagangan tertentu.

  2. Mengoptimumkan peratusan dana untuk setiap penambahan dan penarikan balik parameter untuk mencari kombinasi parameter yang optimum.

  3. Uji parameter titik penangguhan operasi garis panjang dan garis pendek untuk menentukan tahap penangguhan optimum.

  4. Menilai keupayaan akaun untuk menambah kedudukan dan menetapkan had kedudukan maksimum yang munasabah untuk satu jenis.

  5. Menambah logik stop loss. Apabila pasaran berubah secara drastik, stop loss dapat mengawal kerugian dengan berkesan.

ringkaskan

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.

Kod sumber strategi
/*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)