Chiến lược giao dịch đảo ngược trung bình di chuyển kép tạo ra tín hiệu giao dịch bằng cách tính toán trung bình di chuyển đơn giản của hai giai đoạn khác nhau - ngắn hạn và dài hạn. Nó đi dài khi trung bình di chuyển ngắn hạn vượt trên trung bình di chuyển dài hạn, và đi ngắn khi trung bình di chuyển ngắn hạn vượt dưới trung bình di chuyển dài hạn. Chiến lược này thuộc thể loại chiến lược theo xu hướng.
Chiến lược này thiết lập hai đường trung bình động đơn giản với độ dài thời gian khác nhau thông qua các thông số đầu vào, với MA ngắn hạn được gọi là đường nhanh và MA dài hạn được gọi là đường chậm. Đường nhanh phản ứng nhanh hơn với những thay đổi giá và nắm bắt xu hướng ngắn hạn, trong khi đường chậm phản ứng chậm hơn với những thay đổi giá và lọc ra tiếng ồn thị trường ngắn hạn, nắm bắt xu hướng chính. Khi đường nhanh vượt qua trên đường chậm, nó cho thấy xu hướng tăng đang tăng và một vị trí dài được thực hiện. Khi đường nhanh vượt qua dưới đường chậm, nó cho thấy xu hướng giảm đang tăng và một vị trí ngắn được thực hiện.
Cụ thể, chiến lược tính toán hai MAs bằng cách sử dụng hàm sma ((), gán kết quả cho xSMA (đường chậm) và đường nhanh. Các MAs được tính dựa trên giá đóng. Khi giá đóng vượt trên xSMA, một vị trí dài được thực hiện. Khi giá đóng vượt dưới xSMA, một vị trí ngắn được thực hiện. Chiến lược cũng đặt giới hạn khoảng thời gian giao dịch, do đó các tín hiệu giao dịch chỉ được tạo trong khoảng thời gian được chỉ định.
Các điểm lấy lợi nhuận và dừng lỗ được thiết lập cho mỗi giao dịch, và lợi nhuận được lấy hoặc dừng lỗ được kích hoạt ngay lập tức khi giá đạt đến mức lấy lợi nhuận hoặc dừng lỗ.
Rủi ro có thể được giảm bằng cách điều chỉnh các tham số MA, tối ưu hóa chiến lược lấy lợi nhuận / dừng lỗ, loại bỏ giới hạn thời gian hoặc thiết lập các khoảng thời gian giao dịch hợp lý hơn.
Chiến lược giao dịch đảo ngược trung bình động kép nói chung là một chiến lược theo xu hướng đơn giản và thực tế. Nó tận dụng tối đa hiệu ứng làm mịn của MAs để xác định hướng xu hướng và sử dụng MAs nhanh / chậm để tạo ra các tín hiệu giao dịch. Chiến lược dễ thực hiện với logic rõ ràng, phù hợp cho người mới bắt đầu nắm bắt. Tuy nhiên, nó có thể tạo ra các tín hiệu sai quá mức và các vấn đề chậm trễ. Có thể cải thiện thông qua tối ưu hóa tham số, thêm các chỉ số phụ trợ vv để làm cho chiến lược mạnh mẽ hơn. Nếu sử dụng đúng cách, chiến lược này có thể mang lại lợi nhuận ổn định và đáng để thử nghiệm và tối ưu hóa toàn diện.
/*backtest start: 2023-09-15 00:00:00 end: 2023-10-15 00:00:00 period: 4h basePeriod: 15m 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/ // © HPotter // Simple SMA strategy // // WARNING: // - For purpose educate only // - This script to change bars colors //@version=4 timeinrange(res, sess) => not na(time(res, sess)) ? 1 : 0 strategy(title="Simple SMA Strategy Backtest", shorttitle="SMA Backtest", precision=6, overlay=true) Resolution = input(title="Resolution", type=input.resolution, defval="D") Source = input(title="Source", type=input.source, defval=close) xSeries = security(syminfo.tickerid, Resolution, Source) Length = input(title="Length", type=input.integer, defval=14, minval=2) TriggerPrice = input(title="Trigger Price", type=input.source, defval=close) TakeProfit = input(50, title="Take Profit", step=0.01) StopLoss = input(20, title="Stop Loss", step=0.01) UseTPSL = input(title="Use Take\Stop", type=input.bool, defval=false) BarColors = input(title="Painting bars", type=input.bool, defval=true) ShowLine = input(title="Show Line", type=input.bool, defval=true) UseAlerts = input(title="Use Alerts", type=input.bool, defval=false) timeframe = input(title="Time Frame", defval="15") timerange = input(title="Time Range", defval="2300-0800") reverse = input(title="Trade Reverse", type=input.bool, defval=false) pos = 0 xSMA = sma(xSeries, Length) pos := iff(TriggerPrice > xSMA, 1, iff(TriggerPrice < xSMA, -1, nz(pos[1], 0))) nRes = ShowLine ? xSMA : na alertcondition(UseAlerts == true and pos != pos[1] and pos == 1, title='Signal Buy', message='Strategy to change to BUY') alertcondition(UseAlerts == true and pos != pos[1] and pos == -1, title='Signal Sell', message='Strategy to change to SELL') alertcondition(UseAlerts == true and pos != pos[1] and pos == 0, title='FLAT', message='Strategy get out from position') possig =iff(pos[1] != pos, iff(reverse and pos == 1, -1, iff(reverse and pos == -1, 1, pos)), 0) if (possig == 1 and timeinrange(timeframe, timerange)) strategy.entry("Long", strategy.long) if (possig == -1 and timeinrange(timeframe, timerange)) strategy.entry("Short", strategy.short) if (timeinrange(timeframe, timerange) == 0) strategy.close_all() if (UseTPSL) strategy.close("Long", when = high > strategy.position_avg_price + TakeProfit, comment = "close buy take profit") strategy.close("Long", when = low < strategy.position_avg_price - StopLoss, comment = "close buy stop loss") strategy.close("Short", when = low < strategy.position_avg_price - TakeProfit, comment = "close buy take profit") strategy.close("Short", when = high > strategy.position_avg_price + StopLoss, comment = "close buy stop loss") nColor = BarColors ? strategy.position_avg_price != 0 and pos == 1 ? color.green :strategy.position_avg_price != 0 and pos == -1 ? color.red : color.blue : na barcolor(nColor) plot(nRes, title='SMA', color=#00ffaa, linewidth=2, style=plot.style_line)