Strategi Kuantitatif Cross-Pair Bollinger Band

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

img

Gambaran umum

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 Strategi

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.

Analisis Keuntungan

Strategi ini memiliki keuntungan berikut:

  1. Menggunakan indikator MACD untuk menentukan tren pasar, yang merupakan indikator analisis teknis klasik dan andal.

  2. Mengadopsi pendekatan pembukaan posisi dalam batch, yang dapat mengendalikan risiko perdagangan tunggal.

  3. Menambahkan posisi dapat memperluas potensi keuntungan melalui prinsip Martingale.

  4. Mengkonfigurasi mengambil keuntungan titik untuk membatasi kerugian.

Analisis Risiko

Strategi ini juga memiliki beberapa risiko:

  1. Indikator MACD tidak dapat memprediksi pergerakan pasar dengan sempurna, sinyal palsu dapat terjadi.

  2. Ada risiko bahwa retracement akan berkembang dengan posisi penuh menambahkan.

  3. Menetapkan titik mengambil keuntungan terlalu kecil dapat membatasi potensi keuntungan.

  4. Kebutuhan untuk mengkonfigurasi persentase modal yang wajar untuk membuka posisi per produk untuk menghindari melebihi batas akun.

Arahan Optimasi

Strategi ini dapat dioptimalkan dalam aspek berikut:

  1. Uji parameter MACD, temukan parameter yang lebih cocok untuk produk perdagangan tertentu.

  2. Mengoptimalkan persentase uang dan persentase retracement untuk setiap posisi yang ditambahkan, menemukan kombinasi parameter yang optimal.

  3. Uji titik keuntungan jangka panjang dan jangka pendek masing-masing untuk menentukan tingkat optimal.

  4. Mengevaluasi kemampuan margin akun, menetapkan batas posisi maksimum yang wajar per produk.

  5. Tambahkan logika stop loss. Stop loss dapat secara efektif mengendalikan kerugian ketika perubahan pasar drastis terjadi.

Ringkasan

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)

Lebih banyak