মোমেন্টাম ব্রেকআউট দ্বি-মুখী ট্রেডিং কৌশল


সৃষ্টির তারিখ: 2023-10-27 17:04:48 অবশেষে সংশোধন করুন: 2023-10-27 17:04:48
অনুলিপি: 0 ক্লিকের সংখ্যা: 655
1
ফোকাস
1617
অনুসারী

মোমেন্টাম ব্রেকআউট দ্বি-মুখী ট্রেডিং কৌশল

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি বাজারের প্রবণতার দিকনির্দেশনা নির্ধারণের জন্য ওজনযুক্ত মুভিং এভারেজ ভিডাব্লুএমএ ব্যবহার করে। যখন ভিডাব্লুএমএ বাড়বে, তখন বেশি করুন; যখন ভিডাব্লুএমএ নেমে যাবে, তখন কম করুন।

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

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

সামর্থ্য বিশ্লেষণ

এই কৌশলটির সুবিধাগুলো হলঃ

  1. ভিডাব্লুএমএ ব্যবহার করে প্রবণতা নির্ণয় করা হয়, যা কার্যকরভাবে বাজারের শব্দকে ফিল্টার করে এবং প্রধান প্রবণতাকে ধরে রাখে।

  2. প্রবণতা নিশ্চিত হওয়ার পরই পজিশন খোলার ফলে প্রবণতা বিপরীত হওয়ার ঝুঁকি এড়ানো যায়।

  3. দুই দিকে লেনদেনের মাধ্যমে, আপনি মুনাফা অর্জন করতে পারেন, যখনই বাজার বাড়ে বা কমে যায়।

  4. মাসিক এবং বার্ষিক আয় নথিভুক্ত করুন যাতে কৌশলটির কার্যকারিতা মূল্যায়ন করা যায়।

  5. উপার্জন টেবিলে বাজার বেঞ্চমার্ক উপার্জন যোগ করুন, যাতে আপনি কৌশল এবং বাজারের তুলনামূলক পারফরম্যান্সের সাথে তুলনা করতে পারেন।

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

এই কৌশলটির কিছু ঝুঁকিও রয়েছেঃ

  1. ভিডাব্লুএমএ ব্যবহার করে, ট্রেন্ডটি পিছনে থাকতে পারে এবং ট্রেন্ডের শুরুতে একটি সুযোগ মিস করতে পারে।

  2. ট্রেন্ড নিশ্চিত হওয়ার পরই পজিশন খুলুন, কিছু Movement মিস হতে পারে।

  3. দ্বিপাক্ষিক লেনদেনের জন্য স্টপ লস পয়েন্ট নির্ধারণ করা প্রয়োজন, অন্যথায় ক্ষতি আরও বাড়তে পারে।

  4. বড় বাজার অস্থিরতা একটি স্টপ লস ট্রিগার করতে পারে, যা একটি সম্পূর্ণ প্রবণতা ধরে রাখতে পারে না।

  5. ট্রেন্ড রিভার্সনের সিদ্ধান্ত ভুল হতে পারে, যা ক্ষতির মাত্রা বাড়িয়ে দেয়।

অপ্টিমাইজেশান দিক

এই নীতিটি নিম্নলিখিত দিকগুলি থেকে উন্নত করা যেতে পারেঃ

  1. ভিডাব্লুএমএ চক্রের প্যারামিটারগুলি অনুকূলিতকরণ এবং প্রবণতা বিচার উন্নত করা।

  2. ট্রেন্ডিং নিশ্চিতকরণের দিনগুলিকে সামঞ্জস্য করে, সময়সীমা উন্নত করা।

  3. স্টপ লস কৌশল যুক্ত করুন, একক ক্ষতি নিয়ন্ত্রণ করুন।

  4. অন্য সূচকগুলির সাথে মিলিতভাবে, এটি নিশ্চিত করার জন্য যে প্রবণতাটি বিপরীতমুখী।

  5. পজিশন ম্যানেজমেন্ট অপ্টিমাইজ করুন, বাজারের অবস্থার উপর ভিত্তি করে পজিশন সামঞ্জস্য করুন।

  6. লেনদেনের খরচ বিবেচনা করুন এবং ন্যূনতম লাভ নির্ধারণ করুন।

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
cur_month_bh := new_month ? 0.0 : 
                 (1 + cur_month_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)
var month_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

last_computed = false

if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])

// Monthly P&L Table    
var monthly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if last_computed
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)