Chiến lược DCA để tăng vị thế với khối lượng giao dịch


Ngày tạo: 2023-09-21 10:41:52 sửa đổi lần cuối: 2023-09-21 10:41:52
sao chép: 0 Số nhấp chuột: 806
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này kết hợp các chỉ số phạm vi với các chiến lược của robot DCA, sử dụng các tham số của robot DCA để đặt hàng khi các chỉ số phạm vi phát ra tín hiệu. Chiến lược này cố gắng kiếm lợi nhuận từ việc theo đuổi xu hướng với chi phí thấp hơn.

Nguyên tắc chiến lược

  1. Sử dụng các chỉ số phạm vi để đánh giá
  2. Tiếp theo, các nhà đầu tư sẽ tăng thêm tiền vào khi phá vỡ, sau đó tăng thêm tiền khi giảm giá.
  3. Tính toán các tham số của DCA Robot bao gồm giá, số lượng, số lượng tối đa của các lệnh an toàn.
  4. Đặt cược khi giá kích hoạt giá lệnh an toàn
  5. Ngưng khi đạt mục tiêu lợi nhuận hoặc vượt quá lệnh an toàn tối đa

Cụ thể, chiến lược này kết hợp phân tích năng lượng định lượng của chỉ số phạm vi và cơ chế đặt cược của robot DCA. Khi số lượng vượt quá mức cao gần đây, nó sẽ tạo ra nhiều tín hiệu và tham gia, sau đó đặt cược khi giá giảm theo tham số DCA cho mỗi giá đặt hàng an toàn. Chiến lược có thể theo dõi xu hướng, nhưng có giới hạn dừng lỗ.

Phân tích lợi thế

  1. Kết hợp các chỉ số phạm vi với khả năng phán đoán, tăng độ chính xác nhập cảnh
  2. Cơ chế gia tăng có thể theo dõi xu hướng với chi phí thấp
  3. Các tham số DCA có thể được cấu hình linh hoạt để phù hợp với môi trường thị trường
  4. Có hệ thống ngăn chặn và ngăn chặn rủi ro

Phân tích rủi ro

  1. Số lượng có thể đánh giá rủi ro thất bại, có thể đi sai hướng
  2. Lưu trữ quá nhiều DCA gây rủi ro, chi phí và rủi ro
  3. Cần điều chỉnh các tham số DCA một cách kịp thời, nếu không có thể không hiệu quả
  4. Cài đặt vị trí dừng lỗ không chính xác có thể mở rộng tổn thất đơn lẻ

Có thể giảm rủi ro bằng cách tối ưu hóa cấu hình tham số, giới thiệu bộ lọc xu hướng và các phương pháp khác.

Hướng tối ưu hóa

  1. Kiểm tra sự kết hợp các tham số số lượng khác nhau để tìm ra tham số tốt nhất
  2. Tối ưu hóa các tham số DCA cho các giống và chu kỳ khác nhau
  3. Thêm lệnh dừng di động theo dõi thay đổi giá theo thời gian thực
  4. Thêm điều kiện tái nhập học khi xu hướng tăng lên
  5. Đánh giá xu hướng lọc để tránh nhầm hướng nhập cảnh
  6. So sánh các thuật toán dừng lỗ khác nhau để tìm ra cấu hình tối ưu

Tóm tắt

Chiến lược này kết hợp phạm vi với cơ chế DCA để tăng cường tín hiệu vào thị trường bằng lượng và gia tăng rủi ro theo xu hướng với chi phí thấp. Ưu điểm là hiệu quả sử dụng vốn cao, có thể cấu hình mạnh mẽ; Nhược điểm là phụ thuộc nhiều vào tối ưu hóa tham số.

