Strategi perdagangan posisi long martingale dinamis berbasis grid

Penulis:ChaoZhangTanggal: 2024-03-22 15:12:33
Tag:

img

Tinjauan Strategi

Strategi ini adalah strategi trading grid posisi long Martingale berbasis grid. Ide utamanya adalah untuk menyesuaikan ukuran posisi secara dinamis berdasarkan jumlah posisi yang ada ketika harga mencapai garis grid, sambil menetapkan jumlah total posisi terbuka maksimum. Ketika harga naik dan mencapai level take profit, semua posisi panjang ditutup.

Prinsip Strategi

  1. Pembagi harga ke dalam kisi-kisi yang berjarak merata berdasarkan parameter Grid Size.
  2. Tempatkan perintah batas panjang di setiap garis grid.
  3. Ketika harga saat ini mencapai garis grid:
    • Jika jumlah posisi terbuka saat ini adalah 0, buka posisi dengan ukuran start_lot.
    • Jika jumlah posisi terbuka saat ini lebih besar dari 0 dan harga grid saat ini lebih rendah dari harga masuk sebelumnya, buka posisi panjang baru pada harga grid saat ini dengan ukuran multifaktor kali ukuran posisi sebelumnya.
  4. Jumlah maksimum posisi terbuka dikendalikan oleh parameter Max Open Orders.
  5. Setelah membuka posisi, tetapkan tingkat mengambil keuntungan pada TakeProfit poin di atas harga masuk rata-rata.
  6. Ketika harga saat ini mencapai tingkat mengambil keuntungan, tutup semua posisi panjang dan atur ulang parameter.

Dengan cara ini, ukuran posisi secara bertahap meningkat selama penurunan, dan keuntungan diambil ketika harga pulih dan mencapai tingkat mengambil keuntungan.

Keuntungan Strategi

  1. Dimensi Posisi Dinamis: Sesuaikan secara dinamis ukuran posisi untuk setiap entri berdasarkan jumlah posisi terbuka saat ini. Ini secara bertahap meningkatkan eksposur selama tren penurunan yang berkelanjutan, meningkatkan potensi keuntungan strategi.
  2. Parameter fleksibel: Grid Size, start_lot, multifactor dan parameter lainnya memungkinkan kontrol yang fleksibel atas ukuran grid, ukuran posisi awal, faktor skala posisi, dll.
  3. Risiko yang dapat dikendalikan: Parameter Max Open Orders mengontrol jumlah maksimum posisi terbuka untuk mencegah keterlibatan yang berlebihan. Pada saat yang sama, menetapkan tingkat mengambil keuntungan memungkinkan pengambilan keuntungan yang tepat waktu untuk mengendalikan penarikan.

Risiko Strategi

  1. Tidak ada stop loss: Strategi ini tidak memiliki stop loss. Jika harga terus turun, itu mungkin menghadapi risiko kerugian yang signifikan.
  2. Sensitivitas parameter: Kinerja strategi sangat sensitif terhadap parameter seperti multifactor.
  3. Volatilitas tinggi: Strategi dapat sering membuka dan menutup posisi selama kondisi pasar yang sangat volatile, yang berpotensi menimbulkan biaya slippage dan komisi tambahan.

Langkah pengendalian risiko:

  1. Dengan hati-hati mengatur parameter seperti multifactor berdasarkan toleransi risiko. Logika stop loss dapat ditambahkan ke kode jika perlu.
  2. Hati-hati backtest dan perdagangan kertas untuk memilih parameter yang tepat.
  3. Evaluasi kinerja strategi dalam kondisi pasar yang sangat volatile.Jika perlu, risiko dapat dikurangi dengan menyesuaikan parameter atau membatasi skenario penggunaan.

Arahan Optimasi

  1. Tambahkan deteksi tren: Tentukan tren berdasarkan aksi harga saat membuka posisi. Jika tren tampak menurun, hindari membuka posisi panjang baru untuk mengurangi risiko.
  2. Dinamis mengambil keuntungan: Dinamis menyesuaikan tingkat mengambil keuntungan berdasarkan tindakan harga, volatilitas dan indikator lainnya. Tingkatkan tingkat mengambil keuntungan ketika tren kuat untuk meningkatkan profitabilitas.
  3. Mengoptimalkan manajemen posisi: Saat menambahkan posisi, selain mempertimbangkan faktor skala, juga memasukkan saldo akun, eksposur saat ini, dll untuk mengontrol ukuran posisi dengan lebih tepat.
  4. Menggabungkan dengan sinyal lain: Mengintegrasikan perdagangan grid dengan deteksi tren, deteksi osilasi dan sinyal indikator lainnya untuk menilai pasar secara komprehensif dan memandu perdagangan.

