ডাবল মুভিং এভারেজ ক্রসওভার কৌশল

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

img

সারসংক্ষেপ

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

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

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

এমএ সময়কালের সংমিশ্রণগুলিকে সামঞ্জস্য করে, কৌশলটি প্রবণতার সময়সীমাটি ক্যাপচার করতে সামঞ্জস্য করতে পারে। স্বল্পমেয়াদী এমএ কম্বোগুলি স্বল্পমেয়াদী দোলগুলিকে লক্ষ্য করে, যখন দীর্ঘমেয়াদী এমএ কম্বোগুলি শব্দটি ফিল্টার করে এবং কেবল দীর্ঘমেয়াদী প্রবণতাগুলিতে ফোকাস করে।

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

সুবিধা

ডাবল এমএ কৌশল নিম্নলিখিত প্রান্ত আছেঃ

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

ঝুঁকি

এছাড়াও কিছু ঝুঁকি রয়েছে যা বিবেচনা করা উচিতঃ

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

এই দুর্বলতাগুলি ফিল্টারিং সংকেত, ট্রেলিং স্টপ লস ইত্যাদির মতো অপ্টিমাইজেশনের মাধ্যমে প্রশমিত করা যেতে পারে।

উন্নতির সুযোগ

কৌশলটি নিম্নলিখিত দিকগুলির মধ্যে উন্নত করা যেতে পারেঃ

  1. ভলিউম বা অস্থিরতার উপর ফিল্টার যোগ করা যাতে whipsaws এড়ানো যায়;
  2. বিভিন্ন পণ্য এবং সময়সীমার সাথে সামঞ্জস্য রেখে আরও বেশি সংখ্যক মঞ্জুরি প্রকার এবং সূক্ষ্ম সমন্বয় সময়সীমা/ফর্মুলা পরীক্ষা করা;
  3. দ্রুততম মূল্য ট্র্যাকিংয়ের জন্য ইএমএ, এলডব্লিউএমএ এর মতো এমএ ধরণের পরীক্ষা করা;
  4. মেশিন লার্নিং দিয়ে এমএ টিউনিং এবং স্টপ লস সাইজিং স্বয়ংক্রিয়করণ;
  5. বিকল্প স্টপ লস কৌশল যেমন গ্যাপ, গড় মূল্য, চ্যান্ডেলিয়ার।

এই বৃদ্ধির ফলে জয়ের হার উল্লেখযোগ্যভাবে বৃদ্ধি পাবে এবং ঝুঁকি সামঞ্জস্য করে আয় হবে বলে আশা করা হচ্ছে।

সিদ্ধান্ত

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


/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

আরো