Chiến lược này kết hợp khái niệm giao dịch rùa với phân tích giai đoạn Niko Bakker, sử dụng ba đường trung bình động của các chu kỳ khác nhau để xác định hướng xu hướng theo xu hướng. Nó đi dài khi đường trung bình động nhanh vượt qua đường trung bình động trung bình và cả ba đường trung bình động đều có cùng xu hướng tăng hoặc giảm; Nó đi ngắn khi đường trung bình động nhanh vượt dưới đường trung bình động và cả ba đường trung bình động đều có cùng xu hướng tăng hoặc giảm.
Tính toán ba trung bình động của các chu kỳ khác nhau: thời gian trung bình động nhanh là 8 ngày, thời gian trung bình động trung bình là 21 ngày và thời gian trung bình động chậm là 55 ngày.
Xác định điều kiện nhập cảnh: khi trung bình động nhanh vượt trên trung bình động trung bình và cả ba trung bình động đều có xu hướng tăng, đi dài; khi trung bình động nhanh vượt dưới trung bình động trung bình và cả ba trung bình động đều có xu hướng giảm, đi ngắn.
Xác định các điều kiện thoát: đóng các vị trí khi trung bình động nhanh vượt qua trung bình động trung bình theo hướng ngược lại.
Định kích thước vị trí: sử dụng định kích thước vị trí cố định, mở 1 hợp đồng mỗi lần. ATR cũng có thể được sử dụng để điều chỉnh động định kích thước vị trí.
Sử dụng ba đường trung bình di chuyển giúp xác định hướng xu hướng và tránh các sự phá vỡ sai.
Xu hướng tiếp theo cho tiềm năng lợi nhuận.
Sử dụng các đường trung bình động dẫn đến lợi nhuận ổn định và thu hồi tương đối nhỏ.
Chiến lược dừng lỗ có thể kiểm soát được làm giảm khả năng mất mát lớn.
Có nhiều lỗ nhỏ, làm giảm hiệu quả lợi nhuận.
Mức trung bình động chậm lại và có thể bỏ lỡ các điểm đảo ngược xu hướng.
Định kích thước vị trí cố định không thể kiểm soát rủi ro hiệu quả, có thể gây ra sự gọi ký quỹ trong thời gian biến động thị trường đáng kể.
Tối ưu hóa tham số không đúng dẫn đến giao dịch quá mức, tăng chi phí giao dịch và trượt.
Tối ưu hóa các giai đoạn trung bình động để phù hợp với các đặc điểm của công cụ giao dịch.
Sử dụng ATR để điều chỉnh động kích thước vị trí.
Thêm chiến lược dừng lỗ.
Bao gồm các chỉ số khối lượng giao dịch để xác định độ tin cậy của xu hướng.
Chiến lược này tích hợp các chỉ số kỹ thuật truyền thống và triết lý giao dịch rùa, sử dụng ba đường trung bình động để theo dõi xu hướng. Với tối ưu hóa tham số thích hợp, nó có thể đạt được lợi nhuận tốt. Nhưng nó cũng có một số rủi ro. Dừng lỗ, kích thước vị trí và các biện pháp khác cần được sử dụng để kiểm soát rủi ro và có được lợi nhuận ổn định dài hạn từ chiến lược giao dịch định lượng này.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JoshuaMcGowan //@version=4 // 1. Define strategy settings strategy(title="Triple Moving Average", overlay=true, pyramiding=0, initial_capital=1000, commission_type=strategy.commission.cash_per_order, commission_value=4, slippage=2) fastMALen = input(title="Fast MA Length", type=input.integer, defval=8) medMALen = input(title="Medium MA Length", type=input.integer, defval=21) slowMALen = input(title="Slow MA Length", type=input.integer, defval=55) //endMonth = input(title="End Month Backtest", type=input.integer, defval=11) //endYear = input(title="End Year Backtest", type=input.integer, defval=2019) // === INPUT BACKTEST RANGE === FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2016, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true) riskPerc = input(title="Risk %", type=input.float, defval=0.5, step=0.25) // 2. Calculate strategy values fastMA = sma(close, fastMALen) medMA = sma(close, medMALen) slowMA = sma(close, slowMALen) //Position Sizing riskEquity = (riskPerc / 100) * strategy.equity atrCurrency = (atr(20) * syminfo.pointvalue) posSize = usePosSize ? floor(riskEquity / atrCurrency) : 1 //Backtest Window //tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0)) // 3. Determine long trading conditions enterLong = crossover(fastMA, medMA) and (fastMA > slowMA) and (medMA > slowMA) and window() exitLong = crossunder(fastMA, medMA) // 4. Code short trading conditions enterShort = crossunder(fastMA, medMA) and (fastMA < slowMA) and (medMA < slowMA) and window() exitShort = crossover(fastMA, medMA) // 5. Output strategy data plot(series=fastMA, color=color.green, title="Fast MA") plot(series=medMA, color=color.purple, title="Medium MA") plot(series=slowMA, color=color.red, title="Slow MA", linewidth=2) bgColour = enterLong and (strategy.position_size < 1) ? color.green : enterShort and (strategy.position_size > -1) ? color.red : exitLong and (strategy.position_size > 0) ? color.lime : exitShort and (strategy.position_size < 0) ? color.orange : na bgcolor(color=bgColour, transp=85) // 6. Submit entry orders if (enterLong) strategy.entry(id="EL", long=true, qty=1) if (enterShort) strategy.entry(id="ES", long=false, qty=1) // 7. Submit exit orders strategy.close_all(when=exitLong and (strategy.position_size > 0)) strategy.close_all(when=exitShort and (strategy.position_size < 0)) strategy.close_all(when=not window()) //END