Chiến lược này thiết kế một chiến lược giao dịch rút lui dựa trên chỉ số Keltner Channel. Nó đánh giá thời gian đảo ngược giá tiềm năng bằng cách so sánh giá với đường ray trên và dưới của Keltner Channel, và có các vị trí dài và ngắn thích hợp.
Chiến lược này sử dụng chỉ số Keltner Channel để đánh giá xu hướng giá. Keltner Channel bao gồm trung bình chuyển động và phạm vi trung bình thực (ATR). Đường sắt trên bằng trung bình chuyển động cộng với N lần ATR; đường sắt dưới bằng trung bình chuyển động trừ N lần ATR. Khi giá vượt qua đường sắt dưới của kênh từ dưới lên, nó được coi là sức mạnh tăng và các vị trí dài có thể được thực hiện; khi giá vượt qua đường sắt trên từ trên xuống, nó được coi là sức mạnh giảm được tăng và các vị trí ngắn có thể được thực hiện.
Ngoài ra, cơ sở cho chiến lược đánh giá cơ hội rút lui là giá chạm hoặc phá vỡ ranh giới kênh một lần nữa. Ví dụ, sau khi giá tăng để phá vỡ đường ray dưới, nếu nó giảm lại để chạm vào đường ray dưới mà không chạm vào đường ray trên, đó là một cơ hội để rút lui dài. Chiến lược sẽ mở các vị trí dài vào thời điểm này.
Đây là một chiến lược giao dịch sử dụng các đặc điểm giảm giá.
Những rủi ro chính của chiến lược này là:
Các biện pháp đối phó:
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Chiến lược này tích hợp phương pháp đánh giá xu hướng và phương pháp giao dịch rút lui, và có những lợi thế độc đáo trong việc nắm bắt xu hướng đảo ngược. Bằng cách điều chỉnh các tham số và mở rộng các chức năng, sự ổn định và lợi nhuận của chiến lược có thể được tăng thêm.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Keltner bounce from border. No repaint. (by Zelibobla)", shorttitle="Keltner border bounce", overlay=true) price = close // build Keltner keltnerLength = input(defval=200, minval=1, title="Keltner EMA Period Length") keltnerATRLength = input(defval=200, minval=1, title="Keltner ATR Period Length (the same as EMA length in classic Keltner Channels)") keltnerDeviation = input(defval=8, minval=1, maxval=15, title="Keltner band width (in ATRs)") closeOnEMATouch = input(type=bool, defval=false, title="Close trade on EMA touch? (less drawdown, but less profit and higher commissions impact)") enterOnBorderTouchFromInside = input(type=bool, defval=false, title="Enter on border touch from inside? (by default from outside, which is less risky but less profitable)") SL = input(defval=50, minval=0, maxval=10000, title="Stop loss in ticks (leave zero to skip)") EMA = sma(price, keltnerLength) ATR = atr(keltnerATRLength) top = EMA + ATR * keltnerDeviation bottom = EMA - ATR * keltnerDeviation buyEntry = crossover(price, bottom) sellEntry = crossunder(price, top) plot(EMA, color=aqua,title="EMA") p1 = plot(top, color=silver,title="Keltner top") p2 = plot(bottom, color=silver,title="Keltner bottom") fill(p1, p2) tradeSize = input(defval=1, minval=1, title="Trade size") if ( enterOnBorderTouchFromInside and crossunder(price, bottom) ) strategy.entry("BUY", strategy.long, qty=tradeSize, comment="BUY") else if( crossover(price, bottom) ) strategy.entry("BUY", strategy.long, qty=tradeSize, comment="BUY") if( crossover(price,EMA) and closeOnEMATouch ) strategy.close("BUY") if( 0 != SL ) strategy.exit("EXIT BUY", "BUY", qty=tradeSize, loss=SL) strategy.exit("EXIT SELL", "SELL", qty=tradeSize, loss=SL) if( enterOnBorderTouchFromInside and crossover(price, bottom) ) strategy.entry("SELL", strategy.long, qty=tradeSize, comment="SELL") else if ( crossunder(price, top) ) strategy.entry("SELL", strategy.short, qty=tradeSize, comment="SELL") if( crossunder(price, EMA) and closeOnEMATouch ) strategy.close("SELL")