Strategi Kuantitatif Cross-Pair Bollinger Band

Penulis:ChaoZhang, Tarikh: 2023-12-27 14:28:21
Tag:

img

Ringkasan

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.

Logika Strategi

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.

Analisis Kelebihan

Strategi ini mempunyai kelebihan berikut:

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

  2. Mengambil pendekatan pembukaan kedudukan dalam kumpulan, yang boleh mengawal risiko perdagangan tunggal.

  3. Menambah kedudukan boleh meningkatkan potensi keuntungan melalui prinsip Martingale.

  4. Menetapkan titik keuntungan untuk mengehadkan kerugian.

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko:

  1. Indikator MACD tidak dapat meramalkan pergerakan pasaran dengan sempurna, isyarat palsu mungkin berlaku.

  2. Terdapat risiko bahawa retracement akan berkembang dengan kedudukan penuh menambah.

  3. Menetapkan titik keuntungan yang terlalu kecil boleh mengehadkan potensi keuntungan.

  4. Memerlukan untuk menetapkan peratusan modal yang munasabah untuk membuka kedudukan setiap produk untuk mengelakkan melebihi had akaun.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji parameter MACD, cari parameter yang lebih sesuai untuk produk perdagangan tertentu.

  2. Mengoptimumkan peratusan wang dan peratusan retracement untuk setiap kedudukan ditambah, mencari kombinasi parameter optimum.

  3. Uji mata keuntungan jangka panjang dan jangka pendek masing-masing untuk menentukan tahap optimum.

  4. Menilai keupayaan margin akaun, menetapkan had kedudukan maksimum yang munasabah untuk setiap produk.

  5. Tambah logik stop loss. Stop loss boleh mengawal kerugian dengan berkesan apabila perubahan pasaran yang drastik berlaku.

Ringkasan

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)

Lebih lanjut