
この戦略は,異なる時間ウィンドウ内の取引量の買賣圧力の差を計算し,MACD指標の多空信号と組み合わせて,トレンド反転の取引戦略を設計した.この戦略は,取引量の異動をトレンド反転の信号として使用し,MACDの多空信号で検証し,反転の機会を捕捉する.
この戦略の核心的な論理は以下の通りです.
異なる時間ウィンドウ (長短ウィンドウ) の取引量,買取圧力,売り出力などを計算する. 買取圧力差によって将来のトレンド方向を判断する.
MACDの差値 ((MACD線と信号線の差) を用いて多空状態を判断する.交替量の買賣圧力信号を合成し,トレンドの逆転を検証する.
取引量買入圧力の異動が拡大し,MACD線が通過すると,空転多からトレンドの反転が起こる可能性があると考えられている.
取引量が圧力の異動を拡大し,MACD線が通過すると,多転空によるトレンドの反転が起こる可能性があると考えられている.
逆転信号に入ると,ストップ・ストップ・損失戦略を使用してリスクを制御する.
この戦略の利点は以下の通りです.
取引量の多空差を活用してトレンドの逆転点を判断し,均等線などのトレンド判断指標にのみ依存して取引量の役割を無視することを避ける.
MACD指標の多空信号検証反転と組み合わせると判断の正確性が向上する.
長い短時間窓を使用して,交差量の異動方向を判断し,反転信号をより信頼できるようにする.
逆転戦略の平均利回りは高かった.
この戦略には以下のリスクもあります.
交差量とMACD信号は,誤った信号を発し,反転判断誤りのリスクを引き起こす可能性があります.
逆転のシグナルが出た後,市場が再び調整され,直接逆転できないリスク.
ストップ・ストップ・ロスの設定が不適切で,損失の拡大の危険性がある.
安定した収益を求める投資家に適していない.
この戦略は以下の点で最適化できます.
逆転判断の精度を高めるため,長短の時間窓の間隔を最適化します.
MACDパラメータを最適化し,多空判断の正確性を向上させる.
ストップ・ストップ・ロスのアルゴリズムを最適化して,損失のリスクを低減する.
逆転の成功率を向上させるため,
ポジションコントロールと資金管理モジュールを追加
この戦略は,全体として,典型的なトレンド逆転アルゴリズム取引戦略である.これは,取引量の異動を拡大して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)