Hull Moving Average এবং Stochastic RSI সংমিশ্রণ ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

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

এই কৌশলটির মূল উপাদান হল ট্রেন্ডের দিকনির্দেশের জন্য হুল মুভিং এভারেজ এবং টাইমিং এন্ট্রি সিগন্যালের জন্য স্টোকাস্টিক আরএসআই।

প্রথমত, হুল এমএ গণনার মধ্যে মধ্যম, উপরের এবং নীচের ব্যান্ডগুলির জন্য সূত্র অন্তর্ভুক্ত রয়েছে। মধ্যম ব্যান্ডটি একটি ওজনযুক্ত চলমান গড় ব্যবহার করে, যখন উপরের এবং নীচের ব্যান্ডগুলি মধ্যম রেখার থেকে বিচ্যুত হয়।

ট্রেন্ডের দিকটি মাঝারি ব্যান্ড এবং উপরের / নীচের ব্যান্ডগুলির মধ্যে সম্পর্কের দ্বারা নির্ধারিত হয়। মাঝারি রেখার একটি উপরের ক্রসওভার ক্রয় চাপ এবং একটি আপট্রেন্ডের ইঙ্গিত দেয়, যখন একটি নিম্নমুখী ক্রসওভার বিক্রয় চাপ বৃদ্ধি এবং একটি ডাউনট্রেন্ডের সংকেত দেয়।

স্টোকাস্টিক আরএসআই গণনাও সংজ্ঞায়িত করা হয়েছে, যার মধ্যে মসৃণ K এবং D মান অন্তর্ভুক্ত রয়েছে। K মানটি RSI এ একটি SMA মসৃণকরণ ব্যবহার করে, যখন D মানটি K এ দ্বিতীয় SMA মসৃণকরণ।

ট্রেন্ডের দিকনির্দেশনা নির্ধারণের পর, লং ট্রেডগুলি তখন নেওয়া হয় যখন স্টকের আরএসআই K লাইন একটি আপট্রেন্ডের সময় ওভারবয়ড জোন থেকে D লাইনের নীচে অতিক্রম করে। শর্ট ট্রেডগুলি তখন নেওয়া হয় যখন K লাইন একটি ডাউনট্রেন্ডের সময় ওভারসোল্ড জোন থেকে D লাইনের উপরে অতিক্রম করে।

হুল ট্রেন্ড ফিল্টার এবং স্টোক আরএসআই ওভারকুপ/ওভারসোল্ড বিশ্লেষণের সমন্বয় ব্যবসায়ের জন্য একটি শক্তিশালী বহু-ফ্যাক্টর পদ্ধতির প্রস্তাব দেয়।

সুবিধা

এই কৌশলটির প্রধান সুবিধা হল:

  1. হেল এমএ কার্যকরভাবে বাজারের সামগ্রিক প্রবণতা দিক চিহ্নিত করে।

  2. স্টক আরএসআই সময়সূচীতে অতিরিক্ত ক্রয়/অতিরিক্ত বিক্রয়ের মাত্রা নির্ধারণ করে।

  3. উভয়কে একসাথে ব্যবহার করা মিথ্যা সংকেত হ্রাস করে এবং শক্তিগুলিকে একত্রিত করে।

  4. বিভিন্ন প্রতীক এবং সময়সীমার জন্য পরামিতি অপ্টিমাইজ করার নমনীয়তা।

  5. শেল ব্যান্ডগুলি সম্ভাব্য গতিশীল সমর্থন এবং প্রতিরোধের সনাক্ত করে।

  6. পজিশনের আকার এবং ঝুঁকি ব্যবস্থাপনার নিয়ম অন্তর্ভুক্ত করে।

  7. ক্রস ডেটা ডিকশনারির মাধ্যমে মাল্টি-অ্যাসেট সক্ষমতা।

  8. লাভজনকতা বাড়াতে এবং ব্যবহার হ্রাস করতে অপ্টিমাইজযোগ্য উপাদান।

ঝুঁকি

