
この戦略は,価格の変動と取引量の比較によって,市場参加者の感情を明らかにし,MACDの形で提示し,取引信号を発する.
この戦略は,主に以下の計算方法によって市場情勢を明らかにします.
取引量で割ったK線毎の価格変動は,直接的に買取力の強さを示す.
価格変化と取引量に対してそれぞれ指数平滑移動平均を適用し,価格変化のEMAを取引量EMAで割る.このようにして,部分的なノイズをフィルターして,より平滑な市場情緒曲線を得る.
市場情緒のの上に再計算すると,MACDに似た曲線が得られる.MACD線は動量の方向と強度を示し,信号線は移動平均であり,柱状図は動量の変化を表す2つの曲線の差値を示している.
柱状図の上の0を穿うときは多頭市場情勢の強化信号,下の0を穿うときは空頭市場情勢の強化信号である.柱状図の背離現象も見ることができる.
この戦略は以下の利点があります.
市場参加者の感情を判断するために,取引量情報を利用することで,より説得力があります.
MACDの形式は直感的で使いやすい.
パラメータは調整可能で,異なる品種と周期に適用されます.
柱状図の偏移を検知し,潜在的トレンド転換点を発見する.
コード構造は明確で,理解しやすく,最適化できます.
この戦略には以下のリスクがあります.
取引量は市場情勢を反映しますが,取引シグナルが正しいことを保証することはできません.価格の動きと組み合わせて判断する必要があります.
MACDパラメータの設定を間違えた場合,誤った信号または偽信号が生じる可能性があります.品種と周期に合わせてパラメータを最適化する必要があります.
逆転信号は偽信号であり,トレンドの逆転を特定できないため,慎重に検討する必要があります.
遅い入場で被套されるリスクがある. 追跡停止を適切に待つか,トレンドと関連品種との合理的な検証を行うことができる.
この戦略は,以下の点で最適化できます.
testing 異なる品種と周期のパラメータの組み合わせで,最適のパラメータを探します.
損失のリスクを減らすために, Stop Loss Strategies に加わります.
関連品種の価格動向と組み合わせて,取引シグナルを検証する.
機械学習による動的最適化パラメータ.
フィルタリング条件を増やして,偽信号を減らす.例えば,大規模なトレンド,波動率など.
この戦略は,価格変化と取引量比を活用して市場情勢を判断し,MACD形式で取引シグナルを生成する.価格情報のみと比較して,取引量を考慮して多空力対比と市場の熱度をより正確に判断できる.異なる品種と周期の最適化パラメータに応じて,さらに最適化できる.全体的に,この戦略の構想は新鮮で,使用が簡単で,市場ホットポイントを効果的に把握し,さらなる開発に値する.
/*backtest
start: 2023-10-13 00:00:00
end: 2023-11-12 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dannylimardi
//@version=4
strategy("Sentiment Oscillator", "Sentiment", overlay=false, initial_capital=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.08)
//Inputs
msLen = input(49, type=input.integer, title="Market Sentiment Lookback Length")
emaLen1 = input(40, type=input.integer, title="Fast EMA Length")
emaLen2 = input(204, type=input.integer, title="Slow EMA Length")
signalLen = input(20, type=input.integer, title="Signal Length")
showMs = input(false, type=input.bool, title="Show Market Sentiment?")
showHist = input(true, type=input.bool, title="Show Momentum?")
showMacd = input(false, type=input.bool, title="Show MACD Line?")
showSignal = input(false, type=input.bool, title="Show Signal Line?")
showCpv = input(false, type=input.bool, title="(Show Change/Volume for Each Bar?)")
showEma1 = input(false, type=input.bool, title="(Show Fast EMA?)")
showEma2 = input(false, type=input.bool, title="(Show Slow EMA?)")
//Calculations
priceChange = close - close[1]
changePerVolume = (priceChange/volume) * 10000000 // (The 1000000 doesn't have any significance, it's just to avoid color-change errors when the values are too emall.)
priceChangeEma = ema(priceChange, msLen)
volumeEma = ema(volume, msLen)
marketSentiment = priceChangeEma/volumeEma * 100000000
msEma1 = ema(marketSentiment, emaLen1)
msEma2 = ema(marketSentiment, emaLen2)
macd = msEma1-msEma2
signal = ema(macd, signalLen)
hist = macd-signal
//Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
//Drawings
plot(showHist ? hist : na, title="Histogram", style=plot.style_area, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)), transp=0 )
plot(showMacd ? macd : na, title="MACD", color=col_macd, transp=0)
plot(showSignal ? signal : na, title="Signal", color=col_signal, transp=0)
plot(showCpv ? changePerVolume : na, color=changePerVolume > changePerVolume[1] ? color.teal : color.red)
plot(0, color=color.white, transp=80)
plot(showEma1 ? msEma1 : na, color=color.aqua)
plot(showEma2 ? msEma2 : na, color=color.yellow)
plot(showMs ? marketSentiment : na, color=color.lime)
//Strategy
strategy.entry("Buy", strategy.long, when=crossover(hist, 0))
strategy.close("Buy", when=crossunder(hist, 0))