ডায়নামিক মুভিং এভারেজ ক্রসওভার ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

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

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

b = abs(close-open)/(high - low)
c = min(max(b, 0), 1)  
Ratio OCHL Averager = c*close + (1-c)*previous Ratio OCHL Averager

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

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

সুবিধা

  1. Ratio OCHL Averager মূল্যের তথ্যকে মসৃণ করে এবং বাজারের গোলমালকে ফিল্টার করে, ট্রেডিং সিগন্যালকে আরো নির্ভরযোগ্য করে তোলে।

  2. বিভিন্ন সময়সীমার সাথে মিলিত দ্বৈত চলমান গড় ক্রসওভার একটি নতুন প্রবণতার সূচনা আরও ভালভাবে সনাক্ত করতে পারে।

  3. দ্রুত এবং ধীর লাইনের সময়গুলি বিভিন্ন বাজারের অবস্থার জন্য সামঞ্জস্য করা যেতে পারে।

  4. কৌশলগত যুক্তি সহজ এবং স্বজ্ঞাত। বোঝা এবং বাস্তবায়ন করা সহজ।

  5. ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস এবং লাভ নিতে নমনীয়ভাবে সেট করা যেতে পারে।

ঝুঁকি

  1. চলমান গড় ক্রসওভার অত্যধিক মিথ্যা সংকেত তৈরি করতে পারে। ফিল্টারিংয়ের জন্য অন্যান্য প্রযুক্তিগত সূচক প্রয়োজন হতে পারে।

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

  3. এটি একটি প্রবণতা অনুসরণকারী কৌশল যা ব্যাপ্তি-বান্ধব বাজারের জন্য উপযুক্ত নয়। প্রবণতা অবস্থার মধ্যে এটি ব্যবহার করা উচিত।

  4. হ্রাস হ্রাস এবং লাভের স্তরকে অনুকূল করার জন্য স্টপ লস এবং লাভ গ্রহণকে যথাযথভাবে সামঞ্জস্য করা উচিত।

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

  1. সিগন্যাল ফিল্টারিং এবং মানের উন্নতির জন্য এমএসিডি, কেডিজে এর মতো গতির সূচক একত্রিত করার কথা বিবেচনা করুন।

  2. সর্বোত্তম পরামিতি খুঁজে পেতে বিভিন্ন দ্রুত এবং ধীর লাইন সময়ের সমন্বয় পরীক্ষা করুন।

  3. ব্যাকটেস্টের ফলাফলের উপর ভিত্তি করে স্টপ লস এবং লাভের অপ্টিমাইজ করুন।

  4. নির্দিষ্ট বাজারের পরিস্থিতিতে গতিশীলভাবে পরামিতিগুলি সামঞ্জস্য করার বিষয়টি বিবেচনা করুন, উদাহরণস্বরূপ, একটি পরিসীমা-সীমাবদ্ধ বাজারে সময়কাল বাড়ান।

সিদ্ধান্ত

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


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end

আরো