আরএসআই এবং ওটিটি ব্যান্ডের কৌশল বিশ্লেষণ

লেখক:চাওঝাং, তারিখ: ২০২৩-০৯-১০ ১৬ঃ২১ঃ২০
ট্যাগঃ

সারসংক্ষেপ

এই কৌশলটির নাম RSI_OTT-TP/SL। এটি ট্রেডিং সিগন্যালগুলি নির্ধারণের জন্য RSI সূচক এবং OTT ব্যান্ডগুলিকে একত্রিত করে, যা প্রবণতা অনুসরণকারী কৌশলগুলির অন্তর্গত। কৌশলটি RSI সূচকের মাধ্যমে বাজারের প্রবণতার দিকনির্দেশ বিচার করে এবং নির্দিষ্ট এন্ট্রি পয়েন্টগুলি সনাক্ত করতে OTT ব্যান্ডগুলি ব্যবহার করে। এটি ব্যবহারকারীদের স্বয়ংক্রিয়ভাবে মুনাফা লক করতে বা ক্ষতি এড়াতে লাভ এবং স্টপ লস অনুপাত সেট করার অনুমতি দেয়।

কৌশলগত যুক্তি

  1. এই কৌশলটি ট্রেন্ড এবং এন্ট্রি পয়েন্ট নির্ধারণের জন্য আরএসআই এবং ওটিটি সূচক ব্যবহার করে।

  2. আরএসআই ব্যবহার করা হয় সামগ্রিক প্রবণতা দিক বিচার করার জন্য। আরএসআই দেখাতে পারে যে বাজারটি ওভারকুপেড বা ওভারসোল্ড হয়েছে কিনা। ওভারকুপেড স্তরের উপরে আরএসআই ক্রসিং একটি কেনার সংকেত, যখন ওভারসোল্ড স্তরের নীচে ক্রসিং একটি বিক্রয় সংকেত। ডিফল্ট আরএসআই দৈর্ঘ্য 6, ওভারকুপেড স্তর 50 এবং ওভারসোল্ড স্তরও এই কৌশলতে 50।

  3. ওটিটি ব্যান্ডগুলি এন্ট্রি পয়েন্টগুলি আবিষ্কার করতে ব্যবহৃত হয়। এগুলি ভোলাটিলিটি রেট অফ চেঞ্জ (ভিএআর) সূচকের উপর ভিত্তি করে গঠিত ব্যান্ড। যখন দাম নীচের ব্যান্ডটি উপরের দিকে ভেঙে যায়, এটি একটি ক্রয় সংকেত। যখন দাম উপরের ব্যান্ডটি নীচে ভাঙে, এটি একটি বিক্রয় সংকেত।

  4. প্রবণতা নির্ধারণ এবং প্রবেশের পয়েন্ট নিশ্চিত করার পরে, এই কৌশলটি যখন দাম ওটিটি ব্যান্ডগুলি ভেঙে দেয় তখন দীর্ঘ বা স্বল্প অবস্থান খুলবে।

  5. ব্যবহারকারীদের কাস্টমাইজ করার জন্য ইনপুট বক্সগুলির মাধ্যমে লাভ এবং স্টপ লস সেট করা যায়। যখন লাভ বা স্টপ লস মূল্য স্পর্শ করা হয় তখন কৌশলটি স্বয়ংক্রিয়ভাবে অবস্থানগুলি বন্ধ করবে।

  6. কৌশলটি শুধুমাত্র লং, শর্ট বা উভয় দিকের ট্রেডিংয়ের অনুমতি দেয়।

সুবিধা

  1. আরএসআই এবং ওটিটি ব্যান্ডের সংমিশ্রণ সঠিক প্রবণতা মূল্যায়নের অধীনে উচ্চ সম্ভাব্যতা প্রবেশের পয়েন্ট খুঁজে পেতে পারে।

  2. ওটিটি ব্যান্ডগুলি গতির সূচক ব্যবহার করে এবং দামের ওঠানামা সম্পর্কে খুব সংবেদনশীল, যা টার্নিং পয়েন্টগুলি দ্রুত সনাক্ত করতে পারে।

  3. লাভ এবং স্টপ লস ফাংশনগুলি লাভকে লক করতে এবং তাদের প্রসারিত হওয়ার আগে ক্ষতি সীমাবদ্ধ করতে সহায়তা করে, যা ঝুঁকি নিয়ন্ত্রণকে উপকৃত করে।

  4. কোডের কাঠামোটি যথেষ্ট পরিমাণে মন্তব্য সহ পরিষ্কার, সহজেই বোঝা যায় এবং সংশোধন করা যায়।

  5. বিভিন্ন বাজারের পরিবেশের সাথে মানিয়ে নিতে ইন্টারফেসের মাধ্যমে কৌশলগত পরামিতিগুলি নমনীয়ভাবে সামঞ্জস্য করা যেতে পারে।

