
বুলিন-ব্যান্ড এবং চলমান গড়-রেখার সংমিশ্রণ ট্রেডিং কৌশল হল একটি ট্রেন্ড-ট্র্যাকিং কৌশল যা বাজারের পরিমাণের সাথে কাজ করে। এটি বুলিন-ব্যান্ড এবং চলমান গড়-রেখার ক্রসকে ট্রেডিং সিগন্যাল হিসাবে ব্যবহার করে, একটি পরিমাণগত কৌশল যা বাজারের প্রবণতা স্বয়ংক্রিয়ভাবে সনাক্ত করতে পারে এবং স্টপ-ডাউন-ক্ষতির নিয়মের সাথে ট্রেড করতে পারে।
এই কৌশলটি মূলত বুলিং-ব্যান্ড সূচক এবং চলমান গড়-রেখার সূচকগুলির ক্রস সংকেতের উপর ভিত্তি করে ট্রেড করে। বিশেষত, এটি একই সাথে বুলিং-ব্যান্ডের মধ্যম ট্র্যাক, বুলিং-ব্যান্ডের ট্র্যাকিং এবং 5 থেকে 200 দিনের দৈর্ঘ্যের 7 টি চলমান গড় ব্যবহার করে। যখন দামগুলি নীচে থেকে নীচে বুলিং-ব্যান্ডের মধ্যম ট্র্যাক এবং নীচের ট্র্যাকটি ভেঙে দেয় তখন একটি কেনার সংকেত উত্পন্ন হয়; যখন দামগুলি বুলিং-ব্যান্ডের ট্র্যাকিংয়ের উপরে থেকে নীচে পড়ে তখন বিক্রয় সংকেত উত্পন্ন হয়, ট্রেন্ড ট্র্যাকিং উপলব্ধ করা হয়।
এছাড়াও, কৌশলটি moveToFract এর বহু-ফ্র্যাক্ট বিচারক সূচকটিও চালু করেছে। এই সূচকটি স্বল্পমেয়াদী এবং দীর্ঘমেয়াদী চলমান গড়ের ক্রমিক সজ্জিত পরিস্থিতি গণনা করে, বাজারটির বর্তমান গতিপথটি উর্ধ্বমুখী বা নীচের দিকে রয়েছে, যাতে অস্থির পরিস্থিতিতে ভুল সংকেত তৈরি করা যায় না। অবশেষে, কনফিগারযোগ্য স্টপ-স্টপ-লস নিয়মের সাথে মিলিত হয়ে একটি আরও সম্পূর্ণ ট্রেন্ড-ট্র্যাকিং ট্রেডিং কৌশল গঠন করে।
এই কৌশলটি সামগ্রিকভাবে একটি খুব ব্যবহারিক প্রবণতা ট্র্যাকিং কৌশল। এটি সিদ্ধান্ত নেওয়ার জন্য সূচক ক্রস ব্যবহার করে এবং একটি প্রবণতা বিচার মডিউল যুক্ত করে যা ভুল সংকেতগুলি কার্যকরভাবে মুছে ফেলতে পারে। স্টপ লস কনফিগার করার পরে, ট্রেডিংয়ের জন্য প্রবণতাটি পুরোপুরি অনুসরণ করা যেতে পারে এবং আরও ভাল আয় অর্জন করা যায়। প্যারামিটার প্যারেমিটার এবং আরও ফিল্টার যুক্ত করে, এই কৌশলটি আরও অপ্টিমাইজ করা যেতে পারে, আরও বাজার পরিবেশের সাথে খাপ খাইয়ে নিতে পারে, অনেক উন্নতির জায়গা এবং প্রয়োগের সম্ভাবনা রয়েছে।
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 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/
// © HeWhoMustNotBeNamed
//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)
MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)
BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)
atrLength = input(22)
atrMult = input(6)
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
ma = sma(source, length)
if(MAType == "ema")
ma := ema(source,length)
if(MAType == "hma")
ma := hma(source,length)
if(MAType == "rma")
ma := rma(source,length)
if(MAType == "vwma")
ma := vwma(source,length)
if(MAType == "wma")
ma := wma(source,length)
ma
f_getTrailingStop(atr, atrMult)=>
stop = close - atrMult*atr
stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
stop
f_getMaAlignment(MAType, includePartiallyAligned)=>
ma5 = f_getMovingAverage(close,MAType,5)
ma10 = f_getMovingAverage(close,MAType,10)
ma20 = f_getMovingAverage(close,MAType,20)
ma30 = f_getMovingAverage(close,MAType,30)
ma50 = f_getMovingAverage(close,MAType,50)
ma100 = f_getMovingAverage(close,MAType,100)
ma200 = f_getMovingAverage(close,MAType,200)
upwardScore = 0
upwardScore := close > ma5? upwardScore+1:upwardScore
upwardScore := ma5 > ma10? upwardScore+1:upwardScore
upwardScore := ma10 > ma20? upwardScore+1:upwardScore
upwardScore := ma20 > ma30? upwardScore+1:upwardScore
upwardScore := ma30 > ma50? upwardScore+1:upwardScore
upwardScore := ma50 > ma100? upwardScore+1:upwardScore
upwardScore := ma100 > ma200? upwardScore+1:upwardScore
upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)
exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)
trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)
buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )