Chiến lược xu hướng tăng liên tục của đường chéo trung bình động kép

Tác giả:ChaoZhang, Ngày: 2023-11-13 10:47:48
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch sử dụng các mô hình chéo trung bình động cùng với xu hướng tăng liên tục để tham gia giao dịch. Khi MA nhanh vượt qua trên MA chậm, một tín hiệu chéo vàng được tạo ra. Nếu xu hướng tăng tiếp tục sau khi chéo, một vị trí dài có thể được mở. Khi giá tăng lên mức dừng lỗ hoặc lấy lợi nhuận, vị trí có thể được đóng để dừng lỗ hoặc lấy lợi nhuận.

Chiến lược logic

Chiến lược này chủ yếu dựa trên đường chéo trung bình động cho các tín hiệu đầu vào. Cụ thể, MA nhanh (MA1) và MA chậm (MA2) được xác định. Khi MA1 vượt trên MA2, đó là tín hiệu mua dài.

Để tránh các tín hiệu sai từ các đường chéo ngắn hạn, một ngưỡng góc được thêm vào, do đó tín hiệu mua chỉ được kích hoạt khi góc MA2 vượt quá ngưỡng đã thiết lập.

Chiến lược này cũng thiết lập một mức dừng lỗ và lấy lợi nhuận. Đặt lỗ dừng để tránh tổn thất trong trường hợp đảo ngược thị trường đột ngột, trong khi lấy lợi nhuận khóa trong lợi nhuận. Chúng được thiết lập như một phạm vi phần trăm từ giá nhập cảnh.

Khi giá tăng để lấy điểm lợi nhuận, chiến lược sẽ đóng dài để lấy lợi nhuận. Ngoài ra, nếu tăng mạnh, chiến lược sẽ mở một vị trí ngắn để đảo ngược trung bình.

Phân tích lợi thế

Đây là một xu hướng đơn giản và trực quan theo chiến lược.

  1. MA combo lọc ra tiếng ồn thị trường và khóa theo hướng xu hướng
  2. Mức ngưỡng góc tránh bị đánh lừa bởi các dao động ngắn hạn
  3. Giao dịch hai chiều cho phép lợi nhuận từ các thị trường giới hạn phạm vi
  4. Đánh lỗ dừng và kiểm soát lợi nhuận rủi ro

Phân tích rủi ro

Có một số rủi ro cần lưu ý:

  1. Các MA có sự chậm trễ và có thể bỏ lỡ các điểm chuyển đổi
  2. Stop Loss không được đảm bảo, có thể bị thiếu sót trong thị trường nhanh
  3. Giao dịch hai cạnh tăng gấp đôi rủi ro, thời gian tham gia ngắn là chìa khóa
  4. Điều chỉnh tham số kém như thời gian MA có thể ảnh hưởng đến kết quả

Các lĩnh vực cải thiện

Một số cách để tối ưu hóa thêm chiến lược:

  1. Thêm các bộ lọc xu hướng như MACD, Bollinger để cải thiện độ chính xác
  2. Sử dụng máy học để tối ưu hóa các giai đoạn MA một cách năng động
  3. Tối ưu hóa các thiết lập dừng lỗ và lấy lợi nhuận, ví dụ như dừng lại.
  4. Thêm kích cỡ vị trí để hạn chế lỗ
  5. Đánh giá sức mạnh xu hướng với ADX đến vị trí đảo ngược trung bình kích thước

Kết luận

Nhìn chung, đây là một xu hướng đơn giản và thực tế sau chiến lược. Nó có lợi thế nhưng cũng có rủi ro. Việc tinh chỉnh thêm như điều chỉnh tham số, chỉ số tối ưu, cài đặt dừng lỗ vv có thể cải thiện nó. Nhưng không có chiến lược nào loại bỏ hoàn toàn rủi ro hệ thống. Quản lý rủi ro là chìa khóa cho giao dịch thận trọng.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

Thêm nữa