モメントスプレス戦略

作者: リン・ハーンチャオチャン開催日:2023年11月14日 14:04:24
タグ:

img

概要

この戦略の主なアイデアは,レジーベアのモメントインジケーターとCrypto FaceのMFIインジケーターを組み合わせ,トレンドが上昇するとロング,トレンドがダウンするとショートで,市場のトレンドに従う定量的な取引戦略を実現することです.

戦略の論理

  1. トレンド方向を決定するために,20日間の最高値,最低値,近平均値に対する閉じる価格の線形回帰を計算するLazy Bearのインパクト指標BlueWaveを使用します. BlueWaveが0を超えると上昇傾向を示し,0を下回ると下落傾向を示します.

  2. 通貨流を決定するために,過去58日間の価格変化とボリュームの合計を計算するCrypto Faceの改善されたMFI指標を使用します. 0を超えるMFIは資金流入を示し,0未満は出流を示します.

  3. BlueWaveが0を超え,MFIが0を超えると,ロングポジションを開くために買い信号が生成され,BlueWaveが0を超え,MFIが0未満になるとショートポジションを開くために売り信号が生成されます.

  4. ストップ・ロスの条件を設定し リスクをコントロールしながら 利益を得るための市場の傾向に従う.

利点

  1. 2つの指標を組み合わせることで,市場の傾向の方向性をより正確に判断できます.

  2. BlueWaveの滑らかな曲線は異常値による偏見を回避し,傾向判断をより信頼性のあるものにする.

  3. MFIは,偽の脱出による損失を避けるために,マネーフローを決定することができます.

  4. 戦略にはパラメータが少なく,実行と運用が簡単です.

  5. 柔軟なストップ・ロストとテイク・プロフィートの設定は,取引リスクの制御に役立ちます.

  6. 特定の市場時間に異常な変動を避けるために取引セッションを設定できます.

リスク

  1. ダウントレンドが継続すると,連続したショートポジションと損失が起こる可能性があります.

  2. 誤った信号は ポジションに入ると 罠にかかれることもあります

  3. ストップロスの大きさが大きすぎると 損失が増大する可能性があります

  4. 高波動はしばしばストップ・ロストポイントに達します

  5. パラメータの最適化が不適切である場合,戦略の性能が低下する可能性があります.

  6. 取引のシグナルが頻繁すぎると 取引コストやスライドが増加する可能性があります

強化

  1. 安定した信頼性の高い信号のために BlueWave と MFI のパラメータを最適化します

  2. 継続的なショート損失を避けるために傾向指標を組み込む.

  3. ストップ・ロスト/テイク・プロフィートの比率を動的に調整し,閉じ込められた可能性を下げる.

  4. 誤った信号を減らすために 入口条件を改良します.

  5. ポジションのサイズを考慮して 追いかけるラリーや ダンピング・ディップを避ける

  6. 機械学習モデルと組み合わせることで より正確なエントリー・アウトプットが得られます

結論

この戦略は,トレンド方向を決定するためにブルーウェーブとMFIインジケーターを組み合わせ,上昇傾向に長引く,下落傾向に短引く,利益のための市場トレンドを効果的にフォローする.しかし,パラメータ設定,ストップ損失/利益を取ること,持続的なダウントレンドなどにはリスクがあるため,パラメータ調整,ストップ損失メカニズム,フィルタ条件等をさらに最適化する必要があり,戦略のパフォーマンスと強度を改善する.全体として,戦略は直感的で,長期的トレンドをフォローするのにうまく機能するが,範囲の市場で閉じ込められた場合損失が発生する可能性がある.


/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Bunghole 2021
strategy(title="Crypto Squeeze Strategy", initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0, currency = 'USD', overlay=true)

//// Stoploss and Take Profit Parameters
// Enable Long Strategy
enable_long_strategy = input(true, title="Enable Long Strategy", group="SL/TP For Long Strategy",inline="1")
long_stoploss_value = input(defval=50, title='Stoploss %', type=input.float, minval=0.1, group="SL/TP For Long Strategy",inline="2")
long_stoploss_percentage = (close * (long_stoploss_value / 100)) / syminfo.mintick
long_takeprofit_value = input(defval=50, title='Take Profit %', type=input.float, minval=0.1, group="SL/TP For Long Strategy",inline="2")
long_takeprofit_percentage = (close * (long_takeprofit_value / 100)) / syminfo.mintick

