この記事では,簡単な移動平均値に基づく取引戦略について説明します. 戦略は,閉値と17期間の移動平均値を比較し,閉値が移動平均値を超えるとロングになり,下値を超えるとショートします.
この戦略は,移動平均を計算するために以下のパラメータを使用します.
これらのパラメータに基づいて,getMAType() 関数は閉値の17期SMAを計算するために呼び出されます.
閉店価格と移動平均値の関係を比較します.
閉じる価格が下から移動平均値を超えると,ロング・シグナルが生成されます.上から下へと突入すると,ショート・シグナルが生成されます.
バックテスト期間中,ロング・シグナルが出るとロング・ポジションを開き,ショート・シグナルが出るとショート・ポジションを開く.
この戦略の最大の利点は,論理が非常にシンプルで明確である. たった1つの指標で,指標の方向変化に基づいてトレンド逆転を判断する.戦略は理解し,実行しやすく,初心者が学ぶのに適しています.
さらに,移動平均値は,トレンドの変化を効果的に追跡し,短期的な市場の騒音による干渉を回避できる傾向を伴う指標に属します.
パラメータを調整することで 異なるサイクルや製品に 適応できます
第一に,この戦略は1つの指標だけに基づいており,判断基準は比較的単一であり,誤った信号が増える可能性があります.
また,トレンドフォローシステムとして,範囲限定および横向市場ではうまく機能しません.
さらに,ストップ・ロダースやテイク・プロフィットなしでは 損失が拡大する危険性があります
解決策は他の指標を組み込み 誤ったシグナルを減らすためにパラメータの組み合わせを最適化し リスクを制御し 引き下げを最適化するためにストップ・ロストと取利益を追加することです
戦略を最適化するためのアイデアは以下の通りです
移動平均のパラメータを調整し,期間の数を最適化します.例えば30期または50期に変更します.
EMA,VIDYAなど,様々な種類の移動平均を試してください. 価格変動に対する感度は異なります.
他の指標を組み合わせて追加します.例えば,強さを判断するためのMACD,誤った信号を減らすためのRSI.
ストップ・ロスのメカニズムを追加します.単一の取引損失額を制御するために固定パーセントまたはATRベースのトラッキング・ストップ・ロスを設定します.
利得を最大化するために 目標利得率を設定します
これらの最適化により 戦略の業績が安定し,過剰な引き下げを回避できる.
この記事では,17期移動平均値に基づく単純な取引戦略を分析しています.この戦略は,典型的なトレンドフォローシステムに属し,理解し,実装しやすい単純な信号源を持っています.戦略の深い解釈を通じて,そのメリットとデメリットが分析され,最適化アイデアの複数の次元が提案されています.継続的な最適化と強化を通じて,この戦略は徐々に進化し,ライブ取引でも安定したリターンを達成できると考えられています.
/*backtest start: 2023-12-05 00:00:00 end: 2024-01-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2012, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// Moving Average ///////////// source = input(title="MA Source", defval=ohlc4) maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"]) length = input(title="MA Length", defval=17) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) if maType == "vwma" res := vwma(sourceType, maLen) if maType == "rma" res := rma(sourceType, maLen) res MA = getMAType(maType, source, length) /////////////// Strategy /////////////// long = close > MA short = close < MA last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long_signal) strategy.entry("S", strategy.short, when=short_signal) /////////////// Plotting /////////////// p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2) p2 = plot(close, linewidth=2) fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)