মিনটেম ব্রেকআউট বিপরীত ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

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

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

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

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

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

এই কৌশলটির সুবিধাগুলির মধ্যে রয়েছেঃ

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

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

  3. বিপরীতমুখী ট্রেডিং উভয় আপট্রেন্ড এবং ডাউনট্রেন্ড থেকে লাভ করতে পারে।

  4. মাসিক ও বার্ষিক রিটার্ন রেকর্ড করা কৌশলগত কর্মক্ষমতা মূল্যায়ন করা সহজ করে তোলে।

  5. বাজারের রেফারেন্স রিটার্ন যোগ করা কৌশল এবং বাজারের মধ্যে সরাসরি তুলনা করতে সক্ষম করে।

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

এই কৌশলটির কিছু ঝুঁকিঃ

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

  2. নিশ্চিতকরণের পরেই পজিশন খুলতে পারেন।

  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)

আরো