// Enable Short Strategy
enable_short_strategy = input(true, title="Enable Short Strategy", group="SL/TP For Short Strategy",inline="3")
short_stoploss_value = input(defval=50, title='Stoploss %', type=input.float, minval=0.1, group= "SL/TP For Short Strategy",inline="4")
short_stoploss_percentage = (close * (short_stoploss_value / 100)) / syminfo.mintick
short_takeprofit_value = input(defval=50, title='Take Profit %', type=input.float, minval=0.1, group="SL/TP For Short Strategy",inline="4")
short_takeprofit_percentage = (close * (short_takeprofit_value / 100)) / syminfo.mintick

// Plot Stoploss & Take Profit Levels
long_stoploss_price = strategy.position_avg_price * (1 - long_stoploss_value/100)
long_takeprofit_price = strategy.position_avg_price * (1 + long_takeprofit_value/100)
short_stoploss_price = strategy.position_avg_price * (1 + short_stoploss_value/100)
short_takeprofit_price = strategy.position_avg_price * (1 - short_takeprofit_value/100)
plot(enable_long_strategy and not enable_short_strategy ? long_stoploss_price: na, color=#ff0000, style=plot.style_linebr, linewidth=2, title="Long SL Level")
plot(enable_long_strategy and not enable_short_strategy ? long_takeprofit_price: na, color=#008000, style=plot.style_linebr, linewidth=2, title="Long TP Level")
plot(enable_short_strategy and not enable_long_strategy ? short_stoploss_price: na, color=#ff0000, style=plot.style_linebr, linewidth=2, title="Short SL Level")
plot(enable_short_strategy and not enable_long_strategy ? short_takeprofit_price: na, color=#008000, style=plot.style_linebr, linewidth=2, title="Short TP Level")

// Date Range
start_date = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31, group="Date Range")
start_month = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12, group="Date Range")
start_year = input(title="Start Year", type=input.integer, defval=1804, minval=1800, maxval=3000, group="Date Range")
end_date = input(title="End Date", type=input.integer, defval=1, minval=1, maxval=3, group="Date Range")
end_month = input(title="End Month", type=input.integer, defval=1, minval=1, maxval=12, group="Date Range")
end_year = input(title="End Year", type=input.integer, defval=2077, minval=1800, maxval=3000, group="Date Range")
in_date_range = (time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0)) and (time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0))


//// Indicator Inputs
// Lazy Bear's Momentum Indicator
BlueWave = linreg(close - avg(avg(highest(high, 20), lowest(low, 20)), sma(close, 20)), 20, 0)

// Replicated version of Crypto Face's MFI Indicator
mfiUpper = sum(volume * (change(hlc3) <= 0 ? 0 : hlc3), 58)
mfiLower = sum(volume * (change(hlc3) >= 0 ? 0 : hlc3), 58)
_mfiRsi(mfiUpper, mfiLower) =>
    if mfiLower == 0
        100
    if mfiUpper == 0
        0
	100.0 - (100.0 / (1.0 + mfiUpper / mfiLower))

mf = _mfiRsi(mfiUpper, mfiLower)
mfi = (mf - 50) * 3


//// Strategy
// Creating Long and Short Strategy
buy_signal = crossover(BlueWave, 0) and mfi > 0 
sell_signal = crossunder(BlueWave, 0) and mfi < 0 

// Long Strategy
if buy_signal and in_date_range and enable_long_strategy == true
    strategy.entry("Long", true, when=buy_signal, alert_message="Open Long Position")
    strategy.exit("Long  SL/TP", from_entry="Long", loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message="Your Long SL/TP Limit As Been Triggered.")
    strategy.close("Long", when=sell_signal, alert_message="Close Long Position")

// Short Strategy
if sell_signal and in_date_range and enable_short_strategy == true
    strategy.entry("Short", false, when = sell_signal, alert_message="Open Short Position")
    strategy.exit("Short SL/TP", from_entry="Short", loss=short_stoploss_percentage, profit=short_takeprofit_percentage, alert_message="Your Short SL/TP Limit As Been Triggered.")
    strategy.close("Short", when=buy_signal, alert_message="Close Short Position")


もっと