Chiến lược khối xu hướng


Ngày tạo: 2023-11-06 09:20:34 sửa đổi lần cuối: 2023-11-06 09:20:34
sao chép: 1 Số nhấp chuột: 615
1
tập trung vào
1621
Người theo dõi

Chiến lược khối xu hướng

Tổng quan

Chiến lược khối xu hướng là một chiến lược giao dịch dựa trên phần trăm thay đổi giá hoặc số điểm nhảy. Nó có thể hiển thị rõ ràng xu hướng địa phương và điểm biến trên biểu đồ. Đây là một công cụ rất hữu ích để theo dõi hướng giá.

Nguyên tắc

Chiến lược này được tính toán dựa trên tỷ lệ phần trăm biến động giá hoặc sai lệch điểm nhảy (được thể hiện trong tham số sai lệch chuông chuông) và được hiển thị trên biểu đồ dưới dạng đường cong.

Mỗi hàng bao gồm các đường trung bình, đường giới hạn trên và đường giới hạn dưới:

  • Đường trung bình chuẩn bằng đường giới hạn trên hoặc dưới của hàng trước hoặc hàng tiếp theo (nếu giá thay đổi nhanh trong một khoảng thời gian, đường trung bình chuẩn của hàng hiện tại sẽ lớn hơn hoặc nhỏ hơn đường giới hạn dưới của hàng trước một số độ lệch tương đương, tùy thuộc vào hướng biến động giá). Khi bắt đầu tính toán, đường trung bình chuẩn bằng giá trị ban đầu của hàng đầu.

  • Các tham số chiết xuất chiết xuất số lượng chiết xuất xác định độ lệch theo đường giới hạn trên hoặc đường giới hạn dưới của hướng biến đổi giá, tham số chiết xuất biến đổi chiết xuất xác định độ lệch thay đổi hướng biến đổi giá.

Các quy tắc xây dựng hàng mới:

  • Nếu giá đóng cửa ≥ đường giới hạn trên và giá đóng cửa> giá mở cửa, đường giới hạn trên sẽ di chuyển dần lên, đường giới hạn dưới cũng sẽ di chuyển lên nhưng nhỏ hơn.

  • Nếu giá thấp ≤ đường giới hạn dưới và giá đóng cửa < giá mở cửa, đường giới hạn dưới sẽ di chuyển xuống dần, đường giới hạn trên cũng sẽ di chuyển xuống nhưng nhỏ hơn.

Bằng cách điều chỉnh độ lệch, bạn có thể nhìn thấy rõ ràng các xu hướng địa phương và các điểm biến đổi trên biểu đồ. Đây là một công cụ rất hữu ích để theo dõi xu hướng giá.

Phân tích lợi thế

  • Hình ảnh hiển thị xu hướng thay đổi giá, xác định rõ ràng sự hỗ trợ và kháng cự.

  • Đường cong có thể hiển thị rõ ràng mức độ đột phá và phạm vi điều chỉnh.

  • Có thể nhận ra các xu hướng có cường độ khác nhau tùy theo độ lệch của đường góc cần điều chỉnh.

  • Có thể tìm thấy sự hỗ trợ lớn hơn và phá vỡ nó.

  • Có thể dễ dàng nhìn thấy sự thay đổi nhịp điệu của giá để điều chỉnh vị trí.

Phân tích rủi ro

  • Tuy nhiên, đường cong không thể dự đoán chính xác các biến động giá tiếp theo.

  • Cần chú ý đến sự lệch trong xu hướng, có thể có sự khác biệt giữa đường cong và giá thực tế.

  • Không phải là một chiến lược riêng lẻ, mà là kết hợp các chỉ số khác để đánh giá xu hướng lớn.

  • Cần lưu ý rằng điều chỉnh tham số không đúng có thể dẫn đến giao dịch quá thường xuyên.

  • Có thể cần phải cảnh giác khi quay trở lại, không thể theo dõi một cách mù quáng.

Có thể thu nhỏ kích thước vị thế một cách thích hợp, đồng thời tham khảo các chỉ số khác để đánh giá hỗ trợ, hoạt động trong xu hướng lớn.

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

  • Bạn có thể thêm mô-đun quản lý vị trí để điều chỉnh vị trí động ở các giai đoạn khác nhau của xu hướng.

  • Có thể kết hợp với chỉ số biến động để giảm vị trí khi biến động tăng lên.

  • Bạn có thể thiết lập điểm dừng để kiểm soát tổn thất đơn lẻ theo tỷ lệ rút.

  • Có thể thêm bộ lọc để tạm dừng giao dịch khi giá bị lệch.

  • Có thể phân chia độ dốc đối góc nhiều cấp, nhận ra sự thay đổi xu hướng ở các cường độ khác nhau.

Bằng cách thay đổi động vị trí, thiết lập các điều kiện dừng và lọc, bạn có thể theo dõi xu hướng giá một cách ổn định hơn.

Tóm tắt

