Xu hướng theo chiến lược trung bình động thích nghi

Tác giả:ChaoZhang, Ngày: 2023-10-10 15:21:45
Tags:

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 các đường trung bình di chuyển nhanh và chậm, thuộc về các chiến lược theo xu hướng. Bằng cách điều chỉnh các thông số trung bình di chuyển một cách thích nghi, nó thích nghi năng động với xu hướng thị trường để đạt được lợi nhuận tối đa.

Chiến lược logic

  1. Tính toán các đường trung bình di chuyển nhanh và chậm.

  2. Khi MA nhanh vượt qua MA chậm, nó chỉ ra xu hướng tăng và tạo ra tín hiệu mua.

  3. Khi MA nhanh vượt qua dưới MA chậm, nó chỉ ra xu hướng giảm và tạo ra tín hiệu bán.

  4. Bằng cách tự động điều chỉnh chiều dài của các đường trung bình động, chiến lược tự điều chỉnh năng động theo xu hướng thị trường để theo dõi lợi nhuận.

Phân tích lợi thế

  1. Chiến lược đơn giản và rõ ràng, dễ hiểu và thực hiện.

  2. Nó có thể theo dõi hiệu quả xu hướng thị trường với tiềm năng lợi nhuận lớn.

  3. Điều chỉnh tham số năng động thích nghi với những thay đổi về điều kiện thị trường.

  4. Các thuật toán MA có thể tùy chỉnh làm tăng tính linh hoạt của chiến lược.

  5. Thiết lập logic mua và bán linh hoạt.

Phân tích rủi ro

  1. Giao dịch thường xuyên dẫn đến chi phí giao dịch cao hơn.

  2. Sự chậm trễ của MA có thể bỏ lỡ các điểm vào và ra tốt nhất trong các thị trường biến động.

  3. Các thông số MA không phù hợp và tối ưu hóa tần số điều chỉnh gây thất bại chiến lược.

  4. Cần dừng lỗ nghiêm ngặt để hạn chế lỗ.

  5. Sự đảo ngược xu hướng có thể dẫn đến tổn thất lớn.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa các thông số MA để phát hiện tốt hơn sự thay đổi xu hướng.

  2. Thêm logic dừng lỗ để kiểm soát lỗ giao dịch duy nhất.

  3. Thêm các chỉ số đánh giá xu hướng để tránh tổn thất đảo ngược xu hướng.

  4. Cải thiện chiến lược điều chỉnh MA để thông minh hơn và tự động hơn.

  5. Thêm mô-đun tối ưu hóa tham số sử dụng máy học.

Tóm lại

Khả năng giao dịch của chiến lược là đơn giản và rõ ràng, tạo ra các giao dịch dựa trên giao dịch giao dịch nhanh và chậm. Nó có hiệu quả nắm bắt xu hướng nhưng có rủi ro. Nhanh chóng tối ưu hóa các thông số, logic dừng lỗ là cần thiết để làm cho chiến lược mạnh mẽ hơn. Nhìn chung chiến lược có tiềm năng cải tiến lớn và đáng nghiên cứu và áp dụng.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)

Thêm nữa