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

লেখক:চাওঝাং, তারিখঃ 2024-02-05 14:15:40
ট্যাগঃ

img

সারসংক্ষেপ

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

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

প্রথমত, এই কৌশলটি ব্যবহারকারীর দ্বারা সংজ্ঞায়িত চলমান গড়ের ধরণ এবং দৈর্ঘ্যের ভিত্তিতে বেসলাইন চলমান গড় গণনা করে। সাধারণ চলমান গড়গুলির মধ্যে এসএমএ, ইএমএ ইত্যাদি অন্তর্ভুক্ত রয়েছে।

তারপর, এটি ব্যবহারকারীর দ্বারা সংজ্ঞায়িত শতাংশ পরামিতিগুলির উপর ভিত্তি করে উপরের এবং নীচের এনভেলপ লাইনগুলি গণনা করে। উদাহরণস্বরূপ, 5% অর্থ যখন মূল্য বেসলাইন চলমান গড়ের বাইরে 5% পরিবর্তিত হয় তখন অবস্থান স্থাপন করে। এনভেলপ লাইনের সংখ্যা কাস্টমাইজ করা যায়।

এন্ট্রি নিয়মের ক্ষেত্রে, যখন দাম নিম্ন কোষের লাইনের নিচে ভাঙবে তখন লম্বা যান, যখন দাম উপরের কোষের লাইনের উপরে ভাঙবে তখন সংক্ষিপ্ত যান। নিয়মগুলি সহজ এবং সরল।

অবশেষে, যখন মূল্য বেসলাইন চলমান গড়ের নীচে ফিরে আসে তখন সমস্ত পজিশন বন্ধ করুন। এটি প্রবণতা অনুসরণ করার জন্য একটি প্রস্থান পয়েন্ট।

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

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

এই কৌশলটির সবচেয়ে বড় সুবিধাঃ

  1. স্বয়ংক্রিয় প্রবণতা অনুসরণ। প্রবণতা দিক নির্ধারণের জন্য চলমান গড় ব্যবহার করা একটি সুপ্রতিষ্ঠিত পদ্ধতি।

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

  3. আংশিক অবস্থান প্রতিষ্ঠা কৌশল স্থিতিস্থাপকতা বৃদ্ধি করে। এমনকি যদি এক পক্ষ ব্যর্থ হয়, অন্য পক্ষ ভাল চালিয়ে যেতে পারে। এটি সামগ্রিক ঝুঁকি-প্রতিদান অনুপাত অপ্টিমাইজ করে।

  4. কাস্টমাইজযোগ্য চলমান গড় এবং এনভেলপ লাইন নম্বর। এটি বিভিন্ন পণ্যের উপর ভিত্তি করে পরামিতি টিউনিংয়ের জন্য নমনীয়তা বৃদ্ধি করে।

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

এই কৌশলটির প্রধান ঝুঁকিঃ

  1. মুভিং এভারেজ সিস্টেম গোল্ডেন ক্রস সিগন্যালের প্রতি সংবেদনশীল নয়। কোন সুস্পষ্ট প্রবণতা বিদ্যমান না থাকলে এটি কিছু সুযোগ মিস করতে পারে।

  2. খুব প্রশস্ত এনভেলপ লাইন সেটিং ট্রেডিং ফ্রিকোয়েন্সি এবং স্লিপিং ঝুঁকি বাড়িয়ে তুলতে পারে। খুব সংকীর্ণ সেটিং বৃহত্তর সরানো মিস করতে পারে। ভারসাম্য খুঁজে পেতে পুঙ্খানুপুঙ্খ পরীক্ষার প্রয়োজন।

  3. এই কৌশলটি সম্ভবত বিভিন্ন বাজারে আরো whipsaws সম্মুখীন হয়। তাই ট্রেন্ডিং পণ্যগুলি পছন্দসই।

  4. ট্রেড মুনাফা প্রতি আংশিক অবস্থান প্রতিষ্ঠার সীমা। যদি একতরফা বাজি খুঁজছেন, আরও অপ্টিমাইজেশান প্রয়োজন।

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

এই কৌশলটি অপ্টিমাইজ করার প্রধান দিকঃ

  1. অন্যান্য প্রবেশ/প্রস্থান সূচক যেমন KDJ ইত্যাদি দিয়ে প্রতিস্থাপন করুন অথবা একাধিক সূচক সহ ফিল্টার যুক্ত করুন।

  2. স্টপ লাভ/হানি লজিক যোগ করুন। এটি কিছু মুনাফা লক করে এবং সক্রিয়ভাবে কিছু ঝুঁকি হ্রাস করে।

  3. সর্বোত্তম চলমান গড় এবং এনভেলপ সমন্বয় খুঁজে পেতে পরামিতি অপ্টিমাইজ করুন। ব্যাপক ব্যাকটেস্টিং এবং অপ্টিমাইজেশান প্রয়োজন।

  4. স্মার্ট প্যারামিটার টিউনিংয়ের জন্য ডিপ লার্নিং ইত্যাদি অন্তর্ভুক্ত করুন। সময়ের সাথে সাথে ক্রমাগত শিখুন এবং আপডেট করুন।

  5. পণ্য এবং বাজারের পার্থক্য বিবেচনা করুন, বিভিন্ন ট্রেডিং পরিবেশে উপযুক্ত একাধিক প্যারামিটার সেট সেট করুন। এটি কৌশল দৃঢ়তা ব্যাপকভাবে উন্নত করে।

সিদ্ধান্ত

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


/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Envelope Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, pyramiding = 5, commission_type=strategy.commission.percent, commission_value=0.0)

// CopyRight Crypto Robot

