Strategi ini menggunakan persilangan dua purata bergerak mudah dengan tempoh yang berbeza untuk menentukan arah trend dan memasuki perdagangan apabila trend muncul. Pada masa yang sama, strategi ini juga memperkenalkan panel nilai dijangka untuk mengira dan memaparkan pulangan yang dijangka dari strategi pada skala masa yang berbeza, yang membolehkan pengguna menilai prestasi strategi dengan lebih baik. Panel nilai dijangka mengambil kira penunjuk utama seperti kadar kemenangan strategi, purata keuntungan, dan purata kerugian semasa tempoh sejarah, dan membentangkan prestasi strategi di bawah keadaan pasaran yang berbeza dengan cara yang intuitif.
Inti strategi ini adalah untuk menggunakan persilangan dua purata bergerak mudah dengan tempoh yang berbeza (14-hari dan 28-hari dalam contoh ini) untuk menentukan trend pasaran. Apabila purata jangka pendek melintasi di atas purata jangka panjang dari bawah, ia dianggap bahawa pasaran telah memasuki trend menaik, dan strategi membuka kedudukan panjang. Sebaliknya, apabila purata jangka pendek melintasi di bawah purata jangka panjang dari atas, ia dianggap bahawa pasaran telah memasuki trend menurun, dan strategi membuka kedudukan pendek. Dengan cara ini, strategi dapat menyesuaikan diri dengan trend pasaran yang berbeza dan menubuhkan kedudukan dengan tepat pada masanya apabila trend kelihatan menangkap keuntungan yang dibawa oleh trend.
Sebagai tambahan kepada penentuan trend asas dan logik perdagangan, strategi ini juga memperkenalkan panel nilai yang dijangkakan untuk mengira dan memaparkan pulangan yang dijangkakan dari strategi pada skala masa yang berbeza (bulan dan tahunan).
Menggunakan penunjuk ini, nilai yang dijangkakan strategi dalam tempoh masa itu boleh dikira: Nilai yang dijangkakan = Kadar Menang × Keuntungan Purata - (1 - Kadar Menang) × Kerugian Purata
Dengan memaparkan nilai yang dijangkakan untuk tempoh masa yang berbeza dalam bentuk peta haba pada carta, pengguna dapat melihat sekilas prestasi yang dijangkakan strategi dalam keadaan pasaran yang berbeza, dengan itu memahami penerapan dan risiko strategi dengan lebih baik.
Kemampuan penyesuaian yang kuat terhadap trend: Dengan menggunakan persilangan purata bergerak untuk menentukan trend, strategi dapat menyesuaikan kedudukan dengan tepat pada masanya di bawah trend pasaran yang berbeza untuk menyesuaikan diri dengan perubahan pasaran. Ini membolehkan strategi untuk mencapai pulangan yang baik di pasaran trend.
Penilaian prestasi intuitif: Panel nilai yang dijangkakan yang terbina dalam memaparkan pulangan yang dijangkakan dari strategi pada tempoh masa yang berbeza dalam bentuk peta haba, yang membolehkan pengguna menilai prestasi strategi di bawah keadaan pasaran yang berbeza sekilas.
Pertimbangan penunjuk statistik utama: Pengiraan nilai yang dijangkakan bukan sahaja mempertimbangkan kadar kemenangan strategi tetapi juga mengintegrasikan kesan keuntungan purata dan kerugian purata.
Tetapan parameter yang fleksibel: Pengguna boleh menetapkan secara fleksibel sama ada untuk memaparkan panel nilai yang diharapkan dan ketelusan mengikut keperluan mereka. Ini membolehkan pengguna menyesuaikan kesan paparan carta mengikut pilihan mereka, meningkatkan pengalaman pengguna.
Prestasi yang lemah di pasaran yang terikat julat: Oleh kerana strategi terutamanya bergantung kepada trend untuk menjana keuntungan, perdagangan yang kerap dalam keadaan pasaran yang terikat julat atau trend yang tidak jelas boleh menyebabkan kelewatan dan kos transaksi yang ketara, yang mempengaruhi prestasi keseluruhan strategi.
Batasan pengiraan nilai yang dijangkakan: Walaupun panel nilai yang dijangkakan menyediakan cara intuitif untuk menilai prestasi strategi, ia masih berdasarkan data sejarah untuk pengiraan. Apabila perubahan yang ketara berlaku di pasaran atau situasi yang melampau timbul, data sejarah mungkin tidak mencerminkan prestasi sebenar strategi, dan nilai rujukan nilai yang dijangkakan mungkin dikurangkan.
Kesan besar pemilihan parameter: Prestasi strategi sebahagian besarnya bergantung pada pemilihan tempoh purata bergerak. Gabungan tempoh yang berbeza mungkin membawa hasil perdagangan yang sama sekali berbeza. Jika parameter yang dipilih tidak dapat menyesuaikan diri dengan baik dengan ciri pasaran, prestasi sebenar strategi mungkin menyimpang dengan ketara dari nilai yang diharapkan.
Memperkenalkan lebih banyak penunjuk teknikal: Berdasarkan purata bergerak yang sedia ada, penunjuk teknikal lain seperti MACD dan RSI boleh dipertimbangkan untuk menentukan kekuatan dan kelestarian trend dengan lebih baik, dengan itu meningkatkan masa masuk dan keluar strategi.
Mengoptimumkan pengurusan kedudukan: Pada masa ini, strategi mengamalkan pendekatan kedudukan tetap apabila isyarat perdagangan muncul. Ia boleh dipertimbangkan untuk menyesuaikan kedudukan secara dinamik berdasarkan faktor seperti turun naik pasaran dan kekuatan trend untuk mengawal risiko dengan lebih baik dan meningkatkan pulangan.
Tambahkan mekanisme berhenti keuntungan dan berhenti kerugian: Menambahkan mekanisme berhenti keuntungan dan berhenti kerugian yang munasabah kepada strategi dapat membantu strategi mengunci keuntungan yang ada dengan tepat pada masanya sambil mengehadkan kerugian yang berpotensi. Ini membantu meningkatkan nisbah risiko-balasan strategi dan mengekalkan prestasi yang agak stabil dalam pelbagai persekitaran pasaran.
Mengoptimumkan pengiraan nilai yang dijangkakan: Kaedah pengiraan nilai yang dijangkakan boleh dioptimumkan lagi, seperti mempertimbangkan kos transaksi dan memperkenalkan tingkap bergerak untuk meningkatkan keberkesanan dan kepraktisan penunjuk nilai yang dijangkakan.
Strategi ini menentukan trend pasaran dengan menggunakan persilangan purata bergerak dan menubuhkan kedudukan dengan tepat pada masanya apabila trend nampaknya menangkap keuntungan yang dibawa oleh trend. Pada masa yang sama, strategi ini juga memperkenalkan panel nilai dijangka yang intuitif untuk memaparkan pulangan yang dijangka dari strategi pada skala masa yang berbeza, menyediakan pengguna dengan lebih banyak rujukan membuat keputusan. Walaupun strategi mungkin berprestasi buruk di pasaran terhad julat dan pengiraan nilai dijangka mempunyai batasan tertentu, dengan memperkenalkan lebih banyak penunjuk teknikal, mengoptimumkan pengurusan kedudukan, menambah mekanisme berhenti keuntungan dan berhenti kerugian, dan langkah-langkah lain, nisbah risiko-balasan strategi dapat ditingkatkan lagi, membolehkannya menyesuaikan diri dengan lebih baik dengan persekitaran pasaran yang berubah.
/*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]