この戦略は,トレンドフォローする戦略に属する高速移動平均値と遅い移動平均値のクロスオーバーに基づいて取引シグナルを生成する.移動平均値のパラメータを適応的に調整することで,最大利益を得るために市場のトレンドに動的に適応する.
速度のMAのデフォルト長さは21で,ゆっくりとしたMAのデフォルト長さは34です.
速いMAが遅いMAを横切ると 上向きの傾向を示し,買い信号を生成します.
速いMAがゆっくりしたMAを下回ると,下落傾向を示し,セールシグナルを生成します.
移動平均値の長さを自動的に調整することで,戦略は利益を追跡するために市場動向に動的に適応します.
戦略は単純で明快で 分かりやすく実行できます
市場動向を効果的に追跡し 大きな利益を得る可能性があります
動的パラメータ調整は 市場の状況の変化に適応します
調整可能なMAアルゴリズムは戦略の柔軟性を高めます
柔軟な買い物・販売の論理設定
頻繁に取引すると 取引コストが上がります
流動性のある市場では,最適のエントリーとアウトプットが欠けている可能性があります.
不適切な MA パラメーターと調整周波数最適化は 戦略の失敗を引き起こします
損失を制限するために厳格なストップ損失が必要です.
トレンドの逆転は 大きな浮動損失につながります
傾向の変化をより良く検出するために MA パラメータを最適化します.
ストップロスのロジックを追加して単一のトレード損失を制御します.
トレンド逆転損失を避けるためにトレンド判断指標を追加します.
管理管理調整戦略をより賢く自動化するために強化する.
マシン学習を用いたパラメータ最適化モジュールを追加します
戦略の論理はシンプルで明確で,MAsのクロスオーバーをベースに迅速かつ遅いトレードを生成する.トレンドを効果的に捉えるが,リスクもある.戦略をより堅牢にするために,パラメータの継続的な最適化,ストップロスの論理が必要である.全体として,戦略は改善の可能性が高く,研究と適用に値する.
/*backtest start: 2022-10-03 00:00:00 end: 2023-10-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // // @version=4 // © Ehsan Haghpanah, (ehsanha) // Algorithmic Trading Research // // eha Moving Averages Strategy, // A simple strategy based on crossing Moving Averages of // different lengths (a fast moving average and slow one) // strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true) // // -- strategy parameter(s) // moving averages parameter(s) var _fastMA_len = input(title = "Fast MA Length", defval = 21, type = input.integer, minval = 1, step = 1) var _slowMA_len = input(title = "Slow MA Length", defval = 34, type = input.integer, minval = 1, step = 1) var _ma_algo_id = input(title = "MA Algorithm", defval = "SMA", options = ["SMA", "EMA", "WMA"]) // backtesting date and time range parameter(s) var _startYear = input(defval = 2020, title = "Start Year", type = input.integer, minval = 1976) var _startMonth = input(defval = 1, title = "Start Month", type = input.integer, minval = 1, maxval = 12) var _startDay = input(defval = 1, title = "Start Day", type = input.integer, minval = 1, maxval = 31) var _closeYear = input(defval = 2020, title = "Close Year", type = input.integer, minval = 1984) var _closeMonth = input(defval = 9, title = "Close Month", type = input.integer, minval = 1, maxval = 12) var _closeDay = input(defval = 1, title = "Close Day", type = input.integer, minval = 1, maxval = 31) // // -- function(s) and calculation(s) // checks whether current time is in backtesting time range start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00) // backtesting range start time, (00, 00); (hour, minute) close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59) // backtesting range close time, (23, 59); (hour, minute) isInRange() => true // // calculates moving average based on provided algorithm, source and length // alg : moving average algorithm // len : length // ser : series calcMA(alg, len, ser) => (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na))) // // -- strategy logic and calculation(s) ma_fast = calcMA(_ma_algo_id, _fastMA_len, close) ma_slow = calcMA(_ma_algo_id, _slowMA_len, close) cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA // // -- strategy execution logic // opens a long position whenever the time is in range and crosses over strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov) // closes the position whenever the time is in range and crosses under strategy.close("ID", comment = "-", when = isInRange() and cross_un) // // -- drawing and visualization co_fast = color.new(color.gray, 25) co_slow = color.new(color.gray, 75) // drawing moving average(s) plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line) plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)