Cette stratégie utilise le croisement de deux moyennes mobiles simples avec des périodes différentes pour déterminer la direction de la tendance et entre dans les transactions lorsqu'une tendance apparaît. En même temps, la stratégie introduit également un panneau de valeur attendue pour calculer et afficher les rendements attendus de la stratégie à différentes échelles de temps, permettant aux utilisateurs d'évaluer mieux la performance de la stratégie. Le panneau de valeur attendue prend en compte des indicateurs clés tels que le taux de gain de la stratégie, le profit moyen et la perte moyenne au cours des périodes historiques, et présente de manière intuitive la performance de la stratégie dans différentes conditions de marché.
Le noyau de cette stratégie est d'utiliser le croisement de deux moyennes mobiles simples avec des périodes différentes (14 jours et 28 jours dans cet exemple) pour déterminer les tendances du marché. Lorsque la moyenne à court terme franchit au-dessus de la moyenne à long terme par le bas, on considère que le marché est entré dans une tendance à la hausse, et la stratégie ouvre une position longue. Inversement, lorsque la moyenne à court terme franchit au-dessous de la moyenne à long terme par le haut, on considère que le marché est entré dans une tendance à la baisse, et la stratégie ouvre une position courte. De cette façon, la stratégie peut s'adapter aux différentes tendances du marché et établir des positions en temps opportun lorsque les tendances semblent capturer les profits apportés par les tendances.
En plus de la détermination de la tendance de base et de la logique de négociation, la stratégie introduit également un panneau de valeur attendue pour calculer et afficher les rendements attendus de la stratégie à différentes échelles de temps (mensuelles et annuelles).
À l'aide de ces indicateurs, la valeur attendue de la stratégie pour cette période peut être calculée: Valeur attendue = taux de gain × bénéfice moyen - (1 - taux de gain) × perte moyenne
En affichant les valeurs attendues pour différentes périodes sous forme de feuille de calcul sur le graphique, les utilisateurs peuvent voir en un coup d'œil les performances attendues de la stratégie dans différentes conditions de marché, ce qui permet de mieux comprendre l'applicabilité et le risque de la stratégie.
Une forte adaptabilité aux tendances: en utilisant des croisements de moyennes mobiles pour déterminer les tendances, la stratégie peut ajuster les positions en temps opportun en fonction des différentes tendances du marché afin de s'adapter aux changements du marché.
Évaluation intuitive des performances: le panneau de valeur attendue intégré affiche les rendements attendus de la stratégie à différentes périodes sous forme de feuille de route, permettant aux utilisateurs d'évaluer la performance de la stratégie dans différentes conditions de marché en un coup d'œil.
Considération des indicateurs statistiques clés: le calcul de la valeur attendue tient compte non seulement du taux de gain de la stratégie, mais intègre également l'impact du bénéfice moyen et de la perte moyenne.
Paramètres flexibles: les utilisateurs peuvent définir de manière flexible si l'affichage du panneau de valeur attendue et sa transparence en fonction de leurs besoins.
Faibles performances sur les marchés à fourchette: étant donné que la stratégie repose principalement sur les tendances pour générer des bénéfices, les transactions fréquentes dans des conditions de marché à fourchette ou peu claires peuvent entraîner des dérapages et des coûts de transaction importants, ce qui affecte la performance globale de la stratégie.
Limites du calcul de la valeur attendue: Bien que le tableau de la valeur attendue offre un moyen intuitif d'évaluer le rendement de la stratégie, il est toujours basé sur des données historiques pour le calcul.
L'impact de la sélection des paramètres est important: la performance de la stratégie dépend en grande partie de la sélection des périodes de moyenne mobile. Les combinaisons de périodes différentes peuvent donner des résultats commerciaux complètement différents. Si les paramètres sélectionnés ne peuvent pas bien s'adapter aux caractéristiques du marché, la performance réelle de la stratégie peut s'écarter considérablement de la valeur attendue.
Introduction d'un plus grand nombre d'indicateurs techniques: sur la base des moyennes mobiles existantes, d'autres indicateurs techniques tels que le MACD et le RSI peuvent être envisagés pour mieux déterminer la force et la pérennité des tendances, améliorant ainsi le calendrier des entrées et des sorties de la stratégie.
Optimiser la gestion des positions: Actuellement, la stratégie adopte une approche de position fixe lorsque des signaux de trading apparaissent.
Ajouter des mécanismes de stop-profit et de stop-loss: l'ajout de mécanismes raisonnables de stop-profit et de stop-loss à la stratégie peut aider la stratégie à verrouiller les bénéfices existants en temps opportun tout en limitant les pertes potentielles. Cela aide à améliorer le rapport risque-rendement de la stratégie et à maintenir une performance relativement stable dans divers environnements de marché.
Optimiser le calcul de la valeur attendue: la méthode de calcul de la valeur attendue peut être encore optimisée, par exemple en tenant compte des coûts de transaction et en introduisant des fenêtres mobiles pour améliorer l'efficacité et la praticité de l'indicateur de valeur attendue.
Cette stratégie détermine les tendances du marché en utilisant des croisements de moyennes mobiles et établit des positions en temps opportun lorsque les tendances semblent capturer les bénéfices apportés par les tendances. Dans le même temps, la stratégie introduit également un panneau de valeur attendue intuitif pour afficher les rendements attendus de la stratégie à différentes échelles de temps, fournissant aux utilisateurs plus de références de prise de décision. Bien que la stratégie puisse avoir de mauvaises performances sur les marchés à fourchette et que le calcul de la valeur attendue ait certaines limitations, en introduisant plus d'indicateurs techniques, en optimisant la gestion des positions, en ajoutant des mécanismes de stop-profit et de stop-loss et d'autres mesures, le rapport risque-rendement de la stratégie peut être encore amélioré, lui permettant de mieux s'adapter aux environnements changeants du marché.
/*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]