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.
Dengan cara ini, ukuran posisi secara bertahap meningkat selama penurunan, dan keuntungan diambil ketika harga pulih dan mencapai tingkat mengambil keuntungan.
Langkah pengendalian risiko:
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.
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)