Optimalisasi ini dapat meningkatkan kemampuan adaptasi strategi untuk lebih menangkap pergerakan pasar, meningkatkan potensi keuntungan dan ketahanan.Pada saat yang sama, posisi yang lebih tepat dan manajemen risiko dapat mengurangi drawdowns dan meningkatkan rasio risiko-manfaat.

Ringkasan

Strategi perdagangan posisi dinamis Martingale yang berbasis grid ini mencoba menurunkan harga pegangan rata-rata selama tren penurunan dengan secara bertahap menambahkan posisi, dan mengambil keuntungan ketika harga naik. Strategi ini menawarkan fleksibilitas yang kuat melalui pengaturan parameter. Namun, juga membawa risiko potensial yang signifikan yang membutuhkan penilaian dan kontrol yang cermat. Jika deteksi tren, pengambilan keuntungan dinamis, pengoptimalan posisi, dan fitur lainnya dapat ditambahkan, kinerja strategi dapat ditingkatkan lebih lanjut. Strategi ini mewujudkan fungsi untuk membuka dan menambahkan posisi secara otomatis ketika harga mencapai garis grid, dan menutup semua posisi secara otomatis ketika harga mencapai tingkat mengambil keuntungan. Logika keseluruhan relatif jelas, tetapi ada ruang untuk pengoptimalan. Strategi ini cocok untuk digunakan dengan hati-hati setelah mengevaluasi kondisi pasar dan parameter secara menyeluruh.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
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/
// © lagerta13
//@version=4
strategy("Grid A.", shorttitle="Grid(A)", overlay=true, format=format.price, precision=4, pyramiding = 100)

input_tf=input("15", "Started TimeFrame", 
 options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
 group="TimeFrame") 

// avg_tf=input("5", "Average TimeFrame", 
//  options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
//  group="TimeFrame")

slip_Hilo = input(3.0, "Slippage by open order", group="Strategy Settings")
start_lot = input(0.01, "Start lot", group="Strategy Settings")
start_avg = input(2, "Started average since Order #", group="Strategy Settings")
MaxTrades_Hilo = input(10, "Max Open Orders", group="Strategy Settings")
dropdown_selection = input("Only Long", "Direction", options=["Only Long", "Only Short", "Long & Short"],
 group="Strategy Settings")
type_selection = input("By Close", "Type input", options=["By Close", "By grid line"],
 group="Strategy Settings")

multifactor = input(1.5, "Multifactor", group="Strategy Settings")
precision_lot = input(2, "Number of precision", group="Strategy Settings")
take_profit = input(1, "TakeProfit", group="Strategy Settings")

// PipStep_S1 = input(30)
// PipStepX_S1 = input(1.2)
// dinamicStep = input(false, "Dinamic Step for AVG")

get_size_lot_order(number, multi, prec, avg_from, lot_from) =>
	res = lot_from
	for i = 1 to number
		if i >= avg_from
			res := round(res * multi, precision = prec)
	res

var float[] entry_levels = array.new_float(MaxTrades_Hilo + 1)

for i = 0 to MaxTrades_Hilo
    array.push(entry_levels, 0)

gridSize = input(0.5, title="Grid Size")
gridLevels = int(close / gridSize) * gridSize

var int num_open_orders = 0
var float sum_price_orders = 0
var float entry_lot = 0

buy_condition = num_open_orders < MaxTrades_Hilo and gridLevels[0]<gridLevels[1] and dropdown_selection != "Only Short"

if (buy_condition)

    if num_open_orders == 0
        lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
        sum_price_orders := sum_price_orders + gridLevels[1] * lot 

        strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 
        // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 

        array.set(entry_levels, num_open_orders, gridLevels[1])

        entry_lot := entry_lot + lot
        num_open_orders := num_open_orders + 1

    else
        if gridLevels[1] < (array.get(entry_levels, num_open_orders - 1))
            lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
            sum_price_orders := sum_price_orders + gridLevels[1] * lot 
            entry_lot := entry_lot + lot

            strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 

            // +" S:" + tostring(sum_price_orders / (entry_lot)) + " Prev:" + tostring(array.get(entry_levels, num_open_orders - 1))
            // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 
            array.set(entry_levels, num_open_orders, gridLevels[1])

            num_open_orders := num_open_orders + 1


take = sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) < high ? high : na
plotshape(take, location = location.belowbar, color = color.white)


strategy.exit("tp", comment = "TP " + tostring(num_open_orders), qty = entry_lot, limit = take_profit + (sum_price_orders / entry_lot))


if sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) <= high
    num_open_orders := 0
    sum_price_orders := 0
    entry_lot := 0
    for i = 0 to MaxTrades_Hilo
        array.set(entry_levels, i, 0)

plot(gridLevels, color=color.blue, style=plot.style_circles, linewidth=2)

 

Lebih banyak