Chiến lược giao dịch chéo hai đường bằng cách tính toán đường trung bình của hai thiết lập tham số khác nhau và thực hiện mua và bán bằng cách chéo đường trung bình. Chiến lược này đơn giản và trực tiếp, phù hợp với giao dịch ngắn hạn và trung hạn.
Chiến lược này chủ yếu bằng cách nhập các tham số như chu kỳ đường trung bình nhanh, chu kỳ đường trung bình chậm, loại đường trung bình, tính toán đường trung bình nhanh và đường trung bình chậm. Khi đường trung bình nhanh xuyên qua đường trung bình chậm, thực hiện mua; Khi đường trung bình nhanh xuyên qua đường trung bình chậm, thực hiện bán.
Lập luận cốt lõi của chiến lược này là:
Các tham số đầu vào: chu kỳ trung bình nhanh maLen1, chu kỳ trung bình chậm maLen2, loại trung bình maTypeChoice
Máy tính trung bình nhanh maValue1 và trung bình chậm maValue2 dựa trên tham số đầu vào
So sánh hai mối quan hệ kích thước đường thẳng, xác định các điều kiện mua và bán:
Điều kiện mua: mặc maValue2 trên maValue1
Điều kiện bán: maValue1 mặc maValue2
Thực hiện các giao dịch tương ứng khi có điều kiện mua và bán
Hiển thị đường trung bình, và sử dụng các màu sắc khác nhau để phân biệt mối quan hệ kích thước đường trung bình
Gửi tín hiệu mua và bán
Sử dụng nguyên tắc chéo hai đường đồng nhất để tránh bị lừa bởi xung động một đường đồng nhất
Các tham số đường trung bình có thể điều chỉnh để thích ứng với các hoạt động khác nhau
Logic giao dịch đơn giản, trực tiếp và dễ hiểu
Các tín hiệu mua và bán có thể được tùy chỉnh, gợi ý thời gian giao dịch theo thời gian thực
Hình ảnh hiển thị xu hướng đường trung bình, tạo thành chỉ số giao dịch trực quan
Có thể tìm được sự kết hợp tham số tốt nhất bằng cách tối ưu hóa tham số
Có thể được sử dụng để tra cứu tìm các tham số tối ưu, cũng có thể được sử dụng để giao dịch trên đĩa cứng
Đường ngang dễ tạo ra tín hiệu sai, nên được đánh giá kết hợp với xu hướng và hình dạng
Trong trường hợp biến động của đường hai chiều, việc mở nhiều vị trí có thể dẫn đến tổn thất chi phí giao dịch.
Các tham số không đúng có thể dẫn đến giao dịch quá thường xuyên hoặc không thường xuyên
Sự kiện bất ngờ có thể gây ra tình trạng căng thẳng, không thể ngăn chặn
Các chỉ số ngắn có thể bị hỏng khi chu kỳ lớn bùng nổ
Cần giám sát thường xuyên, không thể hoàn toàn tự động
Phương pháp giải quyết rủi ro:
Kết hợp các chỉ số xu hướng để tránh biến động giao dịch
Kết hợp các chỉ số hình dạng để xác nhận hiệu quả của tín hiệu
Tối ưu hóa các tham số để giao dịch có tần suất hợp lý
Thiết lập điểm dừng lỗ, kiểm soát lỗ đơn
Xác định độ ổn định của tham số trong nhiều khoảng thời gian
Sử dụng bộ lọc thời gian hoặc tín hiệu để tránh đột phá giả
Kiểm tra các tham số đường trung bình khác nhau để tìm tham số tối ưu
Kiểm tra các loại đường trung bình khác nhau, chọn đường trung bình chính xác nhất để tạo ra tín hiệu
Kết hợp các chỉ số xu hướng để tránh giao dịch theo xu hướng
Kết hợp các chỉ số biến động để xác định thời điểm phù hợp
Thêm bộ lọc thời gian hoặc tín hiệu để giảm tín hiệu sai
Thiết lập điều khiển điểm trượt để tối ưu hóa hiệu quả giao dịch trên đĩa cứng
Nhiều giống nhiều chu kỳ chứng minh sự ổn định
Tham gia chiến lược tự động dừng lỗ
Khám phá các công nghệ như học máy để cải thiện hiệu quả phát hiện
Chiến lược chéo hai dòng là một chiến lược chỉ số kỹ thuật rất điển hình. Nó sử dụng nguyên tắc chéo hai dòng nhanh và chậm để tạo ra tín hiệu giao dịch, có thể đạt được kết quả tốt bằng cách tối ưu hóa tham số. Tuy nhiên, chiến lược này cũng có một số rủi ro, cần hợp tác với xu hướng, hình dạng và các chỉ số kỹ thuật khác để xác minh, giảm tỷ lệ tín hiệu sai. Ngoài ra, giao dịch trực tiếp cũng cần xem xét các chi tiết giao dịch như kiểm soát điểm trượt.
/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)
maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )
maValue1 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen1 )
else
0
maValue2 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen2 )
else
0
buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )
mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red
plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )
var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100
barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")
alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")
// Strategy Tester
stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )
tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )
fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )
isTime(_position) =>
range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )
if ( stratTesterOn and window() )
if ( buySignal and isTime( entryTime ) )
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Buy", strategy.long, contractSize )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
if ( sellSignal and isTime( entryTime ))
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Sell", strategy.short, contractSize )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
if ( maValue1 > maValue2 )
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
else
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
strategy.close_all( when=not isTime( entryTime ) )
plot( strategy.equity )