Chiến lược khối xu hướng sử dụng đường cong trực quan để hiển thị xu hướng giá thay đổi, có thể xác định rõ ràng mức kháng cự hỗ trợ và điểm phá vỡ. Tuy nhiên, không thể dựa vào phán đoán độc lập của đường cong, cần được hỗ trợ bởi các chỉ số khác để phân tích tổng hợp, đồng thời kiểm soát rủi ro. Đây là một công cụ hỗ trợ rất có giá trị, có thể giúp thương nhân nắm bắt tốt hơn về nhịp độ thị trường. Bằng cách tối ưu hóa, chiến lược có thể trở nên ổn định và hiệu quả hơn, có tiềm năng ứng dụng lớn.

Mã nguồn chiến lược
/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// **********************************************************************************
// This code is invented and written by @StCogitans.
// The idea presented in this code and the rights to this code belong to @StCogitans.
// © https://www.tradingview.com/u/StCogitans
//
// Description.
// Sizeblock - a price change strategy in the form of diagonal rows.
// **********************************************************************************

// STRATEGY
string NAME        = 'Sizeblock'
string ACRONYM     = 'SB'
bool OVERLAY       = true
int PYRAMIDING     = 0
string QTY_TYPE    = strategy.percent_of_equity
float QTY_VALUE    = 100
float CAPITAL      = 100
string COM_TYPE    = strategy.commission.percent
float COM_VALUE    = 0.1
bool ON_CLOSE      = false
bool BAR_MAGNIFIER = false
bool OHLC          = true
strategy(NAME, ACRONYM, OVERLAY, pyramiding=PYRAMIDING, default_qty_type=QTY_TYPE, default_qty_value=QTY_VALUE, initial_capital=CAPITAL, commission_type=COM_TYPE, commission_value=COM_VALUE, process_orders_on_close=ON_CLOSE, use_bar_magnifier=BAR_MAGNIFIER, fill_orders_on_standard_ohlc=OHLC)

// ARGUMENTS
// Datetime
DTstart  = input(timestamp("01 Jan 2000 00:00 +0000"), 'Start time', group='Datetime')
DTfinish = input(timestamp("01 Jan 2080 23:59 +0000"), 'Finish time', group='Datetime')
DTperiod = true

// Main
dev_source = input.string('Close', title='Source', options=["Close", "HighLow"], tooltip='Price data for settlement.', group='Main')
dev_type   = input.string('Percentage', title='Deviation', options=['Percentage', 'Ticks'], tooltip='The type of deviation to calculate.', group='Main')
dev_value  = input.float(1, title='Quantity', minval=0.001, step=0.01, tooltip='Quantity to be calculated.', group='Main')
dev_back   = input.float(2, title='U-turn', minval=0.001, step=0.01, tooltip='Quantity for reversal.', group='Main')
mode       = input.string('Limit', title='Positions', options=['Limit', 'Market'], tooltip='Limit or market orders.', group='Main')
direct     = input.string('All', title='Direction', options=['All', 'Buy', 'Sell'], tooltip='The type of positions to be opened.', group='Main')
swapping   = input.bool(false, title='Swapping', tooltip='Swap points to open a new position.', group='Main')

// CALCULATION SYSTEM
Assembling(s, t, v, vb) =>

    float a = open
    float b = close
    float c = s == "HighLow" ? math.round_to_mintick(high) : math.round_to_mintick(b)
    float d = s == "HighLow" ? math.round_to_mintick(low) : math.round_to_mintick(b)

    float x = math.round_to_mintick(a)
    x := nz(x[1], x)

    float _v = t == "Ticks" ? syminfo.mintick * v : v
    float _vb = t == "Ticks" ? syminfo.mintick * vb : vb

    float h = t == "Ticks" ? math.round_to_mintick(x + _v) : math.round_to_mintick(x * (1 + _v / 100))
    float l = t == "Ticks" ? math.round_to_mintick(x - _v) : math.round_to_mintick(x * (1 - _v / 100))
    h := nz(h[1], h)
    l := nz(l[1], l)

    if t == "Ticks"
    
        if c >= h and b > a
            while c >= h
            
                x := h
                h := math.round_to_mintick(h + _v)
                l := math.round_to_mintick(x - _vb)
        
        if d <= l and b < a
            while d <= l
            
                x := l
                l := math.round_to_mintick(l - _v)
                h := math.round_to_mintick(x + _vb)

    else if t == "Percentage"
    
        if c >= h and b > a
            while c >= h
        
                x := h
                h := math.round_to_mintick(h * (1 + _v / 100))
                l := math.round_to_mintick(x * (1 - _vb / 100))

        if d <= l and b < a
            while d <= l
        
                x := l
                l := math.round_to_mintick(l * (1 - _v / 100))
                h := math.round_to_mintick(x * (1 + _vb / 100))

    [x, h, l]

[lx, lh, ll] = Assembling(dev_source, dev_type, dev_value, dev_back)

// PLOT
// Lines
plot_up   = plot(lh, color=color.new(color.green, 50), style=plot.style_line, linewidth=1)
plot_main = plot(lx, color=color.new(color.silver, 50), style=plot.style_line, linewidth=1)
plot_down = plot(ll, color=color.new(color.red, 50), style=plot.style_line, linewidth=1)

