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


সৃষ্টির তারিখ: 2023-10-30 15:53:25 অবশেষে সংশোধন করুন: 2023-10-30 15:53:25
অনুলিপি: 3 ক্লিকের সংখ্যা: 611
1
ফোকাস
1617
অনুসারী

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

ওভারভিউ

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

কৌশল নীতি

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

  2. গড়রেখার ভিভিএমএ বৃদ্ধি পেয়েছে কিনা তা নির্ধারণ করুন, যদি এটি বৃদ্ধি পায় তবে এটি একটি মাল্টি-সিগন্যাল আপট্রেন্ড সেট করুন; যদি এটি হ্রাস পায় তবে এটি একটি ডাউনট্রেন্ড সিগন্যাল ডাউনট্রেন্ড সেট করুন

  3. যখন আপট্রেন্ডটি সত্য হয়, তখন আরও কিছু করুন; যখন ডাউনট্রেন্ডটি সত্য হয়, তখন পজিশনটি খালি করুন।

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

  5. কোয়ার্টার_পিএনএল এবং ইয়ার_পিএনএল এর জন্য কৌশলগত রিটার্ন এবং কোয়ার্টার_বিএইচ এবং ইয়ার_বিএইচ এর জন্য ক্রয়-ধারন রিটার্নের জন্য কোয়ার্টার_পিএনএল এবং ইয়ার_বিএইচ এর জন্য বার্ষিক রিটার্ন গণনা করা হয়েছে।

  6. এই টেবিলে প্রতি বছর প্রতি ত্রৈমাসিকের জন্য কৌশলগত রিটার্ন এবং ক্রয়-ধারণের রিটার্ন প্রদর্শিত হয়।

কৌশলগত শক্তি বিশ্লেষণ

এই কৌশলটি মূলত বাজার প্রবণতার দিকনির্দেশের উপর নির্ভর করে এবং এর নিম্নলিখিত সুবিধাগুলি রয়েছেঃ

  1. এটি সহজেই ব্যবহার করা যায়, গড়রেখার সূচক দিয়ে বাজারের গতিবিধি নির্ধারণ করা যায়, এবং এটি সহজেই বোঝা যায়।

  2. প্রবণতা নিয়ন্ত্রণের ক্ষমতা শক্তিশালী, প্রবণতা অপারেশন অনুসরণ করে, এবং কার্যকরভাবে অ প্রবণতা বাজারের ক্ষতি নিয়ন্ত্রণ করতে পারে।

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

  4. ট্যাবুলার ব্যবহার করে আয়-ব্যয়ের দৃশ্যমান উপস্থাপনা করা খুবই সহজ।

  5. উপার্জন টেবিলে ক্রয়-ধারণা উপার্জন যোগ করুন তুলনা করার জন্য, আপনি কৌশলগত বর্ধিত উপার্জন স্পষ্ট করতে পারেন।

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

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

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

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

  2. অস্থির পরিস্থিতিতে whipsaw ঝুঁকি বেশি। পুনরাবৃত্ত লেনদেন কমাতে, ফিল্টারিং শর্তগুলি যুক্ত করার কথা বিবেচনা করা যেতে পারে, যেমন ব্রেকিং-পূর্ব উচ্চতা।

  3. গড়রেখার সিস্টেমটি বক্ররেখার সাথে ভাল ফিট করে না এবং প্রবণতা পাল্টানোর পয়েন্টটি মিস করতে পারে। বিভিন্ন ধরণের গড়রেখার সূচক পরীক্ষা করা যেতে পারে।

  4. একটি স্টপ-লস-এক্সিট মেকানিজম বিবেচনা না করে, একটি বড় প্রত্যাহারের ঝুঁকি রয়েছে। আপনি গতিশীল স্টপ-লস সেট করতে পারেন বা আপনার অবস্থান হ্রাস করার বিষয়ে বিবেচনা করতে পারেন।

  5. ট্যাবুলার অপ্টিমাইজেশনের ক্ষেত্রে, আপনি ঝুঁকিপূর্ণ সূচকগুলি যেমন শার্প অনুপাত, সর্বাধিক প্রত্যাহার এবং আরও অনেক কিছু যুক্ত করতে পারেন।

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

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

  1. গড় লাইন প্যারামিটার অপ্টিমাইজ করুন, গড় লাইন চক্রটি বিভিন্ন বাজারের পরিবেশের সাথে খাপ খাইয়ে নিন।

  2. Whipsaw কমানোর জন্য ফিল্টার শর্তগুলি যুক্ত করুন, যেমন বিপর্যয়ের আগে উচ্চতা।

  3. বিভিন্ন ধরনের গড় চেষ্টা করুন, যেমন ওজনযুক্ত চলমান গড়, দ্বি-সূচক চলমান গড় ইত্যাদি।

  4. স্টপ-অফ-পজিশনে যোগদানের মাধ্যমে, আপনি ডায়নামিক স্টপ-অফ সেট করতে পারেন অথবা আপনার পজিশন কমানোর কথা ভাবতে পারেন।

  5. সূচকের বিষয়বস্তু সমৃদ্ধ করুন, sharpe ratio, সর্বোচ্চ প্রত্যাহার ইত্যাদি যোগ করুন।

  6. MACD, Bollinger Bands ইত্যাদির মতো অন্যান্য সূচকের সাথে মিলিত হয়ে ট্রেন্ড নির্ধারণ করা।

  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)