Chiến lược Momentum Brick

Tác giả:ChaoZhang, Ngày: 2024-02-19 15:32:17
Tags:

img

Chiến lược đánh giá sự thay đổi động lực thị trường dựa trên sự hình thành của các viên gạch mô phỏng và dài hoặc ngắn theo hướng gạch.

Chiến lược logic

Lý thuyết cốt lõi là mô phỏng sự hình thành gạch bằng cách tính toán mối quan hệ giá ATR và giá đóng. Cụ thể, hai biến Brick1 và Brick2 được xác định.

Brick1 được tính bằng cách: nếu giá đóng vượt quá giá trị trước Brick1 + ATR, Brick1 = giá trị trước Brick1 + ATR; nếu giá đóng thấp hơn Brick1 trước - ATR, Brick1 là giá trị trước Brick1 - ATR; nếu không, Brick1 thừa hưởng giá trị trước Brick1.

Brick2 được tính bằng cách: nếu Brick1 không bằng giá trị trước Brick1, thì Brick2 = Brick1 giá trị trước; nếu không, thừa hưởng giá trị trước Brick2.

Khi Brick1 tăng hơn một ATR, một viên gạch tăng lên hình thành; khi Brick1 giảm hơn một ATR, một viên gạch giảm hình thành. Brick2 chỉ ghi lại vị trí của viên gạch trước đó.

Khi Brick1 và Brick2 đi ngang, có nghĩa là gạch mở rộng lên, được đánh giá là dài. Khi Brick1 và Brick2 đi xuống ngang, có nghĩa là gạch co lại, được đánh giá là ngắn.

Ưu điểm

  1. Sử dụng ATR để xác định hình thành gạch, tránh kích thước gạch cố định, có thể thích nghi năng động với biến động thị trường
  2. Xác định sự thay đổi động lượng thông qua giao chéo của gạch
  3. Tính nhạy cảm đối với đánh giá động lực thị trường có thể được điều chỉnh bằng các chu kỳ ATR khác nhau
  4. Hình dung sự hình thành và giao thoa của gạch để xác định trực quan xu hướng thị trường

Rủi ro

  1. Lựa chọn kích thước ATR sẽ ảnh hưởng đến lợi nhuận chiến lược. ATR quá nhỏ dẫn đến quá nhiều tín hiệu không hợp lệ. ATR quá lớn gây ra quá ít gạch và mất cơ hội tiềm năng.
  2. Xu hướng thực tế có thể không tuân theo mô hình gạch.
  3. Cần phải rất nhạy cảm với chi phí giao dịch.

Các giải pháp bao gồm tối ưu hóa tham số để tìm chu kỳ ATR tối ưu, điều chỉnh chiến lược dừng lỗ lợi nhuận để giảm lỗ từ các tín hiệu không hợp lệ, tăng đúng loại giao dịch để giảm tác động chi phí đến lợi nhuận.

Tối ưu hóa

  1. Kết hợp với các chỉ số khác để lọc tín hiệu để tránh các tín hiệu không hợp lệ, ví dụ như chỉ số khối lượng và biến động
  2. Thêm lọc xu hướng, chỉ phát ra tín hiệu theo hướng xu hướng để tránh mất mát đảo ngược
  3. Sử dụng tối ưu hóa tham số mẫu đầy đủ trong thời gian thử nghiệm để tìm các tham số tối ưu tự động

Tóm lại

Chiến lược đánh giá xu hướng ngắn hạn và đà tăng trong thị trường thông qua mô phỏng động các giao dịch giao thoa gạch, với hình ảnh trực quan.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4


///Component Code Start
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2025, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)



/// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? 
   #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/// Component Code Stop


//Zack_the_Lego (original AUTHOR) made into strategy by mkonsap
strategy("Flex Renko Emulator", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
res = input(type=input.resolution, defval="D", title="Resolution of ATR")
xATR = atr(14)
//TF = x78tf ? "78" : "39"
BrickSize = security(syminfo.tickerid, res, xATR)

//Brick1 =  close >  nz(Brick1[1]) + BrickSize ? nz(Brick1[1]) + BrickSize : close <
                    //nz(Brick1[1]) - BrickSize ?
                        //nz(Brick1[1]) - BrickSize
                            //: nz(Brick1[1]))


Brick1() =>
    s1 = 0.0
    s1 := close > nz(s1[1]) + BrickSize ? nz(s1[1]) + BrickSize : 
       close < nz(s1[1]) - BrickSize ? nz(s1[1]) - BrickSize : nz(s1[1])
    s1


Brick2() =>
    s2 = 0.0
    Brick1_1 = Brick1()
    s2 := Brick1() != Brick1()[1] ? Brick1_1[1] : nz(s2[1])
    s2

colorer = Brick1() > Brick2() ? color.green : color.red
p1 = plot(Brick1(), color=colorer, linewidth=4, title="Renko")
p2 = plot(Brick2(), color=colorer, linewidth=4, title="Renko")
fill(p1, p2, color=color.purple, transp=50)




mylong = crossover(Brick1(), Brick2())
myshort = crossunder(Brick1(), Brick2())

last_long = float(na)
last_short = float(na)
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(Brick1(), Brick2())
myshort2 = crossunder(Brick1(), Brick2())

last_long2 = float(na)
last_short2 = float(na)
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0


condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossunder(condshortx, 1.9)


// === STRATEGY - LONG POSITION EXECUTION WITH CLOSE ORDERS ===
//enterLong() => crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
//exitLong()  => crossunder(condlongx, 1.9) and testPeriod() and strategy.position_size > 0
//strategy.entry(id = "Long", long = true, when = enterLong())
//strategy.close(id = "Long", when = exitLong())
// === STRATEGY - SHORT POSITION EXECUTION WITH CLOSE ORDER===
//enterShort() => crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 and Margin
//exitShort() => crossunder(condshortx, 1.9)  and testPeriod() and strategy.position_size < 0
//strategy.entry(id = "Short", long = false, when = enterShort())
//strategy.close(id = "Short", when = exitShort())   
//END


///STRATEGY ONLY LONG AND SHORT/////
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.close("Long", when=not Margin)

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when=Margin)

/////// END ////


Thêm nữa