Chiến lược giao thoa giá đóng hàng tháng và trung bình động

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

img

Tổng quan

Chiến lược này tạo ra các tín hiệu giao dịch dựa trên sự chéo chéo giữa giá đóng cửa hàng tháng và đường trung bình động. Nó đi dài khi giá đóng cửa hàng tháng vượt quá mức trung bình động, và phẳng khi giá đóng cửa hàng tháng vượt dưới mức trung bình động.

Chiến lược logic

Logic cốt lõi của chiến lược này là:

  1. Hãy lấy tham số thời gian trung bình động như là đầu vào.
  2. Tùy chọn để hiển thị đường trung bình động.
  3. Tùy chọn sử dụng giá đóng cửa của ticker khác làm nguồn tín hiệu.
  4. Xác định tín hiệu giao dịch dựa trên mối quan hệ giữa giá đóng cửa hàng tháng và trung bình động:
    • Giá đóng vượt trên MA - Long
    • Giá đóng vượt dưới MA - Khóa vị trí dài

Chiến lược này sử dụng khả năng làm mịn của đường trung bình động để lọc ra tiếng ồn về giá và nắm bắt sự đảo ngược xu hướng trung hạn.

Ưu điểm

Những lợi thế chính của chiến lược này là:

  1. Sử dụng dữ liệu hàng tháng để lọc hiệu quả tiếng ồn trong ngày và nắm bắt xu hướng trung dài hạn
  2. Thời gian MA có thể tùy chỉnh để tối ưu hóa trên các ticker khác nhau
  3. Tùy chọn sử dụng một ticker khác làm nguồn tín hiệu cải thiện sự ổn định
  4. Thực hiện các kỹ thuật chống sơn lại tiên tiến
  5. Khung thời gian backtesting linh hoạt để dễ dàng thử nghiệm

Tóm lại, đây là một khuôn khổ chiến lược đơn giản nhưng thực tế có thể được điều chỉnh cho hầu hết các cổ phiếu thông qua điều chỉnh tham số, đặc biệt phù hợp với các nhà đầu tư trung dài hạn.

Rủi ro

Ngoài ra còn có một số rủi ro cần lưu ý:

  1. Các dữ liệu hàng tháng được cập nhật chậm, không thể phản ánh sự thay đổi giá theo thời gian thực
  2. Theo sau và có thể bỏ lỡ các cơ hội ngắn hạn
  3. MAs có sự chậm trễ vốn có, thời gian tín hiệu không thể đoán trước
  4. Lựa chọn tham số kém tối ưu dẫn đến sự bảo thủ quá mức hoặc bỏ lỡ cơ hội

Các cách đề xuất để giảm thiểu rủi ro:

  1. Tích hợp các chỉ số kỹ thuật khung thời gian nhanh hơn để đánh giá phụ trợ
  2. Tối ưu hóa thời gian MA để tìm các thông số tốt nhất
  3. Sử dụng điểm chuẩn ổn định hơn như nguồn tín hiệu
  4. Điều chỉnh kích thước vị trí để hạn chế tổn thất

Cơ hội gia tăng

Chiến lược này có tiềm năng cải thiện rất lớn:

  1. Bao gồm dừng lỗ để khóa lợi nhuận và kiểm soát rủi ro
  2. Thêm các chỉ số bổ sung như KD, MACD để cải thiện độ chính xác tín hiệu
  3. Sử dụng các kỹ thuật học máy để tối ưu hóa các thông số MA một cách năng động
  4. Giới thiệu kích thước vị trí phù hợp với xu hướng
  5. Xây dựng khả năng chuyển đổi dài / ngắn dựa trên điều kiện thị trường
  6. Kết hợp với giá khung thời gian nhanh hơn để phản ứng nhanh hơn

Kết luận

Chiến lược đóng cửa hàng tháng và MA chéo có logic đơn giản, thẳng thắn và có thể được điều chỉnh cho các ticker khác nhau thông qua điều chỉnh tham số. Nó đặc biệt phù hợp với các nhà đầu tư trung dài hạn. Với sự cải thiện liên tục của dừng lỗ, tối ưu hóa tham số và các mô-đun khác, chiến lược này cho thấy rất hứa hẹn.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-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/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Thêm nữa