এই কৌশলটি প্রবণতা দিক নির্ধারণের জন্য বিভিন্ন সময়ের সাথে দুটি সহজ চলমান গড়ের ক্রসওভার ব্যবহার করে এবং যখন প্রবণতা উপস্থিত হয় তখন ব্যবসায় প্রবেশ করে। একই সাথে, কৌশলটি বিভিন্ন সময় স্কেলগুলিতে কৌশলটির প্রত্যাশিত রিটার্ন গণনা এবং প্রদর্শন করার জন্য একটি প্রত্যাশিত মান প্যানেলও প্রবর্তন করে, যা ব্যবহারকারীদের কৌশলটির কার্যকারিতা আরও ভালভাবে মূল্যায়ন করতে দেয়। প্রত্যাশিত মান প্যানেলটি কৌশলটির জয় হার, গড় মুনাফা এবং ঐতিহাসিক সময়ের মধ্যে গড় ক্ষতির মতো মূল সূচকগুলি বিবেচনা করে এবং বিভিন্ন বাজারের অবস্থার অধীনে কৌশলটির কার্যকারিতা স্বজ্ঞাতভাবে উপস্থাপন করে।
এই কৌশলটির মূল বিষয় হ'ল বাজার প্রবণতা নির্ধারণের জন্য বিভিন্ন সময়কালের (এই উদাহরণে 14 দিন এবং 28 দিন) দুটি সহজ চলমান গড়ের ক্রসওভার ব্যবহার করা। যখন স্বল্পমেয়াদী গড় নীচে থেকে দীর্ঘমেয়াদী গড়ের উপরে অতিক্রম করে, তখন এটি বিবেচনা করা হয় যে বাজারটি একটি ঊর্ধ্বমুখী প্রবণতায় প্রবেশ করেছে এবং কৌশলটি একটি দীর্ঘ অবস্থান খোলে। বিপরীতভাবে, যখন স্বল্পমেয়াদী গড় উপরে থেকে দীর্ঘমেয়াদী গড়ের নীচে অতিক্রম করে, তখন এটি বিবেচনা করা হয় যে বাজারটি একটি নেমে যাওয়ার প্রবণতায় প্রবেশ করেছে এবং কৌশলটি একটি শর্ট অবস্থান খোলে। এইভাবে, কৌশলটি বিভিন্ন বাজারের প্রবণতার সাথে খাপ খাইয়ে নিতে পারে এবং প্রবণতা দ্বারা আনা মুনাফা ক্যাপচার করার জন্য প্রবণতা প্রদর্শিত হলে সময়মত অবস্থান স্থাপন করতে পারে।
মৌলিক প্রবণতা নির্ধারণ এবং ট্রেডিং লজিক ছাড়াও, কৌশলটি বিভিন্ন সময় স্কেল (মাসিক এবং বার্ষিক) এ কৌশলটির প্রত্যাশিত রিটার্ন গণনা এবং প্রদর্শন করার জন্য একটি প্রত্যাশিত মূল্য প্যানেলও প্রবর্তন করে। প্রত্যাশিত মূল্যের গণনা ঐতিহাসিক সময়কালে কৌশলটির মূল পরিসংখ্যানগত সূচকগুলির উপর ভিত্তি করে, যার মধ্যে রয়েছেঃ
এই সূচকগুলি ব্যবহার করে, সেই সময়ের মধ্যে কৌশলটির প্রত্যাশিত মূল্য গণনা করা যেতে পারেঃ প্রত্যাশিত মূল্য = জয়ের হার × গড় লাভ - (1 - জয়ের হার) × গড় ক্ষতি
বিভিন্ন সময়কালের প্রত্যাশিত মানগুলিকে একটি হিটম্যাপের আকারে চার্টে প্রদর্শন করে, ব্যবহারকারীরা বিভিন্ন বাজারের অবস্থার অধীনে কৌশলটির প্রত্যাশিত পারফরম্যান্স এক নজরে দেখতে পারেন, এইভাবে কৌশলটির প্রয়োগযোগ্যতা এবং ঝুঁকি আরও ভালভাবে বুঝতে পারে।
প্রবণতার সাথে দৃঢ় অভিযোজনযোগ্যতাঃ প্রবণতা নির্ধারণের জন্য চলমান গড় ক্রসওভার ব্যবহার করে, কৌশলটি বাজারের পরিবর্তনের সাথে মানিয়ে নিতে বিভিন্ন বাজারের প্রবণতার অধীনে সময়মতো অবস্থানগুলি সামঞ্জস্য করতে পারে। এটি কৌশলকে প্রবণতা বাজারে ভাল রিটার্ন অর্জন করতে সক্ষম করে।
স্বজ্ঞাত পারফরম্যান্স মূল্যায়নঃ অন্তর্নির্মিত প্রত্যাশিত মূল্য প্যানেল একটি হিটম্যাপ আকারে বিভিন্ন সময়কালে কৌশলটির প্রত্যাশিত রিটার্ন প্রদর্শন করে, যা ব্যবহারকারীদের এক নজরে বিভিন্ন বাজারের অবস্থার অধীনে কৌশলটির পারফরম্যান্স মূল্যায়ন করতে দেয়। এই ভিজ্যুয়ালাইজড পারফরম্যান্স উপস্থাপনা ব্যবহারকারীদের আরও সিদ্ধান্ত গ্রহণের রেফারেন্স সরবরাহ করে।
মূল পরিসংখ্যানগত সূচকগুলি বিবেচনা করাঃ প্রত্যাশিত মূল্যের গণনা কেবল কৌশলটির জয়ের হার বিবেচনা করে না, তবে গড় মুনাফা এবং গড় ক্ষতির প্রভাবও সংহত করে। এই গণনার পদ্ধতিটি কৌশলটির প্রকৃত কার্যকারিতা আরও ব্যাপক এবং নির্ভুলভাবে প্রতিফলিত করতে পারে, ব্যবহারকারীদের আরও নির্ভরযোগ্য রেফারেন্স সরবরাহ করে।
নমনীয় পরামিতি সেটিংসঃ ব্যবহারকারীরা তাদের প্রয়োজন অনুযায়ী প্রত্যাশিত মান প্যানেল এবং এর স্বচ্ছতা প্রদর্শন করতে পারেন কিনা তা নমনীয়ভাবে সেট করতে পারেন। এটি ব্যবহারকারীদের তাদের পছন্দ অনুযায়ী চার্ট প্রদর্শন প্রভাব সামঞ্জস্য করতে দেয়, ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।
ব্যাপ্তিভুক্ত বাজারে দুর্বল পারফরম্যান্সঃ যেহেতু কৌশলটি মূলত মুনাফা অর্জনের জন্য প্রবণতার উপর নির্ভর করে, তাই ব্যাপ্তিভুক্ত বা প্রবণতা-অস্পষ্ট বাজারের অবস্থার মধ্যে ঘন ঘন ট্রেডিং উল্লেখযোগ্য স্লিপ এবং লেনদেনের ব্যয় হতে পারে, যা কৌশলটির সামগ্রিক পারফরম্যান্সকে প্রভাবিত করে।
প্রত্যাশিত মূল্য গণনার সীমাবদ্ধতাঃ যদিও প্রত্যাশিত মূল্য প্যানেল কৌশল কর্মক্ষমতা মূল্যায়ন করার একটি স্বজ্ঞাত উপায় সরবরাহ করে, এটি এখনও হিসাবের জন্য historicalতিহাসিক তথ্যের উপর ভিত্তি করে। যখন বাজারে উল্লেখযোগ্য পরিবর্তন ঘটে বা চরম পরিস্থিতি দেখা দেয়, তখন historicalতিহাসিক তথ্য কৌশলটির প্রকৃত কর্মক্ষমতাকে ভালভাবে প্রতিফলিত করতে পারে না এবং প্রত্যাশিত মূল্যের রেফারেন্স মান হ্রাস পেতে পারে।
প্যারামিটার নির্বাচনের বড় প্রভাবঃ কৌশলটির কর্মক্ষমতা মূলত চলমান গড় সময়ের নির্বাচনের উপর নির্ভর করে। বিভিন্ন সময়ের সংমিশ্রণ সম্পূর্ণ ভিন্ন ট্রেডিং ফলাফল আনতে পারে। যদি নির্বাচিত প্যারামিটারগুলি বাজারের বৈশিষ্ট্যগুলির সাথে ভালভাবে মানিয়ে নিতে না পারে তবে কৌশলটির প্রকৃত কর্মক্ষমতা প্রত্যাশিত মান থেকে উল্লেখযোগ্যভাবে বিচ্যুত হতে পারে।
আরও প্রযুক্তিগত সূচক প্রবর্তন করুনঃ বিদ্যমান চলমান গড়ের ভিত্তিতে, ম্যাকডি এবং আরএসআই এর মতো অন্যান্য প্রযুক্তিগত সূচকগুলিকে ট্রেন্ডের শক্তি এবং টেকসইতা আরও ভালভাবে নির্ধারণের জন্য বিবেচনা করা যেতে পারে, যার ফলে কৌশল প্রবেশ এবং প্রস্থানগুলির সময়কাল উন্নত হয়।
পজিশন ম্যানেজমেন্ট অপ্টিমাইজ করুন: বর্তমানে, ট্রেডিং সিগন্যাল প্রদর্শিত হলে কৌশলটি একটি স্থির পজিশন পদ্ধতি গ্রহণ করে। ঝুঁকিগুলি আরও ভালভাবে নিয়ন্ত্রণ করতে এবং রিটার্ন বাড়ানোর জন্য বাজারের অস্থিরতা এবং প্রবণতার শক্তির মতো কারণগুলির উপর ভিত্তি করে অবস্থানগুলিকে গতিশীলভাবে সামঞ্জস্য করার বিষয়টি বিবেচনা করা যেতে পারে।
স্টপ-লাভ এবং স্টপ-লস প্রক্রিয়া যুক্ত করুনঃ কৌশলটিতে যুক্তিসঙ্গত স্টপ-লাভ এবং স্টপ-লস প্রক্রিয়া যুক্ত করা কৌশলটিকে সম্ভাব্য ক্ষতিগুলি সীমাবদ্ধ করার সময় বিদ্যমান লাভগুলিতে সময়মতো লক করতে সহায়তা করতে পারে। এটি কৌশলটির ঝুঁকি-পুরষ্কার অনুপাত উন্নত করতে এবং বিভিন্ন বাজারের পরিবেশে তুলনামূলকভাবে স্থিতিশীল কর্মক্ষমতা বজায় রাখতে সহায়তা করে।
প্রত্যাশিত মূল্যের হিসাবকে অনুকূল করাঃ প্রত্যাশিত মূল্যের হিসাব পদ্ধতি আরও অনুকূল করা যেতে পারে, যেমন লেনদেনের ব্যয় বিবেচনা করা এবং প্রত্যাশিত মূল্য সূচকের কার্যকারিতা এবং ব্যবহারিকতা উন্নত করার জন্য চলমান উইন্ডো প্রবর্তন করা। তদতিরিক্ত, ব্যবহারকারীদের আরও বিস্তৃত রেফারেন্স সরবরাহ করার জন্য অন্যান্য কৌশল কর্মক্ষমতা মূল্যায়ন সূচকগুলি অনুসন্ধান করা যেতে পারে।
এই কৌশলটি চলমান গড় ক্রসওভারগুলি ব্যবহার করে বাজার প্রবণতা নির্ধারণ করে এবং প্রবণতাগুলি প্রবণতার দ্বারা আনা মুনাফা ক্যাপচার করার মতো মনে হলে সময়মতো অবস্থানগুলি স্থাপন করে। একই সাথে, কৌশলটি বিভিন্ন সময় স্কেলগুলিতে কৌশলটির প্রত্যাশিত রিটার্নগুলি প্রদর্শন করার জন্য একটি স্বজ্ঞাত প্রত্যাশিত মূল্য প্যানেলও প্রবর্তন করে, ব্যবহারকারীদের আরও বেশি সিদ্ধান্ত গ্রহণের রেফারেন্স সরবরাহ করে। যদিও কৌশলটি পরিসীমা-সীমাবদ্ধ বাজারে খারাপ পারফর্ম করতে পারে এবং প্রত্যাশিত মূল্যের গণনার কিছু সীমাবদ্ধতা রয়েছে, আরও প্রযুক্তিগত সূচক প্রবর্তন করে, অবস্থান পরিচালনা অনুকূলিতকরণ করে, স্টপ-লাভ এবং স্টপ-লস প্রক্রিয়াগুলি যুক্ত করে এবং অন্যান্য ব্যবস্থাগুলি, কৌশলটির ঝুঁকি-প্রতিফল অনুপাত আরও উন্নত করা যেতে পারে, এটিকে পরিবর্তিত বাজারের পরিবেশে আরও ভালভাবে মানিয়ে নিতে সক্ষম করে।
/*backtest start: 2023-06-11 00:00:00 end: 2024-06-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © ir0nantc2 //@version=5 strategy("Expected Value Panel", overlay=true) // ロングエントリー条件 / Long entry condition longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) strategy.entry("My Long Entry Id", strategy.long) // ショートエントリー条件 / Short entry condition shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) strategy.entry("My Short Entry Id", strategy.short) // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // Please copy the code below and paste it into the strategy where you want to display the expected value. // 以下のコードをコピーして期待値を表示させたいストラテジーに貼り付けて下さい。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 表示選択 / Display selection show_performance = input.bool(true, '期待値ON/OFF (Show Expected Value)', group='Expected Value / ©ir0nantc2') transparency = input.int(50, '透過度 (Transparency)', minval=0, maxval=100, group='Expected Value / ©ir0nantc2') prec = 2 // 背景色 / Background color bg_color(value) => na(value) ? color.new(color.gray, transparency) : value > 0.0 ? color.new(color.green, transparency) : value < 0.0 ? color.new(color.red, transparency) :color.new(color.gray, transparency) // 利益と損失の追跡 / Track profits and losses var float total_monthly_profit = 0.0 var float total_yearly_profit = 0.0 if show_performance new_month = month(time) != month(time[1]) new_year = year(time) != year(time[1]) cur_month_pnl = 0.0, cur_year_pnl = 0.0 eq = strategy.equity bar_pnl = eq / eq[1] - 1 // 月次・年次 期待値 / Monthly & Yearly Expected Value cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 cur_year_pnl := new_year ? 0.0 : (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1 // 年次および月次期待値を格納 / Store monthly and yearly expected values var month_pnl = array.new_float(), var month_time = array.new_int() var year_pnl = array.new_float(), var year_time = array.new_int() // 期待値計算の変数 / Variables for expected value calculation var month_wins = array.new_int(), var month_losses = array.new_int() var month_avg_win = array.new_float(), var month_avg_loss = array.new_float() var year_wins = array.new_int(), var year_losses = array.new_int() var year_avg_win = array.new_float(), var year_avg_loss = array.new_float() // 月次および年次期待値の配列更新 / Update arrays for monthly and yearly expected values bool last_computed = false if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory)) if (last_computed and array.size(month_pnl) > 0) array.pop(month_pnl), array.pop(month_time) array.pop(month_wins), array.pop(month_losses) array.pop(month_avg_win), array.pop(month_avg_loss) array.push(month_pnl, cur_month_pnl[1]), array.push(month_time, time[1]) array.push(month_wins, 0), array.push(month_losses, 0) array.push(month_avg_win, 0.0), array.push(month_avg_loss, 0.0) if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory)) if (last_computed and array.size(year_pnl) > 0) array.pop(year_pnl), array.pop(year_time) array.pop(year_wins), array.pop(year_losses) array.pop(year_avg_win), array.pop(year_avg_loss) array.push(year_pnl, cur_year_pnl[1]), array.push(year_time, time[1]) array.push(year_wins, 0), array.push(year_losses, 0) array.push(year_avg_win, 0.0), array.push(year_avg_loss, 0.0) last_computed := barstate.islastconfirmedhistory ? true : last_computed // 勝ち取引と負け取引を追跡 / Track winning and losing trades if (strategy.closedtrades > 0 and na(strategy.closedtrades[1]) == false) closed_profit = strategy.netprofit - strategy.netprofit[1] if closed_profit > 0 if array.size(month_wins) > 0 wins = array.get(month_wins, array.size(month_wins) - 1) + 1 avg_win = (array.get(month_avg_win, array.size(month_avg_win) - 1) * (wins - 1) + closed_profit) / wins array.set(month_wins, array.size(month_wins) - 1, wins) array.set(month_avg_win, array.size(month_avg_win) - 1, avg_win) if array.size(year_wins) > 0 wins = array.get(year_wins, array.size(year_wins) - 1) + 1 avg_win = (array.get(year_avg_win, array.size(year_avg_win) - 1) * (wins - 1) + closed_profit) / wins array.set(year_wins, array.size(year_wins) - 1, wins) array.set(year_avg_win, array.size(year_avg_win) - 1, avg_win) else if array.size(month_losses) > 0 losses = array.get(month_losses, array.size(month_losses) - 1) + 1 avg_loss = (array.get(month_avg_loss, array.size(month_avg_loss) - 1) * (losses - 1) + closed_profit) / losses array.set(month_losses, array.size(month_losses) - 1, losses) array.set(month_avg_loss, array.size(month_avg_loss) - 1, avg_loss) if array.size(year_losses) > 0 losses = array.get(year_losses, array.size(year_losses) - 1) + 1 avg_loss = (array.get(year_avg_loss, array.size(year_avg_loss) - 1) * (losses - 1) + closed_profit) / losses array.set(year_losses, array.size(year_losses) - 1, losses) array.set(year_avg_loss, array.size(year_avg_loss) - 1, avg_loss) // 月次テーブル / Monthly table var monthly_table = table(na) if (barstate.islastconfirmedhistory) monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_time) + 1, border_width = 1) table.cell(monthly_table, 0, 0, "", bgcolor = #bbbbbb00) table.cell(monthly_table, 1, 0, "Jan", bgcolor = #bbbbbb) table.cell(monthly_table, 2, 0, "Feb", bgcolor = #bbbbbb) table.cell(monthly_table, 3, 0, "Mar", bgcolor = #bbbbbb) table.cell(monthly_table, 4, 0, "Apr", bgcolor = #bbbbbb) table.cell(monthly_table, 5, 0, "May", bgcolor = #bbbbbb) table.cell(monthly_table, 6, 0, "Jun", bgcolor = #bbbbbb) table.cell(monthly_table, 7, 0, "Jul", bgcolor = #bbbbbb) table.cell(monthly_table, 8, 0, "Aug", bgcolor = #bbbbbb) table.cell(monthly_table, 9, 0, "Sep", bgcolor = #bbbbbb) table.cell(monthly_table, 10, 0, "Oct", bgcolor = #bbbbbb) table.cell(monthly_table, 11, 0, "Nov", bgcolor = #bbbbbb) table.cell(monthly_table, 12, 0, "Dec", bgcolor = #bbbbbb) table.cell(monthly_table, 13, 0, "Year", bgcolor = #bbbbbb) // 年次データの集計 / Collecting yearly data var year_total_pnl = array.new_float() var year_exp_val = array.new_float() for yt = 0 to array.size(year_time) - 1 total_year_wins = 0, total_year_losses = 0 total_year_avg_win = 0.0, total_year_avg_loss = 0.0 total_year_pnl = 0.0 for mt = 1 to 12 idx = -1 for j = 0 to array.size(month_time) - 1 if year(array.get(month_time, j)) == year(array.get(year_time, yt)) and month(array.get(month_time, j)) == mt idx := j break if idx != -1 total_year_pnl := total_year_pnl + array.get(month_pnl, idx) total_year_wins := total_year_wins + array.get(month_wins, idx) total_year_losses := total_year_losses + array.get(month_losses, idx) total_year_avg_win := total_year_avg_win + (array.get(month_avg_win, idx) * array.get(month_wins, idx)) total_year_avg_loss := total_year_avg_loss + (array.get(month_avg_loss, idx) * array.get(month_losses, idx)) total_year_avg_win := total_year_wins > 0 ? total_year_avg_win / total_year_wins : 0.0 total_year_avg_loss := total_year_losses > 0 ? total_year_avg_loss / total_year_losses : 0.0 win_rate = total_year_wins + total_year_losses > 0 ? total_year_wins / (total_year_wins + total_year_losses) : na exp_val = win_rate ? (win_rate * total_year_avg_win) - ((1 - win_rate) * math.abs(total_year_avg_loss)) : na array.push(year_total_pnl, total_year_pnl) array.push(year_exp_val, exp_val) for yt = 0 to array.size(year_time) - 1 table.cell(monthly_table, 0, yt + 1, str.tostring(year(array.get(year_time, yt))), bgcolor = #bbbbbb) y_color = bg_color(array.get(year_exp_val, yt)) value_to_display = na(array.get(year_exp_val, yt)) ? "" : str.tostring(math.round(array.get(year_exp_val, yt) * 100, prec)) table.cell(monthly_table, 13, yt + 1, value_to_display, bgcolor = y_color, text_color=color.new(color.white, 0)) for mt = 0 to array.size(month_time) - 1 m_row = year(array.get(month_time, mt)) - year(array.get(year_time, 0)) + 1 m_col = month(array.get(month_time, mt)) if array.size(month_wins) > mt and array.size(month_losses) > mt and array.size(month_avg_win) > mt and array.size(month_avg_loss) > mt win_rate = array.get(month_wins, mt) / (array.get(month_wins, mt) + array.get(month_losses, mt)) exp_val = (win_rate * array.get(month_avg_win, mt)) - ((1 - win_rate) * math.abs(array.get(month_avg_loss, mt))) m_color = bg_color(exp_val) value_to_display = na(exp_val) ? "" : str.tostring(math.round(exp_val * 100, prec)) table.cell(monthly_table, m_col, m_row, value_to_display, bgcolor = m_color, text_color=color.new(color.white, 0)) else table.cell(monthly_table, m_col, m_row, "", bgcolor = color.new(color.gray, transparency), text_color=color.new(color.white, 0)) // [EOF]