// Areas
fill(plot_up, plot_main, lh, lx, color.new(color.teal, 80), color.new(color.teal, 80))
fill(plot_main, plot_down, lx, ll, color.new(color.maroon, 80), color.new(color.maroon, 80))

// TRADING
// Alert variables
int Action = -1
int PosType = -1
int OrderType = -1
float Price = -1.0

// Direction variables
bool ifBuy = direct == "All" or direct == "Buy" ? true : false
bool ifSell = direct == "All" or direct == "Sell" ? true : false

// Market entries
if (strategy.closedtrades + strategy.opentrades == 0 or mode == "Market") and DTperiod
    if ((swapping and lx < nz(lx[1], lx)) or (not swapping and lx > nz(lx[1], lx))) and ifBuy
        Action := 1
        PosType := 1
        OrderType := 1
        Price := math.round_to_mintick(close)
        strategy.entry('Long', strategy.long)
    if ((swapping and lx > nz(lx[1], lx)) or (not swapping and lx < nz(lx[1], lx))) and ifSell
        Action := 2
        PosType := 2
        OrderType := 1
        Price := math.round_to_mintick(close)
        strategy.entry('Short', strategy.short)

// Closing positions by market
if DTperiod and mode == "Market"
    if direct == "Buy" and strategy.position_size > 0
        if swapping and lx > nz(lx[1], lx)
            Action := 2
            PosType := 3
            OrderType := 1
            Price := math.round_to_mintick(close)
            strategy.close('Long', comment='Close')
        if not swapping and lx < nz(lx[1], lx)
            Action := 2
            PosType := 3
            OrderType := 1
            Price := math.round_to_mintick(close)
            strategy.close('Long', comment='Close')
    if direct == "Sell" and strategy.position_size < 0
        if swapping and lx < nz(lx[1], lx)
            Action := 1
            PosType := 3
            OrderType := 1
            Price := math.round_to_mintick(close)
            strategy.close('Short', comment='Close')
        if not swapping and lx > nz(lx[1], lx)
            Action := 1
            PosType := 3
            OrderType := 1
            Price := math.round_to_mintick(close)
            strategy.close('Short', comment='Close')

// Limit entries and exits
if swapping and DTperiod and mode == "Limit"
    if strategy.position_size < 0
        Action := 1
        PosType := 1
        OrderType := 2
        Price := ll
        if ifBuy
            strategy.entry('Long', strategy.long, limit=ll)
        else
            PosType := 3
            strategy.exit('Exit', limit=ll)
    if strategy.position_size > 0
        Action := 2
        PosType := 2
        OrderType := 2
        Price := lh
        if ifSell
            strategy.entry('Short', strategy.short, limit=lh)
        else
            PosType := 3
            strategy.exit('Exit', limit=lh)
    if strategy.closedtrades + strategy.opentrades > 0 and strategy.position_size == 0
        if ifBuy
            Action := 1
            PosType := 1
            OrderType := 2
            Price := ll
            strategy.entry('Long', strategy.long, limit=ll)
        if ifSell
            Action := 2
            PosType := 2
            OrderType := 2
            Price := lh
            strategy.entry('Short', strategy.short, limit=lh)
if not swapping and DTperiod and mode == "Limit"
    if strategy.position_size < 0
        Action := 1
        PosType := 1
        OrderType := 2
        Price := lh
        if ifBuy
            strategy.entry('Long', strategy.long, stop=lh)
        else
            PosType := 3
            strategy.exit('Exit', stop=lh)
    if strategy.position_size > 0
        Action := 2
        PosType := 2
        OrderType := 2
        Price := ll
        if ifSell
            strategy.entry('Short', strategy.short, stop=ll)
        else
            PosType := 3
            strategy.exit('Exit', stop=ll)
    if strategy.closedtrades + strategy.opentrades > 0 and strategy.position_size == 0
        if ifBuy
            Action := 1
            PosType := 1
            OrderType := 2
            Price := lh
            strategy.entry('Long', strategy.long, stop=lh)
        if ifSell
            Action := 2
            PosType := 2
            OrderType := 2
            Price := ll
            strategy.entry('Short', strategy.short, stop=ll)

// Everything is closed and canceled
if not DTperiod
    strategy.cancel_all()
    strategy.close_all(comment='Close')

// Alerts
// Convert to string variables
string Action_Txt = Action == 1 ? "Buy" : Action == 2 ? "Sell" : na
string PosType_Txt = PosType == 1 ? "Long" : PosType == 2 ? "Short" : PosType == 3 ? "Flat" : na
string OrderType_Txt = OrderType == 1 ? "Market" : OrderType == 2 ? "Limit" : na
string Price_Txt = Price > 0 ? str.tostring(Price) : na

// Output
if not (Action == nz(Action[1], Action) and Price == nz(Price[1], Price) and OrderType == nz(OrderType[1], OrderType)) and DTperiod
    alert('{"pair": "' + syminfo.ticker + '", "direction": "' + Action_Txt + '", "entertype": "' + OrderType_Txt + '", "position": "' + PosType_Txt + '", "price": "' + Price_Txt + '"}')

// *********************
// Good job, Soldier! ;>
// *********************