यह रणनीति बोलिंगर बैंड्स के मूल्य ब्रेकआउट का व्यापार करती है। इसका उद्देश्य चैनल ब्रेकआउट से रुझान के अवसरों को पकड़ना है।
रणनीति तर्क:
मध्य रेखा और ऊपर और नीचे अस्थिरता बैंड के रूप में n-अवधि चलती औसत के साथ बोलेंजर बैंड की गणना करें।
जब कीमत निचले बैंड से नीचे टूटती है तो शॉर्ट में प्रवेश करें। जब ऊपरी बैंड से ऊपर टूटती है तो लंबी में प्रवेश करें।
जोखिम नियंत्रण के लिए विपरीत बैंड के बाहर स्टॉप सेट करें।
पैरामीटर अनुकूलन के लिए अधिकतम ड्रॉडाउन के आधार पर बैंड चौड़ाई समायोजित करें.
झूठे ब्रेकआउट से बचने के लिए वॉल्यूम फ़िल्टर जोड़ें।
लाभः
ब्रेकिंग बैंड प्रभावी रूप से रुझान मोड़ की पहचान करता है।
बोलिंगर पैरामीटर अनुकूलन सरल और व्यावहारिक है।
वॉल्यूम फिल्टर झूठे आउट से बचकर गुणवत्ता में सुधार करता है।
जोखिमः
पिछड़े बैंड सबसे अच्छा प्रवेश समय चूक सकते हैं।
ब्रेकआउट के बाद रिवर्स आम हैं, जिसके लिए उचित रुकावट की आवश्यकता होती है।
अनुकूलन में कम आवृत्ति वाले ट्रेडों की तलाश करने से अवसर खो सकते हैं।
संक्षेप में, यह एक ठेठ चैनल ब्रेकआउट रणनीति है। अपेक्षाकृत सरल नियम अनुकूलन को लाभान्वित करते हैं लेकिन देरी और रोक प्लेसमेंट के मुद्दे हैं जो दीर्घकालिक स्थिर लाभ को प्रभावित करते हैं।
/*backtest start: 2023-08-12 00:00:00 end: 2023-09-11 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 // strategy("ChannelBreakOutStrategyV2.1", commission_type = "percent", commission_value = 0.1, calc_on_order_fills = true, overlay=true) length = input(title="Length", minval=1, maxval=1000, defval=40) maxR = input(title = "R", minval = 1.0, maxval = 10, defval = 3, step = 0.1) adoptR = input(title = "Auto Adjust R", defval = false) stepR = input(title = "Step in R", minval = 0.01, maxval = 0.1, step = 0.01, defval = 0.02) baseYear = input(title = "Base Year", minval = 2000, maxval = 2016, defval = 2000) volumeTh = input(title = "Volume Threadhold", minval = 100.0, maxval = 200, defval = 120, step = 5) hasLong = input(title = "Include Long", defval = true) hasShort = input(title = "Include Short", defval = true) usePositionSizing = input(title = "Enable Position Sizing", defval = true) getTrailStop(val, current) => s = val > 1.6 ? 0.8 : val >= 1.4 ? 0.85 : val >= 1.3 ? 0.9 : 0.93 s * current upBound = highest(high, length) downBound = lowest(low, length) hasVol = (volume / sma(volume, length) * 100 >= volumeTh) ? 1 : 0 hasPos = strategy.position_size != 0 ? 1 : 0 trailstop = atr(length) * 3 ptvalue = syminfo.pointvalue equity = strategy.openprofit > 0 ? strategy.equity - strategy.openprofit : strategy.equity curR = adoptR == false ? maxR : n == 0 ? maxR : hasPos == 1 ? curR[1] : (rising(equity,1) > 0? curR[1] + stepR : falling(equity, 1) > 0 ? curR[1] <= 2.0 ? 2.0 : curR[1] - stepR : curR[1]) contracts = usePositionSizing == false ? 20 : floor(equity / 100 * curR / (trailstop * ptvalue)) realbuystop = close - trailstop realsellstop = close + trailstop isPFst = (hasPos[1] == 0 and hasPos == 1) ? 1 : 0 isPOn = (hasPos[1] + hasPos == 2) ? 1 : 0 largestR = hasPos == 0 or isPFst == 1 ? -1 : nz(largestR[1]) < close ? close : largestR[1] pctRise = largestR / strategy.position_avg_price rbs = strategy.position_size <= 0 ? realbuystop : isPFst ? strategy.position_avg_price - trailstop : pctRise >= 1.3 ? getTrailStop(pctRise, largestR) : (isPOn and realbuystop > rbs[1] and close > close[1]) ? realbuystop : rbs[1] rss = strategy.position_size >= 0 ? realsellstop : isPFst ? strategy.position_avg_price + trailstop : (isPOn and realsellstop < rss[1] and close < close[1]) ? realsellstop : rss[1] isStart = na(rbs) or na(rss) ? 0 : 1 buyARun = close - open > 0 ? 0 : open - close sellARun = open - close > 0 ? 0 : close - open if (strategy.position_size > 0 and buyARun >= trailstop / 3 * 2 and pctRise < 1.3) strategy.close("buy") strategy.cancel("exit") if (strategy.position_size < 0 and sellARun >= trailstop / 3 * 2) strategy.close("sell") strategy.cancel("exit") strategy.cancel("buy") strategy.cancel("sell") conLong = hasLong == true and hasPos == 0 and year > baseYear and (isStart + hasVol) == 2 strategy.order("buy", strategy.long, qty = contracts, stop=upBound + syminfo.mintick * 5, comment="BUY", when = conLong) if (rbs > high) strategy.close("buy") strategy.exit("exit", "buy", stop = rbs, when = hasPos == 1 and isStart == 1) conShort = hasShort == true and hasPos == 0 and year > baseYear and (isStart + hasVol) == 2 strategy.order("sell", strategy.short, qty = contracts, stop=downBound - syminfo.mintick * 5, comment="SELL", when = conShort) if (rss < low) strategy.close("sell") strategy.exit("exit", "sell", stop = rss, when = hasPos == 1 and isStart == 1) plot(series = rbs, color=blue) plot(series = realbuystop, color=green) plot(series = rss, color=red) plot(series = realsellstop, color=yellow)