イントラバー・ボラティリティ・トレーディング戦略によるトレンド逆転

作者: リン・ハーンチャオチャン開催日:2024年2月26日17時15分54秒
タグ:

img

概要

この戦略は,トレンド逆転の取引戦略を設計するために,異なる時間段間の取引量における購入・販売圧力差をMACD信号と組み合わせて計算する.主にトレンド逆転を判断するための信号として取引量の異常を活用し,MACD購入・販売信号で検証し,それによって逆転機会を把握する.

戦略の原則

この戦略の基本的な論理は以下の点に基づいています

  1. 異なる時間窓 (短時間と長い時間窓) で取引量の購入圧力と販売圧力を計算する. 購入圧力と販売圧力の違いに基づいて将来のトレンド方向を判断する.

  2. ロングとショート状態を決定するためにMACDの差値 (MACDラインとシグナルラインの差値) を使用します.トレンド逆転を検証するために取引量における購入および販売圧力信号と組み合わせます.

  3. 取引量の購買圧力異常が拡大し,MACD線が横切ると,市場は売りから買いにトレンド逆転を起こす可能性があることが決定されます.

  4. 取引量の販売圧力異常が拡大し,MACD線が横断すると,市場は購入から販売へのトレンド逆転を起こす可能性があることが決定されます.

  5. 逆転信号を入力した後,リスクを制御するために,利益とストップ損失戦略を使用します.

利点分析

この戦略の利点は以下の通りです.

  1. トランザクション・ボリュームの長/短差を使用してトレンド逆転点を決定することは,トレンド決定指標 (移動平均値など) にのみ頼るのを避け,トレンド・ボリュームの役割を無視する.

  2. MACD信号を組み合わせて逆転を検証することで判断の正確性が向上します

  3. 取引量の異常を特定するために長時間と短い時間窓を使用することで 逆転信号がより信頼できます

  4. 逆転戦略は平均的な利益率が高くなります

リスク分析

この戦略のリスクは以下のとおりです.

  1. トランザクション・ボリュームとMACD信号は誤った信号を与え,逆転に関する誤った判断につながる可能性があります.

  2. 逆転信号が発信された後,市場は再び調整され,すぐに逆転することができません.

  3. 誤った取利益とストップロスの設定は損失を拡大させる可能性があります.

  4. 安定した利益を求める投資家に適さない

オプティマイゼーションの方向性

この戦略の最適化には,以下のものがある.

  1. 逆転判断をより正確にするために,長時間と短時間の窓を最適化します.

  2. 長/短の精度を高めるためにMACDパラメータを最適化します.

  3. 損失リスクを減らすために 利得とストップ損失のアルゴリズムを最適化します

  4. 逆転の成功率を向上させるため 異常判断の指標を追加します

  5. ポジションサイズとマネーマネジメントのモジュールを追加します

結論

概要すると,これは典型的なトレンド逆転アルゴリズム的な取引戦略である.これは主に取引量異常の増幅とMACD信号検証を頼りに,ロングからショートポジションへの価格逆転を決定し,捕捉する.この戦略は高い精度と良いリターンの利点がありますが,一定のリスクもあります.パラメータと機能のさらなる最適化により,戦略がさらにうまく機能することができます.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)
takeProfit = input( title="Take Profit", defval=0.75)
stopLoss = input( title="Stop Loss", defval=0.5)

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")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
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
    float s = 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 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 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 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

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

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

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

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

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 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 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short, qty=10)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long, qty=10)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

もっと