ঝুঁকি

  1. আরএসআই-এর ইস্যুতে বিলম্ব হয় এবং প্রবণতা বিপরীত পয়েন্টগুলি মিস করতে পারে, যা অপ্রয়োজনীয় ক্ষতির দিকে পরিচালিত করে।

  2. ওটিটি ব্যান্ডগুলিও মিথ্যা সংকেত তৈরি করতে পারে। মোমবাতি প্যাটার্ন দিয়ে নিশ্চিত করা ভাল।

  3. ভুল লাভ এবং স্টপ লস সেটিংস কৌশল কর্মক্ষমতা প্রভাবিত করবে। পরামিতি বিভিন্ন পণ্যের জন্য সামঞ্জস্য করা প্রয়োজন।

  4. কৌশলটি শুধুমাত্র একটি পণ্যের উপর ব্যাকটেস্ট করা হয়। লাইভ ট্রেডিংয়ের বিভিন্ন পণ্যের জন্য পরামিতিগুলি পৃথকভাবে অপ্টিমাইজ করা উচিত।

  5. ব্যাকটেস্টের সময় উইন্ডোটি সংক্ষিপ্ত এবং কৌশলটির কার্যকারিতা পুরোপুরি যাচাই করতে পারে না। ব্যাকটেস্টের সময়কাল বাড়ানোর পরামর্শ দেওয়া হয়।

অপ্টিমাইজেশান নির্দেশাবলী

  1. ভুল রেকর্ড হ্রাস করার জন্য ফিল্টারিংয়ের জন্য অন্যান্য সূচক যেমন MACD, KD ইত্যাদি যুক্ত করার কথা বিবেচনা করুন।

  2. মুনাফা গ্রহণ এবং স্টপ লস পরিসীমা পরিবর্তনশীলতার ভিত্তিতে গতিশীলভাবে সামঞ্জস্য করা যেতে পারে।

  3. প্যারামিটার নির্বাচন মানদণ্ড প্রতিষ্ঠার জন্য বিভিন্ন পণ্যের জন্য গবেষণা পরামিতি অপ্টিমাইজেশান।

  4. কৌশলগত পরামিতিগুলিকে গতিশীলভাবে অনুকূল করার জন্য মেশিন লার্নিং পদ্ধতিগুলি চেষ্টা করুন।

  5. ভলিউম নিশ্চিতকরণ যোগ করুন মিথ্যা ব্রেকআউট এড়াতে। প্রবণতা নির্ধারণের জন্য ভলিউম সূচকগুলিও ব্যবহার করা যেতে পারে।

  6. সহজ শতাংশ স্টপ লসের পরিবর্তে স্টপ লস হিসাবে এমএ অনুপ্রবেশ ব্যবহার করার কথা বিবেচনা করুন।

সংক্ষিপ্তসার

সংক্ষেপে, এটি একটি সাধারণ প্রবণতা অনুসরণকারী কৌশল। এটি প্রথমে আরএসআইয়ের মাধ্যমে প্রবণতার দিক বিচার করে, তারপরে নির্দিষ্ট এন্ট্রি পয়েন্টগুলি নির্ধারণে সহায়তা করার জন্য ওটিটি ব্যান্ডগুলি ব্যবহার করে এবং অবশেষে লাভ এবং নিয়ন্ত্রণ ঝুঁকিগুলি লক করার জন্য লাভ গ্রহণ এবং স্টপ লস সেট করে। এই কৌশলটির সুবিধা হ'ল সহজ এবং কার্যকর সূচক সংমিশ্রণ এবং ভাল ব্যাকটেস্ট ফলাফল। তবে আরএসআই লেগ এবং ওটিটি ব্যান্ড মিথ্যা সংকেতের মতো কিছু ঝুঁকিও রয়েছে। এটি আমাদের লাইভ ট্রেডিংয়ে প্যারামিটারগুলি সাবধানে অনুকূল করতে এবং কৌশল স্থায়িত্ব উন্নত করতে নিশ্চিতকরণের জন্য অন্যান্য প্রযুক্তিগত সূচক যুক্ত করতে বলে। অবিচ্ছিন্ন অপ্টিমাইজেশন এবং যাচাইয়ের মাধ্যমে, এই কৌশলটি একটি খুব ব্যবহারিক প্রবণতা অনুসরণকারী কৌশল টেম্পলেট হয়ে উঠতে পারে।


/*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")




আরো