ডাবল মুভিং এভারেজ ক্রসওভার ধ্রুবক আপট্রেন্ড কৌশল

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

img

সারসংক্ষেপ

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

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

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

স্বল্পমেয়াদী ক্রসওভারের ভুল সংকেত এড়াতে, একটি কোণীয় থ্রেশহোল্ড যুক্ত করা হয়, যাতে MA2 কোণটি একটি সেট থ্রেশহোল্ডের উপরে থাকলে কেবল একটি ক্রয় সংকেত ট্রিগার করা হয়। এটি কিছু অ-ট্রেন্ডিং স্বল্পমেয়াদী সমাবেশকে ফিল্টার করে।

এই কৌশলটি স্টপ লস এবং ট্যাক লাভও সেট করে। স্টপ লস হঠাৎ বাজারের বিপরীতের ক্ষেত্রে ক্ষতি এড়ায়, যখন লাভের মধ্যে লাভের লকগুলি নেয়। এগুলি প্রবেশ মূল্য থেকে শতাংশের পরিসীমা হিসাবে সেট করা হয়।

যখন মুনাফা পয়েন্ট নিতে মূল্যের সমাবেশ, কৌশল মুনাফা গ্রহণের জন্য দীর্ঘ বন্ধ হবে। এছাড়াও, যদি সমাবেশ শক্তিশালী হয়, কৌশল গড় বিপরীত জন্য একটি ছোট অবস্থান খুলবে।

সুবিধা বিশ্লেষণ

এটি একটি সহজ এবং স্বজ্ঞাত প্রবণতা অনুসরণকারী কৌশল। সুবিধাগুলি হলঃ

  1. এমএ কম্বো বাজার গোলমাল ফিল্টার করে এবং প্রবণতার দিকে লক করে
  2. কোণীয় থ্রেশহোল্ড স্বল্পমেয়াদী দোল দ্বারা বিভ্রান্ত হওয়া এড়ায়
  3. দ্বি-মুখী ট্রেডিং ব্যাপ্তি সীমাবদ্ধ বাজার থেকে মুনাফা অর্জন করতে সক্ষম করে
  4. স্টপ লস এবং লাভ নিয়ন্ত্রণের ঝুঁকি

ঝুঁকি বিশ্লেষণ

কিছু ঝুঁকি আছে যা লক্ষ্য করা উচিতঃ

  1. এমএগুলির বিলম্ব আছে এবং টার্নিং পয়েন্টগুলি মিস করতে পারে
  2. স্টপ লস গ্যারান্টিযুক্ত নয়, দ্রুত বাজারে গ্যাপ করা যেতে পারে
  3. ডাবল-এজ ট্রেডিং ঝুঁকি দ্বিগুণ করে, শর্ট এন্ট্রি টাইমিং গুরুত্বপূর্ণ
  4. এমএ সময়ের মত প্যারামিটার মিটিং খারাপ ফলাফল প্রভাবিত করতে পারে

উন্নতির ক্ষেত্র

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

  1. সঠিকতা উন্নত করার জন্য ম্যাকডি, বোলিংজার মত ট্রেন্ড ফিল্টার যোগ করুন
  2. মেশিন লার্নিং ব্যবহার করে এমএ সময়ের গতিশীল অপ্টিমাইজ করুন
  3. স্টপ লস এবং লভ্যাংশ সেটিং অপ্টিমাইজ করুন যেমন ট্রেলিং স্টপ
  4. ক্ষতির সীমাবদ্ধতার জন্য পজিশন সাইজিং যোগ করুন
  5. ADX থেকে আকারের গড় বিপরীত অবস্থানের সাথে প্রবণতা শক্তি পরিমাপ করুন

সিদ্ধান্ত

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


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

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

আরো