বিবেচনা করার জন্য কিছু ঝুঁকিঃ

  1. হুল এমএ-তে বিলম্ব আছে এবং ট্রেন্ড পরিবর্তন মিস করতে পারে।

  2. স্টকের RSI যদি প্যারামিটারগুলি অপ্টিমাইজ করা না হয় তবে অত্যধিক সংকেত তৈরি করতে পারে।

  3. হুল এবং স্টোক পরামিতিগুলির মধ্যে অসঙ্গতি খারাপ সংকেত সৃষ্টি করতে পারে।

  4. শেল ব্যান্ড খুব প্রশস্ত বা সংকীর্ণ সংকেত মানের প্রভাবিত করবে।

  5. সাম্প্রতিক অস্থির বাজারগুলি মাঝারি ও দীর্ঘমেয়াদী সূচকগুলিকে চ্যালেঞ্জ করে।

  6. হুল এবং স্টোকের মধ্যে ডেটা অসঙ্গতি মিথ্যা সংকেত সৃষ্টি করে।

  7. হুলের দ্বারা লক্ষ্য করা যায় না এমন তীব্র প্রবণতা পরিবর্তন ক্ষতির কারণ হতে পারে।

  8. একাধিক টাইমফ্রেম এবং প্রতীক উপর পরীক্ষার প্রসারিত প্রয়োজন.

এগুলি মোকাবেলা করার কিছু উপায়:

  1. প্রবণতা সংবেদনশীলতা জন্য Hull MA দৈর্ঘ্য সংক্ষিপ্ত।

  2. ভুল ক্রস ফিল্টার করার জন্য স্টোক আরএসআই অপ্টিমাইজ করুন।

  3. শেল ব্যান্ড চ্যানেলের সর্বোত্তম প্রস্থ খুঁজুন।

  4. এমএসিডি-র মতো অতিরিক্ত নিশ্চিতকরণ সূচক যোগ করুন।

  5. ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস কৌশল অন্তর্ভুক্ত করুন।

অপ্টিমাইজেশান সুযোগ

এই কৌশলকে আরও উন্নত করার কিছু উপায়ঃ

  1. দৃঢ়তা যাচাই করার জন্য বিভিন্ন সময়সীমার উপর আরো চিহ্ন পরীক্ষা করুন।

  2. স্টপ লস মেকানিক্স অন্তর্ভুক্ত করুন যেমন ট্রেইলিং স্টপ বা চলমান গড়।

  3. এন্ট্রি নিয়ম অপ্টিমাইজ করুন, মিথ্যা সংকেত কমাতে কঠোর ফিল্টার সেট করুন।

  4. সমর্থন এবং প্রতিরোধের আরও ভালভাবে সংজ্ঞায়িত করার জন্য Hull Bands ব্যবহার করে অন্বেষণ করুন।

  5. সিগন্যালের নির্ভরযোগ্যতা বাড়ানোর জন্য অতিরিক্ত নিশ্চিতকরণ সূচকগুলি মূল্যায়ন করুন।

  6. দৈর্ঘ্য, অতিরিক্ত ক্রয় / অতিরিক্ত বিক্রয় স্তর ইত্যাদির জন্য পরামিতি অপ্টিমাইজেশন

  7. পজিশনের আকার এবং ঝুঁকি ব্যবস্থাপনা আরও ভালভাবে চালু করা।

  8. লাইভ ট্রেডিংয়ের জন্য প্রয়োজনীয় এন্ট্রি, স্টপ লস এবং লাভের নিয়ম।

  9. প্রবণতা সংবেদনশীলতা উন্নত করার জন্য Hull দৈর্ঘ্য অপ্টিমাইজ করুন.

  10. সিগন্যালের গুণমান উন্নত করতে ফিল্টার বা নিশ্চিতকরণ সূচক যুক্ত করুন।

  11. ডাইনামিক সাপোর্ট/রেসিস্ট্যান্স লেভেলের জন্য হুল ব্যান্ডগুলি পরীক্ষা করুন।

  12. স্টকের আরএসআই প্যারামিটার যেমন লং, ওভারকুপ/ওভারসোল্ডের অপ্টিমাইজ করুন।

  13. উন্নত পজিশন সাইজিং এবং ঝুঁকি ব্যবস্থাপনা বাস্তবায়ন করা।

সিদ্ধান্ত

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


/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)

আরো