এই কৌশলটি RSI_OTT-TP/SL নামে পরিচিত। এই কৌশলটি RSI সূচক এবং OTT তরঙ্গের সাথে ট্রেডিং সিগন্যালের বিচারকে একত্রিত করে, এটি একটি প্রবণতা অনুসরণকারী কৌশল। কৌশলটি RSI সূচকের মাধ্যমে বাজারের প্রবণতার দিক নির্ধারণ করে এবং OTT তরঙ্গের সাথে নির্দিষ্ট প্রবেশের স্থান নির্ধারণ করে। কৌশলটি ব্যবহারকারীদের স্টপ লস অনুপাত সেট করার অনুমতি দেয় যা স্বয়ংক্রিয়ভাবে লাভ লক করতে বা ক্ষতি এড়াতে স্টপ লস করতে পারে।
এই কৌশলটি RSI এবং OTT উভয় সূচক ব্যবহার করে প্রবণতা এবং এন্ট্রি পয়েন্ট নির্ধারণ করে।
আরএসআই একটি সামগ্রিক প্রবণতা দিক নির্ণয় করার জন্য ব্যবহৃত হয়। আরএসআই সূচকটি বাজারকে ওভারবয় বা ওভারসেল হিসাবে দেখাতে পারে। আরএসআইয়ের উপরে ওভারবয় অঞ্চলটি ওভারবয় সংকেত হিসাবে সেট করা হয় এবং নীচের ওভারবয় অঞ্চলটি ওভারবয় অঞ্চল হিসাবে সেট করা হয়। এই কৌশলটি ডিফল্ট আরএসআই দৈর্ঘ্য 6 এবং ওভারবয় লাইন 50 এবং ওভারবয় অঞ্চল 50।
ওটিটি ওয়েভব্যান্ডটি প্রবেশের পয়েন্টগুলি সনাক্ত করার জন্য ব্যবহৃত হয়। এটি একটি তরঙ্গদণ্ড যা ওভাররেট সূচক ভিএআর এর উপর ভিত্তি করে গঠিত হয়। যখন দাম নীচে থেকে উপরে ওটিটি ডাউনট্র্যাকটি ভেঙে যায় তখন এটি একটি মাল্টি সিগন্যাল হিসাবে কাজ করে; যখন দাম উপরে থেকে নীচে ওটিটি আপট্র্যাকটি ভেঙে যায় তখন এটি একটি ফাঁকা সিগন্যাল হিসাবে কাজ করে।
প্রবণতা নির্ণয় এবং প্রবেশের পয়েন্ট নিশ্চিত করার পরে, এই কৌশলটি ওটিটি রেঞ্জ ভেঙে পজিশনে বেশি বা কম করবে।
স্টপ স্টপ লস ইনপুট বক্স সেট করে যা ব্যবহারকারীকে সেট করতে দেয়। স্টপ বা স্টপ লস মূল্য ট্রিগার হওয়ার পরে কৌশলটি স্বয়ংক্রিয়ভাবে খালি হয়ে যায়।
এই কৌশলটি কেবলমাত্র ওভার, কেবলমাত্র শূন্য বা দ্বি-মুখী লেনদেনের অনুমতি দেয়।
আরএসআই এবং ওটিটি ব্যান্ডের সংমিশ্রণে, প্রবণতা নির্ণয়ের সঠিকতার উপর ভিত্তি করে উচ্চ সম্ভাব্য প্রবেশের পয়েন্টগুলি খুঁজে পাওয়া যায়।
ওটিটি ব্যান্ডটি গতিশীলতার সূচক ব্যবহার করে এবং দামের ওঠানামা সম্পর্কে খুব সংবেদনশীল, যা টার্নিং পয়েন্টগুলিকে অগ্রিম সনাক্ত করতে পারে।
কৌশলটি স্টপ-অফ-লস ফাংশন সরবরাহ করে, যা মুনাফা লক করতে পারে, বা ক্ষতির বিস্তার হওয়ার আগে স্টপ-অফ-আউট করতে পারে, যা ঝুঁকি নিয়ন্ত্রণের পক্ষে সহায়ক।
কোডের কাঠামো পরিষ্কার, যথেষ্ট টীকা দেওয়া, সহজে বোঝা যায় এবং পরিবর্তন করা যায়।
কৌশলগত প্যারামিটারগুলি ইন্টারফেসের মাধ্যমে নমনীয়ভাবে পরিবর্তিত হতে পারে এবং বিভিন্ন বাজারের অবস্থার সাথে মানিয়ে নিতে পারে।
আরএসআই সূচকটি পিছিয়ে রয়েছে এবং প্রবণতা পাল্টাতে পারে, যার ফলে অপ্রয়োজনীয় ক্ষতি হতে পারে।
ওটিটি ব্যান্ডেও ভুল সংকেত তৈরি হতে পারে, যাচাই করার জন্য কে-লাইন ফর্ম্যাট ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।
ভুল স্টপ লস সেটিংও কৌশলগত কর্মক্ষমতাকে প্রভাবিত করে এবং বিভিন্ন জাতের জন্য প্যারামিটারগুলি সামঞ্জস্য করতে হয়।
এই কৌশলটি শুধুমাত্র একক জাতের উপর ভিত্তি করে তৈরি করা হয়েছে, এবং বিভিন্ন জাতের জন্য পৃথকভাবে অপ্টিমাইজ করা প্রয়োজন।
প্রতিক্রিয়া সময় উইন্ডোটি সংক্ষিপ্ত, এবং কৌশলটির কার্যকারিতা সম্পূর্ণরূপে যাচাই করা অসম্ভব। প্রতিক্রিয়া চক্রটি প্রসারিত করার পরামর্শ দেওয়া হচ্ছে।
ভর্তির ভুল তথ্য কমিয়ে আনতে অন্যান্য সূচক যেমন MACD, KD ইত্যাদির মধ্যে ফিল্টারিং বিবেচনা করা যেতে পারে।
স্টপ লস এর মাত্রা পরিবর্তনশীলভাবে পরিবর্তনশীলতার উপর ভিত্তি করে সামঞ্জস্য করা যায়।
বিভিন্ন জাতের প্যারামিটার অপ্টিমাইজেশান নিয়ে গবেষণা করা যায়, প্যারামিটার নির্বাচনের মানদণ্ড তৈরি করা যায়।
মেশিন লার্নিং পদ্ধতি ব্যবহার করে ডায়নামিকভাবে অপ্টিমাইজ করা যেতে পারে।
ভলিউম নিশ্চিতকরণ যোগ করা যেতে পারে, মিথ্যা ব্রেকডাউন এড়াতে। এছাড়াও গড় পরিমাপ পরিমাপ ব্যবহার করে প্রবণতা বিচার করা যেতে পারে।
এমএ-এর মধ্য দিয়ে চলাচলকে স্টপ হিসেবে বিবেচনা করা যেতে পারে, কেবলমাত্র অনুপাতগত স্টপ হিসেবে নয়।
এই কৌশলটি সামগ্রিকভাবে একটি সাধারণ প্রবণতা অনুসরণকারী কৌশল। এটি প্রথমে আরএসআই দ্বারা প্রবণতার দিক নির্ধারণ করে, তারপরে ওটিটি ব্যান্ডের সহায়তায় নির্দিষ্ট প্রবেশের সময় নির্ধারণ করে, এবং অবশেষে লাভের জন্য লকিং এবং ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস সেট করে। এই কৌশলটির সুবিধা হল যে সূচক প্যারেন্টারটি সহজ এবং কার্যকর, রিটার্নের পারফরম্যান্সও ভাল। তবে কিছু সমস্যা রয়েছে, যেমন আরএসআই পিছিয়ে পড়া, ব্যান্ডের ভুল রিপোর্টিং ইত্যাদির মতো ঝুঁকি রয়েছে। এর জন্য আমাদের রিয়েল-স্টোর প্রয়োগের সময় প্যারামিটারগুলির সূক্ষ্ম অপ্টিমাইজেশন করা দরকার, তবে অন্যান্য প্রযুক্তিগত সূচকগুলিও নিশ্চিত করা যেতে পারে, যার ফলে কৌশলটির স্থায়িত্ব বাড়তে পারে। যদি এই কৌশলটি ক্রমাগত অপ্টিমাইজ এবং যাচাই করা যায় তবে এটি একটি খুব ব্যবহারিক প্রবণতা অনুসরণকারী কৌশল টেম্পলেট হতে পারে।
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 2h
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/
// © BigCoinHunter
//@version=5
strategy(title="RSI_OTT-TP/SL", overlay=true,
pyramiding=0, default_qty_type=strategy.percent_of_equity,
default_qty_value=100, initial_capital=1000,
currency=currency.USD, commission_value=0.05,
commission_type=strategy.commission.percent,
process_orders_on_close=true)
//----------- get the user inputs --------------
//---------- RSI -------------
price = input(close, title="Source")
RSIlength = input.int(defval=6,title="RSI Length")
RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1)
RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1)
//------- OTT Bands ----------------
src = close
length=input.int(defval=1, title="OTT Period", minval=1)
percent=input.float(defval=5, title="OTT Percent", step=0.1, minval=0.001)
mav = input.string(title="OTT MA Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
ottUpperPercent = input.float(title="OTT Upper Line Coeff", defval=0.01, minval = 0.001, step=0.001)
ottLowerPercent = input.float(title="OTT Lower Line Coeff", defval=0.01, minval = 0.001, step=0.001)
Var_Func(src,length)=>
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=math.sum(vud1,9)
vDD=math.sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*math.abs(vCMO)*src)+(1-valpha*math.abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
Wwma_Func(src,length)=>
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
zxLag = length/2==math.round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ta.ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
lrc = ta.linreg(src, length, 0)
lrc1 = ta.linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = ta.linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
getMA(src, length) =>
ma = 0.0
if mav == "SMA"
ma := ta.sma(src, length)
ma
if mav == "EMA"
ma := ta.ema(src, length)
ma
if mav == "WMA"
ma := ta.wma(src, length)
ma
if mav == "TMA"
ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
ma
if mav == "VAR"
ma := VAR
ma
if mav == "WWMA"
ma := WWMA
ma
if mav == "ZLEMA"
ma := ZLEMA
ma
if mav == "TSF"
ma := TSF
ma
ma
MAvg=getMA(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200
light_green=#08ff12
light_red=#fe0808
OTTupper = nz(OTT[2])*(1+ottUpperPercent)
OTTlower = nz(OTT[2])*(1-ottLowerPercent)
p1 = plot(OTTupper, color=light_green, linewidth=1, title="OTT UPPER")
p2 = plot(nz(OTT[2]), color=color.new(color.yellow,0), linewidth=1, title="OTT MIDDLE")
p3 = plot(OTTlower, color=light_red, linewidth=1, title="OTT LOWER")
fill(plot1=p1, plot2=p3, title="OTT Background", color=color.new(color.aqua,90), fillgaps=false, editable=true)
buyEntry = ta.crossover(src, OTTlower)
sellEntry = ta.crossunder(src, OTTupper)
//---------- input TP/SL ---------------
tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss: ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
isEntryLong = input.bool(defval=true, title= 'Long Entry', inline="11")
isEntryShort = input.bool(defval=true, title='Short Entry', inline="11")
//---------- backtest range setup ------------
fromDay = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input.int(defval = 2022, title = "To Year", minval = 2010)
//------------ time interval setup -----------
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window
window() => true // create function "within window of time"
//------- define the global variables ------
var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false
//--------- Colors ---------------
//TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na
//bgcolor(switch2?(color.new(TrendColor,50)):na)
//--------- calculate the input/output points -----------
longProfitPrice = strategy.position_avg_price * (1 + tp) // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl) // sl -> stop loss percentage
shortProfitPrice = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)
//---------- RSI + Bollinger Bands Strategy -------------
vrsi = ta.rsi(price, RSIlength)
rsiCrossOver = ta.crossover(vrsi, RSIoverSold)
rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought)
OTTCrossOver = ta.crossover(src, OTTlower)
OTTCrossUnder = ta.crossunder(src, OTTupper)
if (not na(vrsi))
if rsiCrossOver and OTTCrossOver
long := true
if rsiCrossUnder and OTTCrossUnder
long := false
//------- define the global variables ------
buySignall = false
sellSignall = false
//------------------- determine buy and sell points ---------------------
buySignall := window() and long and (not stoppedOutLong)
sellSignall := window() and (not long) and (not stoppedOutShort)
//---------- execute the strategy -----------------
if(isEntryLong and isEntryShort)
if long
strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG")
stoppedOutLong := true
stoppedOutShort := false
else
strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT")
stoppedOutLong := false
stoppedOutShort := true
else if(isEntryLong)
strategy.entry("LONG", strategy.long, when = buySignall)
strategy.close("LONG", when = sellSignall)
if long
stoppedOutLong := true
else
stoppedOutLong := false
else if(isEntryShort)
strategy.entry("SHORT", strategy.short, when = sellSignall)
strategy.close("SHORT", when = buySignall)
if not long
stoppedOutShort := true
else
stoppedOutShort := false
//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
if ( strategy.position_size > 0 )
strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger")
else if ( strategy.position_size < 0 )
strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger")
else if(tp>0.0)
if ( strategy.position_size > 0 )
strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger")
else if ( strategy.position_size < 0 )
strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger")
else if(sl>0.0)
if ( strategy.position_size > 0 )
strategy.exit(id="LONG", stop=longStopPrice, comment="Long SL Trigger")
else if ( strategy.position_size < 0 )
strategy.exit(id="SHORT", stop=shortStopPrice, comment="Short SL Trigger")