この戦略は,価格変化とボリュームを比較して市場情勢を明らかにし,それをMACD形式で提示し,取引信号を生成します.
戦略は主に以下の方法を使って市場情勢を明らかにします.
各バーの物体量別価格の変化.これは直接,買取力と販売力の強さを示しています.
価格変化とボリュームに指数関数移動平均を別々に適用し,価格変化のEMAをボリュームのEMAで割る.これはいくつかのノイズをフィルタリングし,よりスムーズな"市場感情"曲線を生む.
MACDのような線を得るために,
ヒストグラムが0を超えると上昇傾向が上昇し,0を下回ると下落傾向が上昇する.ヒストグラムの差異も観察できる.
この戦略には以下の利点があります.
市場情勢を判断するために 音量情報を利用し より説得力があります
MACD形式は直感的で使いやすい.
異なる製品と時間枠に合わせて設定できるパラメータ
ヒストグラムの差異を検知して トレンドの逆転を 見つけることができます
簡単なコード構造で 分かりやすく最適化できます
この戦略には次のリスクもあります
価格の動きと組み合わせる必要がある.
MACD パラメータの設定が正しくない場合,見落としたまたは誤った信号が発生する可能性があります. パラメータは特定の製品およびタイムフレームに最適化する必要があります.
差異は誤った信号であり,トレンド逆転を確認できないので,慎重に解釈する必要があります.
遅刻して入場し 罠にかかったりします. ストップ損失を待つか,トレンドや関連製品で検証することができます.
戦略は以下の側面で最適化できます.
最適なパラメータを見つけるために,異なる製品と時間枠でパラメータの組み合わせをテストする.
損失リスクを減らすためにストップロスを追加します.
関連商品価格動向と組み合わせてシグナルを検証する.
マシン学習を使って パーマータを動的に最適化します
誤った信号を減らすためにフィルターを追加します.例えば,より高い時間枠の傾向,変動など.
この戦略は,価格変化とボリュームを比較することによって市場情勢を判断し,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))