Chiến lược này thực hiện một hệ thống giao dịch trung bình chuyển động nhân tố ba (EMA) điển hình. Nó tạo ra các tín hiệu giao dịch bằng cách so sánh EMA 5 ngày nhanh, EMA 20 ngày trung bình và EMA 50 ngày chậm. Nó cũng sử dụng giá đóng của thanh hiện tại so với các thanh trước để lọc các tín hiệu giả. Ngoài ra, lệnh dừng lỗ được sử dụng để khóa lợi nhuận.
Khi EMA 5 ngày vượt qua trên EMA 20 ngày, và cả ba EMA đều phù hợp với xu hướng tăng (EMA 5 ngày > EMA 20 ngày > EMA 50 ngày), và giá đóng cửa hiện tại nằm trên giá đóng cửa trước đó gần với một số dấu chấm nhất định, đi dài. Khi EMA 5 ngày vượt qua dưới EMA 20 ngày, và tất cả ba EMA đều phù hợp với xu hướng giảm (EMA 5 ngày < EMA 20 ngày < EMA 50 ngày), và giá đóng cửa hiện tại nằm dưới giá đóng cửa trước đó gần với một số dấu chấm nhất định, đi ngắn.
Sau khi vào, khi giá chạy bởi các dấu hiệu nhất định, một lỗ dừng kéo theo sẽ được bắt đầu để tiếp tục điều chỉnh lỗ dừng dựa trên biến động giá, để khóa trong lợi nhuận lớn hơn.
Sử dụng EMA ba để tạo tín hiệu có thể lọc hiệu quả tiếng ồn thị trường và xác định xu hướng. EMA nhanh phản ánh những thay đổi mới nhất, EMA trung bình xác định hướng xu hướng và EMA chậm lọc dao động.
So sánh các bar
Trailing stop loss điều chỉnh stop loss dựa trên hành động giá để tối đa hóa việc khóa lợi nhuận.
Cài đặt tham số linh hoạt của chiến lược này cho phép tối ưu hóa trên các sản phẩm và khung thời gian khác nhau từ hàng ngày đến các thanh phút.
Sự giao dịch xuyên qua EMA thường xuyên có thể tạo ra giao dịch quá mức trên các thị trường khác nhau, làm tăng chi phí từ hoa hồng và trượt.
Đánh giá dừng lỗ có thể sớm thoát khỏi xu hướng trong thời gian whipsaws lớn.
Sự chậm trễ của EMA có thể gây ra sự thiếu hụt các điểm chuyển đổi và tổn thất lớn.
Các thông số như thời gian EMA, dấu chấm dứt kéo dài yêu cầu tối ưu hóa cho các sản phẩm và khung thời gian khác nhau.
Kết hợp các chỉ số khác như MACD, KD để lọc tín hiệu giao dịch.
Kiểm tra và tối ưu hóa các thông số cho các sản phẩm cụ thể và khung thời gian để tìm kết hợp tốt nhất.
Điều chỉnh động các thông số thông qua sự giám sát của con người hoặc máy học.
Xem xét vô hiệu hóa dừng lại và giữ vị trí đầy đủ cho các điều kiện thị trường cụ thể.
Thay thế đơn giản trailing stop loss với cơ chế tự động lợi nhuận nâng cao hơn.
Chiến lược này tích hợp ba kỹ thuật phân tích kỹ thuật phổ biến - EMA crossover, price breakout và trailing stop loss vào một hệ thống giao dịch theo xu hướng khá toàn diện và mạnh mẽ. Thông qua tối ưu hóa tham số, nó có thể được thích nghi với các sản phẩm và khung thời gian khác nhau và hoạt động tốt trong các thị trường có xu hướng mạnh.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-02 12:00:00 period: 1m basePeriod: 1m 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/ // © Matt Dearden - IndoPilot // @version=4 /////////////////////////////////////////////////////// Initial Parameters /////////////////////////////////////////////////////// SystemName = "Triple EMA Strategy" ShortSystemName = "TEMA" InitPosition = 0 InitCapital = 50000 InitCommission = 0.004 //approx value to compensate for Oanda spreads InitPyramidMax = 0 CalcOnorderFills = true strategy(title=SystemName, shorttitle=ShortSystemName, overlay=true, pyramiding=InitPyramidMax, default_qty_type=strategy.cash, default_qty_value=InitPosition, commission_type=strategy.commission.percent, commission_value=InitCommission, initial_capital=InitCapital, max_lines_count=500, max_labels_count=500, process_orders_on_close=false, calc_on_every_tick=false) ///////////////////////////////////////////////////////////// Inputs ///////////////////////////////////////////////////////////// DateFilter = input(false, "═════ Data Filtering ═════") InitYear = input(title="Year", type=input.integer, defval=2021, minval=2000, maxval=2021) InitMonth = input(title="Month (0=ALL)", type=input.integer, defval=0, minval=0, maxval=12) InitStopLoss = input(title="Stop Loss (ticks)", type=input.integer, defval=100, minval=0, maxval=1000) TrailingStopLoss = input(title="Trailing S/L (ticks)", type=input.integer, defval=130, minval=0, maxval=1000) InitBuffer = input(title="Buffer (ticks)", type=input.integer, defval=15, minval=0, maxval=1000) InitEMA1 = input(title="EMA 1", type=input.integer, defval=5, minval=0, maxval=1000) InitEMA2 = input(title="EMA 2", type=input.integer, defval=20, minval=0, maxval=1000) InitEMA3 = input(title="EMA 3", type=input.integer, defval=50, minval=0, maxval=1000) //////////////////////////////////////////////////////////// Variables /////////////////////////////////////////////////////////// var StopLoss = float(0.0) var StartPrice = float(0.0) //setup multipliers and catch JPY difference Multiplier = syminfo.currency == "JPY" ? 10 : 1000 //get the daily exchange rate from yesterday //X_rate = security(AccountCurrency+syminfo.currency, "D", close[1]) OrderQty = 1 Buffer = InitBuffer / (Multiplier * 100) /////////////////////////////////////////////////////// Triple EMA Strategy ////////////////////////////////////////////////////// EMA1 = ema(close, InitEMA1) EMA2= ema(close, InitEMA2) EMA3 = ema(close, InitEMA3) //entry conditions longCondition = crossover(EMA1, EMA2) and close > EMA3 and EMA1 > EMA3 and EMA2 > EMA3 and close > (close[1] + Buffer) shortCondition = crossunder(EMA1, EMA2) and close < EMA3 and EMA1 < EMA3 and EMA2 < EMA3 and close < (close[1] - Buffer) /////////////////////////////////////////////////////// Trailing Stoploss //////////////////////////////////////////////////////// if (strategy.position_size > 0 and (close > (StartPrice + (TrailingStopLoss / (100 * Multiplier))))) StopLoss := max(StopLoss, close - (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Long Stoploss", "Long") if (strategy.position_size < 0 and (close < (StartPrice - (InitStopLoss / (100 * Multiplier))))) StopLoss := min(StopLoss, close + (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Setup entries ///////////////////////////////////////////////////////// if (longCondition) StartPrice := close StopLoss := StartPrice - (InitStopLoss / (100 * Multiplier)) strategy.entry("Long", strategy.long, qty=OrderQty) strategy.exit("Long Stoploss", "Long") if (shortCondition) StartPrice := close StopLoss := StartPrice + (InitStopLoss / (100 * Multiplier)) strategy.entry("Short", strategy.short, qty=OrderQty) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Draw the EMAs ///////////////////////////////////////////////////////// plot(EMA1, "EMA1", color=#00FF00) plot(EMA2, "EMA2", color=#FF0000) plot(EMA3, "EMA3", color=#4040FF)