3移動平均振動範囲反転戦略


作成日: 2024-02-18 11:18:51 最終変更日: 2024-02-18 11:18:51
コピー: 0 クリック数: 649
1
フォロー
1617
フォロワー

3移動平均振動範囲反転戦略

概要

この戦略は,3日間の急速移動平均,10日間のゆっくり移動平均および16日間のシグナル平滑移動平均を用いてMACD指標を構築し,RSI指標と取引量特性を補足し,多次元K線特性を設定し,市場が過剰に結束していると判断し,区間振動傾向を形成し,エントリーを逆転させ,利益を得る.

戦略原則

コードは主に3日快移動平均減10日遅移動平均を用いてMACD指数を形成し,16日信号線を平滑処理して標準MACD戦略を形成する.同時に,交差量分析を組み合わせて買いと売り量を組み合わせて,強さの特徴を判断する.また,RSI指数も導入し,超買いと超売りを判断する.複数の指標を組み合わせて,状況の特徴を判断し,インターバル震動の傾向の変化を発見し,エントリー信号を構築する.

具体的には,MACD線と信号線の関係,斜率の変化を観察し,多空力の消化を判断し,逆転の機会を探します.同時に,取引量の売買量の変化も多空力の消化を反映します.RSI指標の変化と組み合わせて,超買い超売り現象を判断し,これらの指標を総合して,状況の局部特性を判断し,逆転のタイミングを判断することができます.

この戦略は,以下の3つのEntry信号を設定しています.

  1. 取引量が買取量の優位性がないとき,RSIが41を下回って上昇し,MACD信号が明らかに偏っていないとき,多額の取引を行う.

  2. 取引量が買取量の優位性があるとき,RSIが45-55の範囲で上昇し,MACDとシグナルラインが同上になると,多めに行います.

  3. MACDが設定された値を超えて上昇すると空白する.

この3つの状況は,短期間の地域的な揺れと,一方的な過剰な拡大を反映しているため,逆転の良い時であると判断され,逆転操作が行われる.

Exitは,止損と停止の方法として設定され,コントロールを撤回し,利益の現金化を行う.

優位分析

この戦略は,多種多様な指標を組み合わせて,震動区間とオーバーバイオーバーセルの現象を判断し,反転して利益を得る考え方を明確にします.取引量分析はより深く使用され,操作の根拠が増加します.止損の設定もより慎重であり,過剰な追及を避けるため,落を防ぐことができます.

具体的には,次の利点があります.

  1. MACDは,価格と取引量との関係を判断する量的な価格テスト指標であり,単一の技術面分析の主観を避ける.

  2. エアフォースを追加し,エントリーを確認します.

  3. RSIは,超買いと超売れを判断し,反転を助ける.

  4. 止損が設定され,過度の損失を防止し,利益の一部をロックします.

リスク分析

この戦略は,複数の指標を組み合わせて勝率を上げても,いずれの戦略にも必ずある程度のリスクがあります.

  1. 逆転後に元のトレンドを継続するなど,指数が誤った信号を発する確率;

  2. ストップ・ストープの設定が不適切で,撤回が過大で,利益が十分に固定されない可能性もある.

  3. パラメータ設定は,平均線パラメータ組み合わせ,RSI周期,ストップ・ストップ倍数などのさらなるテスト最適化が必要になる可能性があります.

これらのリスクは,さらなる最適化によって軽減できます.具体的方法は,次のセクションで説明されます.

最適化の方向

この戦略は,さらに改善できる余地があり,以下の分野に重点を置いています.

  1. 異なる均線参数設定をテストし,最適な組み合わせを探します.

  2. RSIパラメータの設定をテストし,超買いと超売りを判断するのに適した周期を決定します.

  3. ストップ・ロスの倍数を最適化し,最大リトレイと利益のロックとの間にバランスをとる.

  4. 機械学習モデルを導入し,より大きなデータから訓練し,誤判の可能性を減らす,勝利率を上げる.

これらの最適化手段は,より体系的な反測によって実現できる.パラメータ空間テストの拡大とサンプル数の増加とともに,戦略の勝利率と収益指標も向上する.

要約する

この戦略は,MACD,RSI,取引量三大指標を総合的に使用し,市場状況の区間間の震動特性を判断し,反転点でエントリーを設定し,反転増幅を狙う.戦略の考え方は明確で,トレンドと反転を兼ね,最適化後に良い利益の余地がある.パラメータ調整とモデルの導入により,高効率の安定した量化戦略になる見込みである.

ストラテジーソースコード
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 1 Oscillator Profile Flagging", shorttitle="3 1 Oscillator Profile Flagging", overlay=false)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.7)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=6)
takeProfit = input( title="Take Profit", defval=2)
stopLoss = input( title="Stop Loss", defval=0.7)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
plot(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
plot(macdSlope, color=color.green, title="MACD Slope")
plot(signalSlope, color=color.red, title="Signal Slope")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]
plot(rsiSlope, color=color.black, title="RSI Slope")

getRSISlopeChange(lookBack) =>
    j = 0
    for i = 0 to lookBack
        if ( rsi[i] - rsi[ i + 1 ] ) > -5
            j += 1
    j

getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0.0
    float s = 0.0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0.0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0.0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0

bool isPositiveSignalReversal = signalSlope > 0.0 and signalSlope[1] < 0.0
bool isPositiveMacdReversal = macdSlope > 0.0 and macdSlope[1] < 0.0

bool hasBearInversion = signalSlope > 0.0 and macdSlope < 0.0
bool hasBullInversion = signalSlope < 0.0 and macdSlope > 0.0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0.0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0.0
bool hasSignalSellerBias = hasSignalBias and signal < 0.0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )


// 202.30 Profit 55.29% 5m
if ( ( getVolBias(longLookBack) == false ) and rsi <= 41 and math.abs(rsi - rsi[shortLookBack]) > 1 and hasNoSignalBias and rsiSlope > 1.5 and close > open)
    strategy.entry("5C1", strategy.long, qty=1)
strategy.exit("TPS", "5C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 171.70 Profit 50.22% 5m
if ( getVolBias(longLookBack) == true and rsi > 45 and rsi < 55 and macdSlope > 0 and signalSlope > 0)
    strategy.entry("5C2", strategy.long, qty=1)
strategy.exit("TPS", "5C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 309.50 Profit 30.8% 5m 2 tp .7 sl 289 trades
if ( macd > macdBiasValue and macdSlope > 0)
    strategy.entry("5P1", strategy.short, qty=1)
strategy.exit("TPS", "5P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)