চলমান গড়ের উপর ভিত্তি করে ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

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

  1. একটি নির্দিষ্ট সময়ের জন্য চলমান গড়ের সূচক হিসাবে ওজনযুক্ত চলমান গড় vwma গণনা করুন (ডিফল্ট 400 সময়কাল) ।

  2. চলমান গড় ভিডব্লিউএমএ বাড়ছে কিনা তা নির্ধারণ করুন, যদি বাড়ছে তবে দীর্ঘ সংকেত আপট্রেন্ড সেট করুন; যদি কমছে তবে সংক্ষিপ্ত সংকেত ডাউনট্রেন্ড সেট করুন।

  3. যখন উর্ধ্বমুখী প্রবণতা সত্য হয়, তখন লম্বা যান; যখন নিম্নমুখী প্রবণতা সত্য হয়, তখন দীর্ঘ বন্ধ করুন এবং সংক্ষিপ্ত যান।

  4. কৌশল রিটার্ন bar_pnl গণনা করুন এবং প্রতিটি বারের জন্য কিনুন এবং ধরে রাখুন রিটার্ন bar_bh।

  5. ত্রৈমাসিক এবং বার্ষিক টাইমস্ট্যাম্প অনুযায়ী, ত্রৈমাসিক কৌশল রিটার্ন ত্রৈমাসিক_pnl, বার্ষিক রিটার্ন বছর_pnl এবং সংশ্লিষ্ট কিনুন & হোল্ড রিটার্ন ত্রৈমাসিক_bh, বছর_bh গণনা করুন।

  6. একটি টেবিলে ত্রৈমাসিক কৌশল রিটার্ন বনাম কিনুন এবং রাখা রিটার্ন দেখান।

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

এই কৌশলটির প্রধান সুবিধাগুলো হল:

  1. পরিচালনা করা সহজ, মুভিং মিডিয়ার মাধ্যমে বাজারের প্রবণতা নির্ধারণ করা সহজ।

  2. ট্রেন্ড অনুসরণ করে ট্রেন্ডহীন বাজারে ক্ষতি কমাতে পারে।

  3. কয়েকটি সামঞ্জস্যযোগ্য পরামিতি। মূলত চলমান গড় সময়ের সামঞ্জস্য করুন, পরীক্ষা এবং অপ্টিমাইজ করা সহজ।

  4. ফলাফল স্পষ্টভাবে দেখানোর জন্য স্বজ্ঞাত রিটার্ন টেবিল।

  5. তুলনা করার জন্য টেবিলে কিনুন এবং হোল্ড রিটার্ন যুক্ত করুন, অতিরিক্ত রিটার্ন দেখায়।

  6. নমনীয় টেবিলের অবস্থান, অন্যান্য কৌশলগুলির সাথে একীভূত করা সহজ।

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

এছাড়াও কিছু ঝুঁকি আছেঃ

  1. দীর্ঘস্থায়ী ষাঁড়ের বাজারে ক্রয় ও হোল্ডের তুলনায় দুর্বল পারফরম্যান্স। চলমান গড় সময়ের অনুকূল করতে পারে।

  2. উচ্চ হুইপসা ঝুঁকি রেঞ্জ বন্ড বাজারে। লেনদেন কমাতে পূর্ববর্তী উচ্চ ভাঙ্গার মত ফিল্টার শর্ত যোগ করতে পারেন।

  3. মুভিং মিডিয়ায় কার্ভ ফিটিংয়ের দুর্বল ক্ষমতা রয়েছে, ট্রেন্ড টার্নিং পয়েন্টগুলি মিস করতে পারে। বিভিন্ন ধরণের মুভিং মিডিয়ার পরীক্ষা করতে পারে।

  4. স্টপ লস মেশিন নেই, বিশাল ড্রডাউন ঝুঁকি আছে।

  5. টেবিলের জন্য, ঝুঁকি পরিমাপ যোগ করতে পারেন যেমন ধারালো অনুপাত, সর্বোচ্চ ড্রাউনডাউন।

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

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

  1. মুভিং মিডিয়ার প্যারামিটার অপ্টিমাইজ করা, বাজার ব্যবস্থার উপর ভিত্তি করে সময়কাল সামঞ্জস্য করা।

  2. ফিল্টার যোগ করুন যেমন পূর্ববর্তী উচ্চতা ভাঙ্গার জন্য whipsaws কমাতে।

  3. বিভিন্ন ধরনের চলমান গড় চেষ্টা করুন, যেমন WMA, DEMA ইত্যাদি

  4. স্টপ লস মেকানিজম যোগ করুন, যেমন ডায়নামিক স্টপ বা পজিশন সাইজিং।

  5. টেবিলের বিষয়বস্তু সমৃদ্ধ করুন, ধারালো অনুপাত, সর্বোচ্চ ড্রাউনডাউন মত মেট্রিক যোগ করুন।

  6. ট্রেন্ড নির্ধারণের জন্য ম্যাকডি, বোলিংজার ব্যান্ডের মতো অন্যান্য সূচকগুলির সাথে একত্রিত করুন।

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

  8. বিভিন্ন পণ্যের উপর পরীক্ষা, সেরা অ্যাপ্লিকেশন সুযোগ খুঁজে.

সিদ্ধান্ত

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


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Dannnnnnny

//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", 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")//

///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3)  != ceil(month(time[1])/3)
new_year  = year(time)  != year(time[1])

eq = strategy.equity

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

cur_quarter_pnl = 0.0
cur_year_pnl  = 0.0
cur_quarter_bh = 0.0
cur_year_bh  = 0.0

// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 : 
                 (1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1 
cur_quarter_bh := new_quarter ? 0.0 : 
                 (1 + cur_quarter_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 Quarterly P&Ls
var quarter_pnl  = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_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)

end_time = false

end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory

if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
    if (end_time[1])
        array.pop(quarter_pnl)
        array.pop(quarter_time)
        
    array.push(quarter_pnl , cur_quarter_pnl[1])
    array.push(quarter_time, time[1])
    array.push(quarter_bh , cur_quarter_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or end_time))
    if (end_time[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])

// Quarterly P&L Table    
var quarterly_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 or pnl < 2 * bh
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if (end_time and enableQuarterlyTable)
    quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(quarterly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(quarterly_table, 1,  0, "Q1",  bgcolor = #cccccc)
    table.cell(quarterly_table, 2,  0, "Q2",  bgcolor = #cccccc)
    table.cell(quarterly_table, 3,  0, "Q3",  bgcolor = #cccccc)
    table.cell(quarterly_table, 4,  0, "Q4",  bgcolor = #cccccc)
    table.cell(quarterly_table, 5,  0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(quarterly_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(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
        
    for mi = 0 to array.size(quarter_time) - 1
        m_row   = year(array.get(quarter_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = ceil(month(array.get(quarter_time, mi)) / 3)
        m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
        
        table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ?  tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)

আরো