Chiến lược giao thoa ALMA

Tác giả:ChaoZhang, Ngày: 2023-09-23 15:11:02
Tags:

Tổng quan

Chiến lược này sử dụng hai Arnaud Legoux Moving Averages (ALMA), một nhanh và một chậm, để tạo ra các tín hiệu chéo. ALMA làm giảm sự chậm trễ và làm mịn đường tín hiệu so với MAs truyền thống. Bộ lọc âm lượng được thêm vào để cải thiện độ chính xác tín hiệu. Nó được tối ưu hóa cho tiền điện tử nhưng có thể được điều chỉnh cho các công cụ khác.

Chiến lược logic

Các chỉ số và quy tắc chính là:

  1. ALMA nhanh: Thời gian ngắn hơn để bắt được sự đột phá.

  2. ALMA chậm: Thời gian dài hơn để đánh giá xu hướng.

  3. Bộ lọc khối lượng: Có hiệu lực khi EMA ngắn vượt qua EMA dài.

  4. Tín hiệu mua: ALMA nhanh vượt qua ALMA chậm và bộ lọc âm lượng vượt qua.

  5. Tín hiệu bán: ALMA nhanh vượt dưới ALMA chậm.

  6. Tín hiệu ngắn: ALMA nhanh vượt qua dưới ALMA chậm và bộ lọc âm lượng vượt qua.

  7. Tín hiệu che: ALMA nhanh vượt qua ALMA chậm.

Chiến lược này kết hợp phân tích xu hướng, động lượng và khối lượng cho các tín hiệu mạnh mẽ. ALMA làm giảm chậm lại trong khi khối lượng tránh các đột phá sai.

Ưu điểm

So với các chiến lược trung bình động truyền thống, những lợi thế chính là:

  1. ALMA làm giảm sự chậm trễ và cải thiện chất lượng tín hiệu.

  2. Bộ lọc khối lượng tránh mất mát từ các vụ phá vỡ giả.

  3. Sự kết hợp nhanh / chậm đo hướng xu hướng.

  4. Quy tắc đơn giản và trực quan, dễ thực hiện.

  5. Điều chỉnh linh hoạt các tham số MA cho các thị trường khác nhau.

  6. Quản lý rủi ro hợp lý.

  7. Khả năng tối ưu hóa hơn nữa thông qua điều chỉnh tham số.

  8. Nhìn chung cải thiện sự ổn định và chất lượng so với các chiến lược chéo truyền thống.

Rủi ro

Mặc dù có lợi, nên lưu ý các rủi ro sau:

  1. Các hệ thống chéo tự nhiên dễ bị tổn thương bởi những đòn chém.

  2. Hiệu suất của ALMA phụ thuộc vào điều chỉnh tham số.

  3. Tiếng ồn có thể gây sai lầm cho việc tạo tín hiệu.

  4. Một số sự chậm trễ luôn tồn tại, không thể tránh được tất cả các tổn thất.

  5. Rủi ro quá phù hợp từ tối ưu hóa quá mức.

  6. Các tín hiệu bị trục trặc khi âm lượng bất thường.

  7. Các kỹ thuật học máy có thể tạo ra kết quả tốt hơn.

  8. Theo dõi tỷ lệ lợi nhuận/rủi ro để tránh rút tiền quá mức.

Tăng cường

Để đối phó với các rủi ro, có thể cải thiện trong các lĩnh vực sau:

  1. Tối ưu hóa các thông số ALMA để có độ nhạy tốt hơn.

  2. Thử nghiệm với các phép đo âm lượng khác nhau.

  3. Đưa ra lệnh dừng lỗ để kiểm soát lỗ cho mỗi giao dịch.

  4. Tích hợp các chỉ số khác cho tín hiệu mạnh mẽ.

  5. Thêm mô-đun máy học để điều chỉnh tín hiệu thông minh hơn.

  6. triển khai trên nhiều sản phẩm để đa dạng hóa chiến lược.

  7. Tối ưu hóa các mô hình kích thước vị trí cho các thị trường khác nhau.

  8. Nghiên cứu độ bền để ngăn ngừa quá phù hợp.

Kết luận

Kết luận, so với các chiến lược chéo truyền thống, chiến lược này cải thiện chất lượng tín hiệu và độ bền thông qua thuật toán ALMA và bộ lọc âm lượng. Nhưng tối ưu hóa chiến lược là một quá trình lặp đi lặp lại.


/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 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/
// © Sarahann999
// Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/
//@version=5
strategy("ALMA Cross", overlay=true)

//User Inputs
src= (close)
long_entry = input(true, title='Long Entry')
short_entry = input(true, title='Short Entry')

//Fast Settings
ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings")
alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma)

//Slow Settings
ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings")
alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2)

//Volume
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")
shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings")
longlen = input.int(10, minval=1, title = "Long Length")
short = ta.ema(volume, shortlen)
long = ta.ema(volume, longlen)
osc = 100 * (short - long) / long

//Define Cross Conditions
buy = ta.crossover(Alma1, Alma2)
sell = ta.crossunder(Alma1, Alma2)

//Calculate Take Profit Percentage
longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage',
     minval=0.0, step=0.1, defval=2) / 100
shortProfitPerc = input.float(title="Short Take Profit",
     minval=0.0, step=0.1, defval=2) / 100
     
// Figure out take profit price 1
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Make inputs that set the stop %  1
longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage',
     minval=0.0, step=0.1, defval=2.5) / 100
shortStopPerc = input.float(title="Short Stop Loss",
     minval=0.0, step=0.1, defval=2.5) / 100

// Figure Out Stop Price
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)

//Define Conditions
buySignal = buy and osc > 0
     and strategy.position_size == 0

//sellSignal 
sellSignal = sell and osc > 0
     and strategy.position_size == 0

// Submit entry orders
if buySignal and long_entry
    strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long")
    alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar)
    
if sellSignal and short_entry
    strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short")
    alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar)
    
// Submit exit orders based on take profit price
if (strategy.position_size > 0)
    strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}")
if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}")

//Draw
plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles)
plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)

Thêm nữa