
এটি একটি বিউরিন-ব্যান্ড-চ্যানেল ভিত্তিক বিপরীতমুখী অস্থির প্রবণতা কৌশল। এটি বিউরিন-ব্যান্ড-নিম্নমুখী চ্যানেলকে প্রবণতা হিসাবে ব্যবহার করে এবং যখন দাম চ্যানেলের সীমানার কাছাকাছি থাকে তখন বিপরীতমুখী সুযোগগুলি প্রবেশের সন্ধান করে।
এই কৌশলটি ব্রিন-ব্যান্ডের সূচককে প্রধান প্রযুক্তিগত সূচক হিসাবে ব্যবহার করে। ব্রিন-ব্যান্ডটি n দিনের চলমান গড় এবং তার আপ-ডাউন রেঞ্জের সমন্বয়ে গঠিত, ব্রিন-ব্যান্ডের আপ-ট্র্যাক = n দিনের চলমান গড় + m × n দিনের স্ট্যান্ডার্ড ডিফারেনশিয়াল, ব্রিন-ব্যান্ডের ডাউন-ট্র্যাক = n দিনের চলমান গড় - m × n দিনের স্ট্যান্ডার্ড ডিফারেনশিয়াল। যেখানে n এবং m প্যারামিটার।
যখন দাম উর্ধ্বমুখী হয়, তখন এটি একটি উর্ধ্বমুখী প্রবণতা দেখায়, তবে এটি টপকে যেতে পারে; যখন দাম নিম্নমুখী হয়, তখন এটি একটি নিম্নমুখী প্রবণতা দেখায়, তবে এটি নীচের দিকে ফিরে যেতে পারে। এই সময়টি যদি কার্যকরভাবে বুলিন ব্যান্ডটি অতিক্রম করে তবে এটি বিপরীত হতে পারে।
এই নীতির জন্য নির্দিষ্ট ট্রেডিং নিয়মগুলি হলঃ
যখন বন্ধের দাম বুলিনের চেয়ে বেশি হয়, তখন বেশি প্রবেশ করুন; যখন বন্ধের দাম বুলিনের চেয়ে কম হয়, তখন খালি প্রবেশ করুন।
স্টপ লসটি n দিনের চলমান গড়ের সাথে সংকেত দেয়। যখন একাধিক একক সমাপ্তির দামের নীচে n দিনের গড় লাইনটি ভেঙে যায় তখন স্টপ লস খেলতে হয়। যখন খালি একক সমাপ্তির দামের উপরে n দিনের গড় লাইনটি ভেঙে যায় তখন স্টপ লস খেলতে হয়।
একটি নির্দিষ্ট লেনদেনের পরিমাণের সাথে, প্রতিটি লেনদেনের জন্য একটি নির্দিষ্ট পরিমাণ।
ফিক্সড রেট ফান্ড ম্যানেজমেন্ট পদ্ধতি ব্যবহার করুন, ফিক্সড লাভ-ক্ষতি হার এবং অর্ডার সামঞ্জস্যের মাত্রা সেট করুন। যখন ফিক্সড রেট লাভ হয় তখন পজিশনটি ফিক্সড মাত্রায় বাড়ান এবং যখন ক্ষতি হয় তখন পজিশনটি হ্রাস করুন।
এই কৌশলটির সুবিধাগুলো হলঃ
ব্রিন-ব্যান্ড-চ্যানেল ব্যবহার করে ট্রেন্ডের দিকনির্দেশনা নির্ধারণ করুন, বিপরীতমুখী ট্রেডিং কৌশল অবলম্বন করুন, এমন সময়ে প্রবেশ করুন যখন দামটি বিপরীত হতে পারে, বেশিরভাগ ঝড় এড়ান এবং হার বাড়ান।
একটি চলমান গড় একটি নির্ভরযোগ্য স্টপ-স্টপ-লস সিগন্যাল হিসাবে কাজ করে যা বেশিরভাগ লাভকে লক করে দেয়।
ফিক্সড ট্রেডিং ভলিউম কৌশলটি সহজ, সহজ এবং জটিল গণনার প্রয়োজন নেই।
ফিক্সড রেট ক্যাপাসিটি ম্যানেজমেন্ট কৌশলটি পজিশন সামঞ্জস্যের মাধ্যমে মুনাফা বাড়ানোর পাশাপাশি ঝুঁকি নিয়ন্ত্রণ করতে পারে।
এই কৌশলটি কিছু ঝুঁকি নিয়েও এসেছেঃ
ব্রিনের সিদ্ধান্তে ভুল সংকেত প্রাপ্তির সম্ভাবনা রয়েছে, যা ট্রেন্ডের বিপরীতে একক ক্ষতির কারণ হতে পারে।
চলমান গড়ের পিছিয়ে যাওয়ার কারণে স্টপডাউন যথেষ্ট পরিমাণে কম হতে পারে।
স্থির ট্রেডিং ভলিউম বাজারের অবস্থার উপর ভিত্তি করে পজিশন সামঞ্জস্য করতে পারে না, পজিশন খুব বড় এবং খুব ছোট সমস্যা রয়েছে।
ফিক্সড রেট ক্যাপিটাল ম্যানেজমেন্ট পদ্ধতিতে পজিশনের প্রসার বেশি হয়, যা ক্ষতির প্রসার ঘটাতে পারে।
প্রতিকারঃ ব্রিনের প্যারামিটারগুলি অনুকূলিতকরণ, সংকেতের নির্ভুলতা বাড়ানো; অন্যান্য সূচকগুলির সাথে মিলিত হয়ে প্রবণতা বিচার করা; স্থির অবস্থানের আকার যথাযথভাবে হ্রাস করা; স্থির অনুপাত তহবিল পরিচালনার জন্য অবস্থানের সামঞ্জস্যের মাত্রা হ্রাস করা।
এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে উন্নত করা যেতে পারেঃ
ব্রিনের প্যারামিটারগুলিকে অপ্টিমাইজ করুন, যেমন n এবং m মানগুলি সামঞ্জস্য করুন, ব্রিনের প্যারামিটারগুলির সঠিকতা বাড়ানোর জন্য।
অন্যান্য সূচক যেমন MACD, KD ইত্যাদি যুক্ত করুন, যাতে ভুল সংকেতগুলি এড়ানো যায়।
স্থির ট্রেডিং ভলিউমকে গতিশীল ট্রেডিং ভলিউমে রূপান্তর করুন এবং বাজারের অবস্থার উপর নির্ভর করে আপনার অবস্থানকে নমনীয়ভাবে সামঞ্জস্য করুন।
ফিক্সড রেট ক্যাপাসিটি ম্যানেজমেন্টের পজিশনে সামঞ্জস্যের মাত্রা কমিয়ে ক্যাপাসিটি কার্ভকে অপ্টিমাইজ করুন।
ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ স্ট্র্যাটেজি যোগ করুন, যেমন, মুভিং স্টপ, ব্রেকিং স্টপ ইত্যাদি।
প্যারামিটার অপ্টিমাইজেশন, প্যারামিটার সমন্বয় স্বয়ংক্রিয়ভাবে অপ্টিমাইজ করা, কৌশল অপ্টিমাইজ করার জন্য সর্বোত্তম প্যারামিটার সন্ধান করা।
এই কৌশলটি সামগ্রিকভাবে একটি সাধারণ ব্রিনব্যান্ড বিপরীতমুখী কৌশল। এটি ব্রিনব্যান্ড ব্যবহার করে প্রবণতা বিপরীতমুখী পয়েন্ট নির্ধারণ করে এবং স্টপ লস, ফিক্সড ট্রেডিং ভলিউম এবং ফিক্সড রেট তহবিল পরিচালনার ঝুঁকি নিয়ন্ত্রণের জন্য একটি চলমান গড় সেট করে। প্রচলিত ব্রিনব্যান্ড কৌশলগুলির তুলনায়, এই কৌশলটি একটি বিপরীতমুখী কৌশল হিসাবে, তাত্ত্বিকভাবে আংশিক ঝাঁকুনি এড়াতে পারে এবং মুনাফার সম্ভাবনা বাড়িয়ে তুলতে পারে। তবে ব্রিনব্যান্ড এবং চলমান গড়ের মতো সূচকগুলির নিজস্ব ত্রুটি রয়েছে।
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66
//This strategy uses the well-known Bollinger Bands Indicator
//@version=5
strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)
//----------------------------------------FUNCTIONS---------------------------------------//
//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)
//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)
//---------------------------------------USER INPUTS--------------------------------------//
//Technical parameters
bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters")
mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters")
smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")
//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Exit SMA
smaExit = ta.sma(close, smaLength)
//BB Calculation
basis = ta.sma(close, bbLength)
dev = mult * ta.stdev(close, bbLength)
upperBB = basis + dev
lowerBB = basis - dev
//Money management
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na
//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//
//Checking if the date belong to the range
inRange := true
//Checking performances of the strategy
if equity > capital_ref + fixedRatio
spread = (equity - capital_ref)/fixedRatio
nb_level = int(spread)
increasingOrder = nb_level * increasingOrderAmount
cashOrder := cashOrder + increasingOrder
capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
spread = (capital_ref - equity)/fixedRatio
nb_level = int(spread)
decreasingOrder = nb_level * increasingOrderAmount
cashOrder := cashOrder - decreasingOrder
capital_ref := capital_ref - nb_level*fixedRatio
//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
strategy.close_all()
debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
//-----------------------------------EXIT SIGNAL------------------------------//
if strategy.position_size > 0 and close < smaExit
strategy.close("Long")
if strategy.position_size < 0 and close > smaExit
strategy.close("Short")
//----------------------------------LONG/SHORT CONDITION---------------------------//
//Long Condition
if close > upperBB and inRange
qty = cashOrder/close
strategy.entry("Long", strategy.long, qty)
//Short Condition
if close < lowerBB and inRange
qty = cashOrder/close
strategy.entry("Short", strategy.short, qty)
//---------------------------------PLOTTING ELEMENT----------------------------------//
plot(smaExit, color=color.orange)
upperBBPlot = plot(upperBB, color=color.blue)
lowerBBPlot = plot(lowerBB, color=color.blue)
fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))