Strategi Dagangan Posisi Long Martingale Dinamik Grid berasaskan Grid

Penulis:ChaoZhang, Tarikh: 2024-03-22 15:12:33
Tag:

img

Ringkasan Strategi

Strategi ini adalah strategi perdagangan grid kedudukan Martingale dinamik yang berasaskan grid. Idea utama adalah untuk menyesuaikan saiz kedudukan secara dinamik berdasarkan bilangan kedudukan yang ada apabila harga mencapai garis grid, sambil menetapkan jumlah maksimum kedudukan terbuka. Apabila harga meningkat dan mencapai tahap mengambil keuntungan, semua kedudukan panjang ditutup.

Prinsip Strategi

  1. Bahagikan harga ke dalam grid yang sama rata berdasarkan parameter Grid Size.
  2. Letakkan perintah had panjang di setiap garis grid.
  3. Apabila harga semasa mencapai garis grid:
    • Jika bilangan kedudukan terbuka semasa adalah 0, buka kedudukan dengan saiz start_lot.
    • Jika jumlah kedudukan terbuka semasa lebih besar daripada 0 dan harga grid semasa lebih rendah daripada harga kemasukan sebelumnya, buka kedudukan panjang baru pada harga grid semasa dengan saiz yang multifactor kali saiz kedudukan sebelumnya.
  4. Bilangan maksimum kedudukan terbuka dikawal oleh parameter Max Open Orders.
  5. Selepas membuka kedudukan, tetapkan tahap mengambil keuntungan pada TakeProfit mata di atas harga masuk purata.
  6. Apabila harga semasa mencapai tahap mengambil keuntungan, tutup semua kedudukan panjang dan set semula parameter.

Dengan cara ini, saiz kedudukan secara beransur-ansur meningkat semasa penurunan, dan keuntungan diambil apabila harga pulih dan mencapai tahap mengambil keuntungan.

Kelebihan Strategi

  1. Pengukuran kedudukan dinamik: Sesuaikan saiz kedudukan untuk setiap entri secara dinamik berdasarkan bilangan kedudukan terbuka semasa. Ini secara beransur-ansur meningkatkan pendedahan semasa aliran menurun yang berterusan, meningkatkan potensi keuntungan strategi.
  2. Parameter yang fleksibel: Ukuran Grid, start_lot, multifactor dan parameter lain membolehkan kawalan yang fleksibel terhadap saiz grid, saiz kedudukan awal, faktor skala kedudukan, dll.
  3. Risiko yang boleh dikawal: Parameter Max Open Orders mengawal bilangan maksimum kedudukan terbuka untuk mengelakkan pendedahan berlebihan. Pada masa yang sama, menetapkan tahap mengambil keuntungan membolehkan mengambil keuntungan tepat pada masanya untuk mengawal pengeluaran.

Risiko Strategi

  1. Tiada Stop Loss: Strategi ini tidak mempunyai Stop Loss. Jika harga terus merosot, ia mungkin menghadapi risiko kerugian yang ketara.
  2. Sensitiviti parameter: Prestasi strategi agak sensitif kepada parameter seperti multifactor.
  3. Volatiliti yang tinggi: Strategi ini mungkin sering membuka dan menutup kedudukan dalam keadaan pasaran yang sangat tidak menentu, yang berpotensi menimbulkan kos pelepasan dan komisen tambahan.

Langkah kawalan risiko:

  1. Tetapkan parameter dengan berhati-hati seperti multifactor berdasarkan toleransi risiko. Logik Stop Loss boleh ditambahkan ke kod jika perlu.
  2. Dengan teliti backtest dan perdagangan kertas untuk memilih parameter yang sesuai.
  3. Menilai prestasi strategi dalam keadaan pasaran yang sangat tidak menentu.Jika perlu, risiko boleh dikurangkan dengan menyesuaikan parameter atau menyekat senario penggunaan.

Arahan pengoptimuman

  1. Tambah pengesanan trend: Tentukan trend berdasarkan tindakan harga semasa membuka kedudukan.
  2. Mengambil keuntungan secara dinamik: Sesuaikan tahap mengambil keuntungan secara dinamik berdasarkan tindakan harga, turun naik dan penunjuk lain. Tingkatkan tahap mengambil keuntungan apabila trendnya kuat untuk meningkatkan keuntungan.
  3. Mengoptimumkan pengurusan kedudukan: Apabila menambah kedudukan, selain mempertimbangkan faktor skala, juga memasukkan baki akaun, pendedahan semasa, dll untuk mengawal saiz kedudukan dengan lebih tepat.
  4. Menggabungkan dengan isyarat lain: Mengintegrasikan perdagangan grid dengan pengesanan trend lain, pengesanan osilasi dan isyarat penunjuk lain untuk menilai pasaran secara komprehensif dan memandu perdagangan.

Pengoptimuman ini dapat meningkatkan kemampuan strategi untuk menangkap pergerakan pasaran dengan lebih baik, meningkatkan potensi keuntungan dan ketahanan.Pada masa yang sama, kedudukan yang lebih tepat dan pengurusan risiko dapat mengurangkan drawdowns dan meningkatkan nisbah risiko-balasan.

Ringkasan

Strategi perdagangan grid kedudukan dinamik Martingale yang berasaskan grid ini cuba menurunkan harga pegangan purata semasa trend menurun dengan secara beransur-ansur menambah kedudukan, dan mengambil keuntungan apabila harga meningkat. Strategi ini menawarkan fleksibiliti yang kuat melalui tetapan parameter. Walau bagaimanapun, ia juga membawa risiko berpotensi yang signifikan yang memerlukan penilaian dan kawalan yang teliti. Jika pengesanan trend, mengambil keuntungan dinamik, pengoptimuman kedudukan dan ciri lain dapat ditambah, prestasi strategi dapat ditingkatkan lagi. Strategi ini merealisasikan fungsi untuk membuka dan menambah kedudukan secara automatik apabila harga mencapai garis grid, dan menutup semua kedudukan secara automatik apabila harga mencapai tahap mengambil keuntungan. Logik keseluruhan agak jelas, tetapi terdapat ruang untuk pengoptimuman. Strategi ini sesuai untuk penggunaan berhati-hati selepas menilai keadaan dan parameter pasaran dengan teliti.


/*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 lanjut