Chiến lược này dựa trên đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm làm tín hiệu mua và bán, thuộc loại chiến lược theo dõi xu hướng. Bằng cách tự động điều chỉnh các tham số đường trung bình di chuyển, động thích ứng với xu hướng thị trường để tối đa hóa lợi nhuận.
Tính toán đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm. Các tham số đường trung bình di chuyển nhanh được mặc định là 21, tham số đường trung bình di chuyển chậm được mặc định là 34.
Khi đường trung bình di chuyển nhanh đi qua đường trung bình di chuyển chậm, nó cho thấy thị trường đang đi lên và phát ra tín hiệu mua.
Khi đường trung bình di chuyển nhanh đi qua đường trung bình di chuyển chậm, nó cho thấy thị trường đang đi xuống và phát ra tín hiệu bán.
Tự động điều chỉnh các tham số chiều dài của đường trung bình di chuyển để phù hợp với xu hướng thị trường, theo dõi xu hướng và kiếm lợi nhuận.
Chiến lược này đơn giản, rõ ràng và dễ hiểu.
Có khả năng theo dõi xu hướng thị trường một cách hiệu quả và có tiềm năng lợi nhuận lớn.
Bạn có thể điều chỉnh các tham số một cách động để thích ứng với những thay đổi trong thực tế.
Có thể cấu hình thuật toán đường trung bình di động, tăng tính linh hoạt trong chiến lược.
Các ứng dụng có thể được cấu hình tự do, mua và bán theo logic, linh hoạt.
Chiến lược đường trung bình di động dễ tạo ra giao dịch thường xuyên và chi phí giao dịch cao hơn.
Khi thị trường biến động mạnh, đường trung bình di động bị chậm trễ và có thể bỏ lỡ thời điểm mua và bán tốt nhất.
Cần tối ưu hóa các tham số đường trung bình di chuyển và tần số điều chỉnh, cấu hình không đúng sẽ gây ra thất bại trong chiến lược.
Cần kiểm soát chặt chẽ để ngăn chặn tổn thất.
Nếu xu hướng thay đổi, nó có thể dẫn đến những khoản lỗ lớn.
Tối ưu hóa các tham số đường trung bình di chuyển, làm cho nó nhạy cảm hơn, kịp thời nắm bắt các thay đổi xu hướng.
Tăng logic dừng lỗ, kiểm soát chặt chẽ lỗ đơn.
Tăng các chỉ số đánh giá xu hướng, tránh sự đảo ngược của xu hướng gây ra thiệt hại.
Tối ưu hóa chiến lược điều chỉnh đường trung bình di động, làm cho nó thông minh hơn và tự động hơn.
Thêm mô-đun tối ưu hóa tham số, tự động tối ưu hóa bằng phương pháp học máy.
Chiến lược này là một chiến lược theo dõi xu hướng điển hình. Ưu điểm của chiến lược là các quy tắc giao dịch đơn giản, dễ thực hiện và có thể nắm bắt xu hướng hiệu quả. Tuy nhiên, cũng có một số rủi ro, cần phải liên tục tối ưu hóa cấu hình tham số, logic dừng lỗ, làm cho chiến lược ổn định và đáng tin cậy hơn. Nói chung, chiến lược này có tiềm năng cải thiện lớn, cần nghiên cứu và ứng dụng sâu hơn.
/*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)