Mã nguồn chiến lược
/*backtest
start: 2022-09-20 00:00:00
end: 2023-09-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_8",500]]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Ranged Volume DCA Strategy - R3c0nTrader ver 2022-04-19
// For backtesting with 3Commas DCA Bot settings
// Thank you "EvoCrypto" for granting me permission to use "Ranged Volume" to create this strategy
// Thank you "junyou0424" for granting me permission to use "DCA Bot with SuperTrend Emulator" which I used for adding bot inputs, calculations, and strategy
//@version=5
strategy("Ranged Volume DCA Strategy - R3c0nTrader", shorttitle="Ranged Vol DCA Strategy", format=format.volume, overlay=true, pyramiding=999, default_qty_type=strategy.cash, initial_capital=50000, commission_value=0.0)

// INPUTS {
// Start and End Dates
i_startTime = input(defval=timestamp('01 Jan 2015 00:00 +0000'), title='Start Time')
i_endTime = input(defval=timestamp('31 Dec 2050 23:59 +0000'), title='End Time')
inDateRange = true

//Ranged Volume Settings
Range_Length    =   input.int(5,        title="Volume Range Length",                       minval=1)

Heikin_Ashi     =   input(true,     title="Heikin Ashi  (Try toggling for different results)")
Display_Bars    =   input(true,     title="Show Bar Colors")
Display_Break   =   input(true,     title="Show Break-Out")
Display_Range   =   input(true,     title="Show Range")

truncate(number, decimals) =>
    factor = math.pow(10, decimals)
    int(number * factor) / factor

// Strategy Inputs
//sourceInput = input.source(close, "Source")
sourceInput = close
price_deviation = input.float(6.0, title='Price deviation to open safety orders (%)', step=0.25, minval=0.0) / 100
take_profit = input.float(22.0, title='Target Take Profit (%)', step=0.5, minval=0.0) / 100
trailing = input.float(0.0, title='Trailing deviation. Default= 0.0 (%)', step=0.5, minval=0.0) / 100
base_order = input(100.0, title='Base order')
safe_order = input(500.0, title='Safety order')
safe_order_volume_scale = input.float(2.0, step=0.5, title='Safety order volume scale')
safe_order_step_scale = input.float(1.4, step=0.1, title='Safety order step scale')
max_safe_order = input(5, title='Max safety orders')

var current_so = 0
var initial_order = 0.0
var previous_high_value = 0.0
var original_ttp_value = 0.0
// Calculate our key levels
take_profit_level = strategy.position_avg_price * (1 + take_profit)

// }


// SETTINGS {
Close = Heikin_Ashi ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) : close
//Close = Heikin_Ashi ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) : sourceInput
Open = Heikin_Ashi ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open) : open


Positive        =    volume
Negative        =   -volume

Highest         =   ta.highest(volume, Range_Length)
Lowest          =   ta.lowest(-volume, Range_Length)

Up              =   Highest > Highest[1] and Close > Open
Dn              =   Highest > Highest[1] and Close < Open

Volume_Color = 
 Display_Break and Up ? color.new(#ffeb3b, 20) : 
 Display_Break and Dn ? color.new(#f44336, 20) : 
 Close > Open ? color.new(#00c0ff, 20) : 
 Close < Open ? color.new(#0001f6, 20) : na
// }

//Plot bar color for volume range indicator
barcolor(Volume_Color, title='Ranged Volume Bar Coloring: (You must disable bar coloring in any studies you added or this may not work properly)')
//barcolor(Display_Bars ? Volume_Color : na)

//

// First Position
if strategy.position_size == 0 and sourceInput > 0 and (Up) and inDateRange
    strategy.entry('Long @' + str.tostring(sourceInput)+'💎✋🤚', strategy.long, qty=base_order / sourceInput)
    initial_order := sourceInput
    current_so := 1
    previous_high_value := 0.0
    original_ttp_value := 0
    original_ttp_value

threshold = 0.0

if safe_order_step_scale == 1.0
    threshold := initial_order - initial_order * price_deviation * safe_order_step_scale * current_so
    threshold

else if current_so <= max_safe_order
    threshold := initial_order - initial_order * ((price_deviation * math.pow(safe_order_step_scale, current_so) - price_deviation) / (safe_order_step_scale - 1))
    threshold

else if current_so > max_safe_order
    threshold := initial_order - initial_order * ((price_deviation * math.pow(safe_order_step_scale, max_safe_order) - price_deviation) / (safe_order_step_scale - 1))
    threshold
    

// Average Down
if current_so > 0 and sourceInput <= threshold and current_so <= max_safe_order and previous_high_value == 0.0
    strategy.entry('😨🙏 SO ' + str.tostring(current_so) + '@' + str.tostring(sourceInput), direction=strategy.long, qty=safe_order * math.pow(safe_order_volume_scale, current_so - 1) / sourceInput)
    current_so += 1
    current_so

// Take Profit!
if take_profit_level <= sourceInput and strategy.position_size > 0 or previous_high_value > 0.0
    if trailing > 0.0
        if previous_high_value > 0.0
            if sourceInput >= previous_high_value
                previous_high_value := sourceInput
                previous_high_value
            else
                previous_high_percent = (previous_high_value - original_ttp_value) * 1.0 / original_ttp_value
                current_high_percent = (sourceInput - original_ttp_value) * 1.0 / original_ttp_value
                if previous_high_percent - current_high_percent >= trailing
                    strategy.close_all(comment='Close (trailing) @' + str.tostring(truncate(current_high_percent * 100, 3)) + '%')
                    current_so := 0
                    previous_high_value := 0
                    original_ttp_value := 0
                    original_ttp_value
        else
            previous_high_value := sourceInput
            original_ttp_value := sourceInput
            original_ttp_value
    else
        strategy.close_all(comment='💰 Close @' + str.tostring(sourceInput))
        current_so := 0
        previous_high_value := 0
        original_ttp_value := 0
        original_ttp_value

// Plot TP
plot(strategy.position_size > 0 ? take_profit_level : na, style=plot.style_linebr, color=color.green, linewidth=2, title="Take Profit")

// Plot All Safety Order lines except for last one as bright blue
plot(strategy.position_size > 0 and current_so <= max_safe_order and current_so > 0 ? threshold : na, style=plot.style_linebr, color=color.new(#00ffff,0), linewidth=2, title="Safety Order")

// Plot Last Safety Order Line as Red
plot(strategy.position_size > 0 and current_so > max_safe_order ? threshold : na, style=plot.style_linebr, color=color.red, linewidth=2, title="No Safety Orders Left")

// Plot Average Position Price Line as Orange
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.orange, linewidth=2, title="Avg Position Price")

// Fill TP Area and SO Area
h1 = plot(strategy.position_avg_price, color=color.new(#000000,100), title="Avg Price Plot Area", display=display.none, editable=false)
h2 = plot(take_profit_level, color=color.new(#000000,100), title="Take Profit Plot Area", display=display.none, editable=false)
h3 = plot(threshold, color=color.new(#000000,100), title="SO Plot Area", display=display.none, editable=false)

// TP Area
fill(h1,h2,color=color.new(#38761d,70), title="Take Profit Plot Area")
// Current SO Area
fill(h1,h3,color=color.new(#3d85c6,70), title="SO Plot Area")