この戦略は,シンプル・ムービング・アベア (SMA) のクロスオーバー・シグナルとピーク・ドラウダウン・コントロールを組み合わせたロング・ショート・トレーディング・システムである. 戦略のピーク・ドラウダウンを同時にモニターしながら,ロング・ショート・トレーディング・シグナルを生成するために14期および28期SMAのクロスオーバーを使用する. ドラウダウンが事前に設定された
貿易信号生成:
ピーク抽出制御:
ピークからサイクルまで分析:
トレンドフォローとリスクコントロールを組み合わせます SMAクロスオーバー戦略は,典型的なトレンドフォロー方法であり,ピークドラウダウン制御はリスク管理の追加の層を提供します.この組み合わせは,市場のトレンドを把握しながら下向きリスクを効果的に制御することができます.
高度な適応性 最大抽出率と最小抽出率のパラメータ化により,戦略は異なる市場環境と個人のリスク優先順位に柔軟に調整できます.
透明性のあるリスク指標 ピークから底までサイクルの分析は,詳細な履歴的な引き下げ情報を提供し,トレーダーは戦略のリスク特性を直感的に理解し,より情報に基づいた取引決定に役立ちます.
自動リスク管理: 引き上げが既定しきい値を超えると,戦略は自動的に取引を停止します.このメカニズムは,不利な市場状況下で継続的な損失を効果的に防ぐことができます.
総合的な性能分析 従来のバックテストメトリックに加えて,戦略は,戦略のパフォーマンスの詳細な分析を容易にする,ランアップパーセント,引き上げパーセント,時間情報を含む,ピークから底までサイクルの詳細なデータを提供します.
歴史的データへの過度な依存: SMAクロスオーバー戦略は,過去の価格データに基づいているため,急速に変化する市場ではゆっくり反応し,誤った信号を引き起こす可能性があります.
頻繁に取引する 振動する市場では,SMAは頻繁に交差し,過剰な取引と高い取引コストを引き起こす可能性があります.
大量の引き上げの可能性: 最大の引き上げ規制にもかかわらず,深刻な市場変動の際に一度の大幅な引き下げは,依然として重大な損失をもたらす可能性があります.
パラメータ感度: 戦略のパフォーマンスは,SMA期間と引き上げ限界値の選択に大きく依存する.パラメータの設定が正しくない場合,不適正な結果をもたらす可能性があります.
失敗 する 機会 取引が停止すると,市場逆転によってもたらされた機会を逃す可能性があります.
動的パラメータ調整を導入する: 市場変動に基づいて,SMA期間と引き上げ限界を動的に調整し,異なる市場環境に適応することを検討する.
追加の市場フィルター: RSIやボリュームなどの他の技術指標や基本的要因を組み込み,潜在的な誤った信号をフィルタリングします.
段階的な入国と退出を実施する: "すべてか何も"ではなく,段階的なポジション構築と閉鎖を実施し,単一の決定のリスクを減らす.
利潤のメカニズムを追加します 引き下げ制御に加えて 収益を固定し 総利益率を向上させる ダイナミックな利益引き上げ機能を追加します
お金 の 管理 を 最適 に する リスク管理の改善のために,口座の大きさと市場の変動に基づいて動的ポジションサイズを導入する.
機械学習アルゴリズムを導入する: マシン・ラーニング技術を使用して,パラメータ選択と信号生成プロセスを最適化し,戦略の適応性と精度を向上させる.
SMAクロスオーバー・ロング・ショート戦略は,ピーク・ドラウダウン制御と自動終了と組み合わせて,トレンドフォローとリスク管理をバランスする定量的な取引システムである. シンプルな移動平均クロスオーバーを通じて市場のトレンドを把握し,ピーク・ドラウダウン制御を使用してダウンサイドリスクを管理する. この戦略のユニークな特徴は,詳細なピークから底までサイクルの分析にあり,トレーダーは戦略のリスク特性を深く理解するためのツールを提供します.
この戦略には,歴史的なデータやパラメータの敏感性への過度に依存など,固有のリスクがあるが,適切な最適化と改善によってその強度と収益性を大幅に向上させることができる.これらは,動的パラメータ調整を導入し,追加の市場フィルターを追加し,スマートなマネーマネジメントを実装することを含む.
この戦略は,トレーダーに良い出発点を提供し,個々の取引目標とリスクの好みを満たすためにさらにカスタマイズされ最適化することができます. 戦略のモジュール式デザインは,他の取引戦略またはリスク管理技術と簡単に統合できるようになり,より複雑で包括的な取引システムの構築の基礎を築きます.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 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/ capital = 10000 //@version=5 strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100) // The code below is from Tradingwhale LLC /// ============================================================================== // Peak-Trough Cycles with Date and Prev. RunUp // Initialize variables showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?") min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.") maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.") var float equityPeak = na var float equityTrough = na var int cycleCount = 0 var bool inDrawdown = false var float initialCapital = capital var float prevTrough = initialCapital var float prevRunUp = na var bool useLighterGray = true var int lastYear = na // Variable to indicate whether the strategy should end var bool end_strategy = false // Table to display data var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1) // Function to convert float to percentage string f_to_percent(value) => str.tostring(value, "#.##") + "%" // Function to get month/year string without commas get_month_year_string() => str.tostring(year) + "/" + str.tostring(month) // Update the table headers if (bar_index == 0 and showTable) table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal) // Track peaks and troughs in equity if (na(equityPeak) or strategy.equity > equityPeak) if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage > min_trough cycleCount += 1 prevRunUp := (equityPeak - prevTrough) / prevTrough * 100 if cycleCount <= 20 and showTable currentYear = year if na(lastYear) or currentYear != lastYear useLighterGray := not useLighterGray lastYear := currentYear rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50) table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal) prevTrough := equityTrough equityPeak := strategy.equity equityTrough := na inDrawdown := false else if (strategy.equity < equityPeak) equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity) inDrawdown := true // Calculate if the strategy should end if not na(equityPeak) and not na(equityTrough) drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage >= maxdraw end_strategy := true // This code below is from Tradingview, but with additions where commented (see below) longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Long Entry Id", strategy.long) shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Short Entry Id", strategy.short)