Diese Strategie verwendet die Überschneidung von zwei einfachen gleitenden Durchschnitten mit verschiedenen Perioden, um die Trendrichtung zu bestimmen, und tritt in Trades ein, wenn ein Trend auftritt. Gleichzeitig führt die Strategie auch ein erwartetes Wertpaneel ein, um die erwarteten Renditen der Strategie in verschiedenen Zeitskalen zu berechnen und anzuzeigen, so dass Benutzer die Leistung der Strategie besser bewerten können. Das erwartete Wertpaneel berücksichtigt Schlüsselindikatoren wie die Gewinnrate der Strategie, den durchschnittlichen Gewinn und den durchschnittlichen Verlust während historischer Perioden und präsentiert die Leistung der Strategie unter verschiedenen Marktbedingungen auf intuitive Weise.
Der Kern dieser Strategie besteht darin, die Überschneidung von zwei einfachen gleitenden Durchschnitten mit unterschiedlichen Perioden (14-Tage und 28 Tage in diesem Beispiel) zu verwenden, um Markttrends zu bestimmen. Wenn der kurzfristige Durchschnitt über den langfristigen Durchschnitt von unten kreuzt, wird davon ausgegangen, dass der Markt einen Aufwärtstrend betreten hat, und die Strategie eröffnet eine Long-Position. Umgekehrt, wenn der kurzfristige Durchschnitt unter den langfristigen Durchschnitt von oben kreuzt, wird davon ausgegangen, dass der Markt einen Abwärtstrend betreten hat, und die Strategie eröffnet eine Short-Position. Auf diese Weise kann sich die Strategie an verschiedene Markttrends anpassen und rechtzeitig Positionen einrichten, wenn Trends die durch die Trends erzielten Gewinne zu erfassen scheinen.
Neben der grundlegenden Trendbestimmung und der Handelslogik führt die Strategie auch ein Panel für den erwarteten Wert ein, um die erwarteten Renditen der Strategie in verschiedenen Zeiträumen (monatlich und jährlich) zu berechnen und anzuzeigen.
Anhand dieser Indikatoren kann der erwartete Wert der Strategie in diesem Zeitraum berechnet werden: Erwarteter Wert = Gewinnquote × Durchschnittlicher Gewinn - (1 - Gewinnquote) × Durchschnittlicher Verlust
Durch die Anzeige der erwarteten Werte für verschiedene Zeiträume in Form einer Heatmap auf dem Diagramm können Benutzer die erwartete Leistung der Strategie unter verschiedenen Marktbedingungen auf einen Blick sehen und so die Anwendbarkeit und das Risiko der Strategie besser verstehen.
Starke Anpassungsfähigkeit an Trends: Durch die Verwendung von gleitenden Durchschnitts-Kreuzungen zur Bestimmung von Trends kann die Strategie Positionen rechtzeitig unter verschiedenen Markttrends anpassen, um sich an Marktveränderungen anzupassen.
Intuitive Leistungsbewertung: Das integrierte Panel des erwarteten Wertes zeigt die erwarteten Renditen der Strategie in verschiedenen Zeiträumen in Form einer Heatmap an, so dass Benutzer die Leistung der Strategie unter verschiedenen Marktbedingungen auf einen Blick bewerten können.
Berücksichtigung der wichtigsten statistischen Indikatoren: Bei der Berechnung des erwarteten Wertes wird nicht nur die Gewinnrate der Strategie berücksichtigt, sondern auch die Auswirkungen des durchschnittlichen Gewinns und des durchschnittlichen Verlusts berücksichtigt.
Flexible Parameter-Einstellungen: Die Benutzer können flexibel festlegen, ob das erwartete Wertfeld und seine Transparenz entsprechend ihren Bedürfnissen angezeigt werden sollen. Dies ermöglicht es den Benutzern, den Anzeigeeffekt des Diagramms nach ihren Vorlieben anzupassen und so die Benutzererfahrung zu verbessern.
Schlechte Performance in den Märkten, die von der Bandbreite abhängen: Da die Strategie hauptsächlich auf Trends beruht, um Gewinne zu erzielen, kann häufiger Handel unter Marktbedingungen, die von der Bandbreite oder dem Trend abhängen und unklar sind, zu erheblichen Verschiebungen und Transaktionskosten führen, die sich auf die Gesamtleistung der Strategie auswirken.
Einschränkungen der Berechnung des erwarteten Wertes: Obwohl das Panel des erwarteten Wertes eine intuitive Möglichkeit zur Bewertung der Strategieleistung bietet, basiert es für die Berechnung immer noch auf historischen Daten.
Große Auswirkungen der Parameterwahl: Die Performance der Strategie hängt weitgehend von der Auswahl der gleitenden Durchschnittsperioden ab. Verschiedene Periodenkombinationen können völlig unterschiedliche Handelsergebnisse bringen. Wenn sich die ausgewählten Parameter nicht gut an die Merkmale des Marktes anpassen können, kann die tatsächliche Performance der Strategie erheblich vom erwarteten Wert abweichen.
Einführung weiterer technischer Indikatoren: Auf der Grundlage der bestehenden gleitenden Durchschnitte können andere technische Indikatoren wie MACD und RSI in Betracht gezogen werden, um die Stärke und Nachhaltigkeit der Trends besser zu bestimmen und so den Zeitpunkt der Ein- und Ausstiegsstrategien zu verbessern.
Optimierung des Positionsmanagements: Derzeit wird bei Handelssignalen ein Ansatz der festen Position angewandt.
Hinzufügen von Stop-Profit- und Stop-Loss-Mechanismen: Das Hinzufügen vernünftiger Stop-Profit- und Stop-Loss-Mechanismen zur Strategie kann dazu beitragen, dass die Strategie die bestehenden Gewinne rechtzeitig einbindet und gleichzeitig potenzielle Verluste begrenzt. Dies hilft, das Risiko-Rendite-Verhältnis der Strategie zu verbessern und eine relativ stabile Performance in verschiedenen Marktumgebungen aufrechtzuerhalten.
Optimierung der Berechnung des erwarteten Wertes: Die Berechnungsmethode des erwarteten Wertes kann weiter optimiert werden, beispielsweise durch Berücksichtigung der Transaktionskosten und Einführung von beweglichen Fenstern, um die Wirksamkeit und Praktikabilität des Indikators des erwarteten Wertes zu verbessern.
Diese Strategie bestimmt Markttrends, indem sie gleitende Durchschnitts-Kreuzungen verwendet und Positionen rechtzeitig festlegt, wenn Trends die Gewinne der Trends erfassen. Gleichzeitig führt die Strategie auch ein intuitives erwartetes Wertpaneel ein, um die erwarteten Renditen der Strategie in verschiedenen Zeitskalen anzuzeigen und den Benutzern mehr Entscheidungsreferenzen zu geben. Obwohl die Strategie in Bereichsgebundenen Märkten schlecht abschneiden kann und die Berechnung des erwarteten Wertes bestimmte Einschränkungen hat, kann durch die Einführung mehrer technischer Indikatoren, die Optimierung des Positionsmanagements, das Hinzufügen von Stop-Profit- und Stop-Loss-Mechanismen und anderen Maßnahmen das Risiko-Rendite-Verhältnis der Strategie weiter verbessert werden, so dass sie sich besser an veränderte Marktumgebnisse anpassen kann.
/*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]