এটি একটি মার্কেট মেকার কৌশল যা বোলিংজার ব্যান্ডগুলিকে এন্ট্রি হিসাবে, চলমান গড় হিসাবে বন্ধ করে দেয় এবং সহজ শতাংশ স্টপ লস ব্যবহার করে। এটি জুন 2022 এ এক্সবিটি ইউএসডি চুক্তিতে অত্যন্ত লাভজনক ছিল।
কৌশলটি বোলিংজার ব্যান্ডের উপরের এবং নীচের ব্যান্ডগুলিকে পজিশনে প্রবেশের সুযোগের ক্ষেত্র হিসাবে ব্যবহার করে। বিশেষত, যখন দামটি নিম্ন ব্যান্ডের নীচে থাকে, তখন এটি দীর্ঘ পজিশন খুলবে; যখন দামটি উপরের ব্যান্ডের উপরে থাকে, তখন এটি শর্ট পজিশন খুলতে শর্ট হবে।
এছাড়াও, কৌশলটি পজিশন বন্ধ করার জন্য রেফারেন্স হিসাবে চলমান গড়ও ব্যবহার করে। দীর্ঘ পজিশন ধরে রাখার সময়, যদি দাম চলমান গড়ের উপরে থাকে তবে এটি লং বন্ধ করতে বেছে নেবে; একইভাবে, শর্ট পজিশন ধরে রাখার সময়, যদি দাম চলমান গড়ের নীচে থাকে তবে এটি শর্ট বন্ধ করতেও বেছে নেবে।
স্টপ লসের জন্য, এটি প্রবেশ মূল্যের উপর ভিত্তি করে একটি সহজ শতাংশ ট্রেলিং স্টপ লস ব্যবহার করে। এটি কার্যকরভাবে ট্রেন্ডিং বাজারে বিশাল ক্ষতি এড়াতে পারে।
এই কৌশলটির প্রধান সুবিধাগুলো হল:
এই কৌশলটির সাথে কিছু ঝুঁকিও রয়েছেঃ
এই ঝুঁকিগুলি কমাতে, আমরা অন্যান্য ফিল্টার যোগ করার কথা বিবেচনা করতে পারি, স্টপ লস সেটিংস অপ্টিমাইজ করতে পারি, অথবা অবস্থান আকারগুলি যথাযথভাবে সীমাবদ্ধ করতে পারি।
আরও অপ্টিমাইজেশনের সুযোগ রয়েছেঃ
সামগ্রিকভাবে, এটি একটি অত্যন্ত লাভজনক উচ্চ-ফ্রিকোয়েন্সি বাজার তৈরি কৌশল। এটি ট্রেডিং সংকেত এবং ঝুঁকি নিয়ন্ত্রণের জন্য বোলিংজার ব্যান্ডের উপর মূলধন করে। তবে আমাদের এর ত্রুটিগুলি সম্পর্কে সচেতন হওয়া এবং লাইভ ট্রেডিংয়ে সাবধানে যাচাই করা দরকার। আরও অপ্টিমাইজেশান সহ, এই কৌশলটির আরও স্থিতিশীল এবং আউটসাইজড রিটার্ন তৈরি করার সম্ভাবনা রয়েছে।
/*backtest start: 2023-12-24 00:00:00 end: 2024-01-23 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(shorttitle="BBL", title="BB limit", overlay = true) length = input(200, minval=1) src = input(hlc3, title="Source") xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)") s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"]) basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length) sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"]) mult = xmult / 10 dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length) diff = input(0.5, title = "Spread") LongPrice(p) => LongPrice = diff == 0 ? p : floor(p / diff) * diff ShortPrice(p) => ShortPrice = diff == 0 ? p : ceil(p / diff) * diff pyr = input(1, title = "Pyramiding") useStopLoss = input(true) stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%") stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10 dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis upper = basis + (1*dev) lower = basis - (1*dev) plot(basis, color=fuchsia, linewidth=2) plot(upper, color=green, linewidth=2) plot(lower, color=green, linewidth=2) strategy.cancel_all() if strategy.position_size > 0 and close <= basis + diff * 2 strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis)) else if strategy.position_size < 0 and close >= basis - diff * 2 strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis)) stopLossPrice1 = na stopLossPrice2 = na add = na openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100))) if openOrderCondition add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower)) if useStopLoss and (strategy.position_size > 0 or openOrderCondition) add = openOrderCondition ? strategy.equity / pyr / lower : 0 posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price posSize = strategy.position_size <= 0 ? 0 : strategy.position_size stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100) strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1)) openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper)) if openOrderCondition add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper)) if useStopLoss and (strategy.position_size < 0 or openOrderCondition) add = openOrderCondition ? strategy.equity / pyr / upper : 0 posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100) strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2)) plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2) plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testStartHour = input(0, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()