src = input(ohlc4, title="Source", group = "Base MA")
ma_base_window = input.int(5, "Base Mooving Average Window", step = 1, group = "Base MA")
ma_type = input.string(defval='1. SMA', options=['1. SMA', '2. PCMA', '3. EMA', '4. WMA', '5. DEMA', '6. ZLEMA', '7. HMA'], title='MA Type', group = "Base MA")


envelope_1_pct = input.float(0.05, "Envelope 1", step = 0.01, group = "Envelopes")
envelope_2_pct = input.float(0.10, "Envelope 2", step = 0.01, group = "Envelopes")
envelope_3_pct = input.float(0.15, "Envelope 3", step = 0.01, group = "Envelopes")
envelope_4_pct = input.float(0.0, "Envelope 4", step = 0.01, group = "Envelopes")
envelope_5_pct = input.float(0.0, "Envelope 5", step = 0.01, group = "Envelopes")

use_longs = input.bool(true, 'Long Positions') 
use_short = input.bool(true, 'Short Positions')

total_envelope = 0
if envelope_1_pct > 0
    total_envelope := total_envelope + 1
if envelope_2_pct > 0
    total_envelope := total_envelope + 1
if envelope_3_pct > 0
    total_envelope := total_envelope + 1
if envelope_4_pct > 0
    total_envelope := total_envelope + 1
if envelope_5_pct > 0
    total_envelope := total_envelope + 1

// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_function(MA_type, MA_length) =>
    zlema_lag = (MA_length - 1) / 2
    hma_src = MA_type == '7. HMA' ? 2 * ta.wma(src, math.floor(MA_length / 2)) - ta.wma(src, MA_length) : na
    MA_type == '1. SMA' ? ta.sma(src, MA_length) : MA_type == '2. PCMA' ? (ta.highest(high, MA_length) + ta.lowest(low, MA_length)) / 2 : MA_type == '3. EMA' ? ta.ema(src, MA_length) : MA_type == '4. WMA' ? ta.wma(src, MA_length) : MA_type == '5. DEMA' ? 2 * ta.ema(src, MA_length) - ta.ema(ta.ema(src, MA_length), MA_length) : MA_type == '6. ZLEMA' ? ta.ema(src + src - src[zlema_lag], MA_length) : MA_type == '7. HMA' ? ta.wma(hma_src, math.floor(math.sqrt(MA_length))) : na

    
ma_base = ma_function(ma_type, ma_base_window)

ma_high_1 = envelope_1_pct > 0 ? ma_base * (1 + envelope_1_pct) : na
ma_high_2 = envelope_2_pct > 0 ? ma_base * (1 + envelope_2_pct) : na
ma_high_3 = envelope_3_pct > 0 ? ma_base * (1 + envelope_3_pct) : na
ma_high_4 = envelope_4_pct > 0 ? ma_base * (1 + envelope_4_pct) : na
ma_high_5 = envelope_5_pct > 0 ? ma_base * (1 + envelope_5_pct) : na

ma_low_1 = envelope_1_pct > 0 ? ma_base * (1 - envelope_1_pct) : na
ma_low_2 = envelope_2_pct > 0 ? ma_base * (1 - envelope_2_pct) : na
ma_low_3 = envelope_3_pct > 0 ? ma_base * (1 - envelope_3_pct) : na
ma_low_4 = envelope_4_pct > 0 ? ma_base * (1 - envelope_4_pct) : na
ma_low_5 = envelope_5_pct > 0 ? ma_base * (1 - envelope_5_pct) : na

// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_1_pct > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / total_envelope))
    if envelope_2_pct > 0 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / total_envelope))
    if envelope_3_pct > 0 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / total_envelope))
    if envelope_4_pct > 0 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / total_envelope))
    if envelope_5_pct > 0 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / total_envelope))


  
if use_short
    if envelope_1_pct > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / total_envelope))
    if envelope_2_pct > 0 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / total_envelope))
    if envelope_3_pct > 0 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / total_envelope))
    if envelope_4_pct > 0 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / total_envelope))
    if envelope_5_pct > 0 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / total_envelope))


strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------

ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)

plot(ohlc4, color=color.purple)

// use_period = input.bool(false, "Période spécifique ?", group="periode")
// startDate = input.time(timestamp("01 Jan 2020"), "Date de début", group="periode")
// endDate = input.time(timestamp("01 Jan 2025"), "Date de fin", group="periode")


//------------------------------------------
//-------------Indicateurs------------------

// inDateRange = use_period ? ((time >= startDate) and (time < endDate)) : true

// //--------------Backtest-------------------

// strategy_pnl = strategy.netprofit + strategy.openprofit
// bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100

// float bnh_start_bar = na
// bnh_start_bar := na(bnh_start_bar[1]) or inDateRange != true? close : bnh_start_bar[1]
// float bnl_buy_hold_equity = na
// bnl_buy_hold_equity :=  inDateRange == true ? ((close - bnh_start_bar)/bnh_start_bar) * 100 : bnl_buy_hold_equity[1]

// bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity
// bnh_diff_color = bnh_vs_diff > 0 ? color.new(color.green, inDateRange ? 60 : 100) : color.new(color.red, inDateRange ? 60 : 100)

// var Table = table.new(position.top_right, columns = 2, rows = 4, border_width = 1, bgcolor = color.black, border_color = color.gray)
// table.cell(table_id = Table, column = 0, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Buy & hold profit")
// table.cell(table_id = Table, column = 1, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnl_buy_hold_equity, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Strategy profit")
// table.cell(table_id = Table, column = 1, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnh_strategy_pnl_pcnt, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 2, text_color=color.yellow, text_size = size.normal, text = "Date de début")
// table.cell(table_id = Table, column = 1, row = 2, text_color=color.yellow, text_size = size.normal, text = str.format("{0,date,dd-MM-YYYY}",strategy.closedtrades.entry_time(1)))

আরো