
多指標評価取引戦略は,技術指標の評価を統合し,トレンドの方向と強さを識別し,自動取引を実現する.この戦略は,イチモク雲,HMA,RSI,Stoch,CCI,MACDを含む指標のグループを総合的に考慮する.各指標の結果に基づいて,その評価を,そして,すべての指標の評価を統合して,全体的な評価を形成する.全体的な評価が値より高いとき,値より低いとき,空間で,より多くのことをする.
この戦略は以下の部分から構成されています.
イチモク雲,ハル移動平均,相対的強弱指数,ランダムな指数,商品通路指数,移動平均の感度など,一組の指標を計算する.
各指標に評価する.指針が多頭信号を示すときは正点,空頭信号を示すときは負点を与える.
すべての指標のスコアを加算して平均すると,総合的なスコアが得られます.
総合評価と事前に設定された値を比較して,全体的なトレンド方向を判断する. 評価は値より高く見ると,値より低く見ると空っぽである.
判断結果に基づいて開設する.見上げると見上げ,見落として見落としする.
ストップダメージはATR指数で設定されます.
この戦略は,複数の指標の優位性を充分に活用し,市場トレンドの方向性を総合的に判断する.単一の指標と比較して,部分的な偽信号をフィルターすることができ,信号の信頼性を向上させる.
この戦略の利点は以下の通りです.
複数の指標を総合判断し,信号の正確性を向上させる.単一の指標は誤判に容易である.この戦略は,平均を求めるスコアで,偽の信号を効果的にフィルターすることができる.
指標の優位性を利用して,トレンドと現在の強さを識別する.例えば,イチモク雲は,大トレンドを判断し,ストッチは,超買超売を判断する.
自動取引は感情を避け,戦略信号を厳格に実行する.
ATRを使用すると,リスク管理に有利なストップダメージの利点を設定できます.
異なる品種に対してパラメータ調整が可能である。指標パラメータと評価値も最適化できる。
戦略の論理はシンプルで明快で,理解し,修正しやすい.
この戦略には以下のリスクもあります.
複数の指標の組み合わせは必ずしも単一の指標より優れているとは限りません.最適なパラメータを見つけるために,繰り返しテストする必要があります.
指標が誤った信号を発した場合は,平均評価も完全に損失を回避することはできません.
ATR停止は,あまりにも接近しすぎたり,あまりにも緩やかになり,品種特性に合わせて調整する必要がある.
過度な最適化によって生じる曲線適合は避ける必要がある.異なる品種と時間帯で戦略の安定性をテストすべきである.
取引頻度が高く,取引コストが最終利益に影響する可能性があります.
この戦略は以下の点で最適化できます.
特定の品種に最適の組み合わせをテストする.
各指標のスコアを調整し,スコアアルゴリズムを最適化します.
ATRのパラメータを動的に調整し,市場変動に適したストップ・ローズを設定する.
トレードフィルタリング条件を追加し,不必要な取引頻度を減らす.例えば,トレンドフィルタリング,取引量フィルタリングなど.
ステップアップ最適化により,パラメータ最適化区間を見つけ,ランダム/格子最適化により,最適なパラメータ組み合わせを見つけます.
多種多時間枠で戦略の安定性をテストし,過度に最適化を避ける.
他の有効な取引戦略と組み合わせて,戦略のポートフォリオを形成する.
多指標評価取引戦略は,平均を求める考え方を評価することで,信号判断の正確性と信頼性を向上させる.この戦略のパラメータ調整の余地が広く,異なる品種に対して最適化することで,よりよい効果が得られる.しかしながら,過剰最適化のリスクにも注意し,パラメータ最適化と戦略テストの科学性を維持する必要がある.最適化方向の広範囲な取引戦略戦略としては,さらなる研究と応用に値する.
/*backtest
start: 2022-10-31 00:00:00
end: 2023-11-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Ichi HMA RSI Stoch CCI MACD Technicals Rating Strategy",shorttitle="TRSv420",overlay=true,default_qty_type=strategy.percent_of_equity,default_qty_value=50,commission_type=strategy.commission.percent,commission_value=0.05)
res = input("", title="Indicator Timeframe", type=input.resolution)
Period = input(defval = 14, title = "Period Length", minval = 2)
MinSignalStrength= input(title="Minimum Signal Strength", type=input.float, defval=1.1, minval=0.00, maxval=2.00, step=0.1)
Price = input(defval=open, title="Price Source", type=input.source)
Use_Only_Buy= input(false, title = "Use ONLY BUY mode",type=input.bool)
Use_Only_Sell= input(false, title = "Use ONLY SELL mode",type=input.bool)
Use_ATR_SL_TP= input(true, title = "Use ATR for TP & SL",type=input.bool)
Use_Ichimoku= input(true, title = "Use Ichimoku",type=input.bool)
Use_HMA= input(true, title = "Use Hull MA",type=input.bool)
Use_RSI= input(true, title = "Use RSI",type=input.bool)
Use_Stoch= input(true, title = "Use Stoch",type=input.bool)
Use_CCI= input(true, title = "Use CCI",type=input.bool)
Use_MACD= input(true, title = "Use MacD",type=input.bool)
// Ichimoku Cloud
donchian(len) => avg(lowest(len), highest(len))
ichimoku_cloud() =>
conversionLine = donchian(9)
baseLine = donchian(26)
leadLine1 = avg(conversionLine, baseLine)
leadLine2 = donchian(52)
[conversionLine, baseLine, leadLine1, leadLine2]
[IC_CLine, IC_BLine, IC_Lead1, IC_Lead2] = ichimoku_cloud()
calcRatingMA(ma, src) => na(ma) or na(src) ? na : (ma == src ? 0 : ( ma < src ? 1 : -1 ))
calcRating(buy, sell) => buy ? 1 : ( sell ? -1 : 0 )
calcRatingAll() =>
//============== HMA =================
HMA10 = hma(Price, Period)
HMA20 = hma(Price, 20)
HMA30 = hma(Price, 30)
HMA50 = hma(Price, 50)
HMA100 = hma(Price, 100)
HMA200 = hma(Price, 200)
// Relative Strength Index, RSI
RSI = rsi(Price,14)
// Stochastic
lengthStoch = 14
smoothKStoch = 3
smoothDStoch = 3
kStoch = sma(stoch(Price, high, low, lengthStoch), smoothKStoch)
dStoch = sma(kStoch, smoothDStoch)
// Commodity Channel Index, CCI
CCI = cci(Price, 20)
// Moving Average Convergence/Divergence, MACD
[macdMACD, signalMACD, _] = macd(Price, 12, 26, 9)
// -------------------------------------------
PriceAvg = hma(Price, Period)
DownTrend = Price < PriceAvg
UpTrend = Price > PriceAvg
float ratingMA = 0
float ratingMAC = 0
if(Use_HMA)
if not na(HMA10)
ratingMA := ratingMA + calcRatingMA(HMA10, Price)
ratingMAC := ratingMAC + 1
if not na(HMA20)
ratingMA := ratingMA + calcRatingMA(HMA20, Price)
ratingMAC := ratingMAC + 1
if not na(HMA30)
ratingMA := ratingMA + calcRatingMA(HMA30, Price)
ratingMAC := ratingMAC + 1
if not na(HMA50)
ratingMA := ratingMA + calcRatingMA(HMA50, Price)
ratingMAC := ratingMAC + 1
if not na(HMA100)
ratingMA := ratingMA + calcRatingMA(HMA100, Price)
ratingMAC := ratingMAC + 1
if not na(HMA200)
ratingMA := ratingMA + calcRatingMA(HMA200, Price)
ratingMAC := ratingMAC + 1
if(Use_Ichimoku)
float ratingIC = na
if not (na(IC_Lead1) or na(IC_Lead2) or na(Price) or na(Price[1]) or na(IC_BLine) or na(IC_CLine))
ratingIC := calcRating(
IC_Lead1 > IC_Lead2 and Price > IC_Lead1 and Price < IC_BLine and Price[1] < IC_CLine and Price > IC_CLine,
IC_Lead2 > IC_Lead1 and Price < IC_Lead2 and Price > IC_BLine and Price[1] > IC_CLine and Price < IC_CLine)
if not na(ratingIC)
ratingMA := ratingMA + ratingIC
ratingMAC := ratingMAC + 1
ratingMA := ratingMAC > 0 ? ratingMA / ratingMAC : na
float ratingOther = 0
float ratingOtherC = 0
if(Use_RSI)
ratingRSI = RSI
if not(na(ratingRSI) or na(ratingRSI[1]))
ratingOtherC := ratingOtherC + 1
ratingOther := ratingOther + calcRating(ratingRSI < 30 and ratingRSI[1] < ratingRSI, ratingRSI > 70 and ratingRSI[1] > ratingRSI)
if(Use_Stoch)
if not(na(kStoch) or na(dStoch) or na(kStoch[1]) or na(dStoch[1]))
ratingOtherC := ratingOtherC + 1
ratingOther := ratingOther + calcRating(kStoch < 20 and dStoch < 20 and kStoch > dStoch and kStoch[1] < dStoch[1], kStoch > 80 and dStoch > 80 and kStoch < dStoch and kStoch[1] > dStoch[1])
if(Use_CCI)
ratingCCI = CCI
if not(na(ratingCCI) or na(ratingCCI[1]))
ratingOtherC := ratingOtherC + 1
ratingOther := ratingOther + calcRating(ratingCCI < -100 and ratingCCI > ratingCCI[1], ratingCCI > 100 and ratingCCI < ratingCCI[1])
if(Use_MACD)
if not(na(macdMACD) or na(signalMACD))
ratingOtherC := ratingOtherC + 1
ratingOther := ratingOther + calcRating(macdMACD > signalMACD, macdMACD < signalMACD)
ratingOther := ratingOtherC > 0 ? ratingOther / ratingOtherC : na
float ratingTotal = 0
float ratingTotalC = 0
if not na(ratingMA)
ratingTotal := ratingTotal + ratingMA
ratingTotalC := ratingTotalC + 1
ratingTotal := ratingTotal + ratingOther
ratingTotalC := ratingTotalC + 1
ratingTotal := ratingTotalC > 0 ? ratingTotal / ratingTotalC : na
[ratingTotal, ratingOther, ratingMA, ratingOtherC, ratingMAC]
[ratingTotal, ratingOther, ratingMA, ratingOtherC, ratingMAC] = security(syminfo.tickerid, res, calcRatingAll(), lookahead=false)
tradeSignal = ratingTotal+ratingOther+ratingMA
dynSLpoints(factor) => factor * atr(14) / syminfo.mintick
if not (Use_Only_Sell)
strategy.entry("long", strategy.long, when = tradeSignal > MinSignalStrength)
if not (Use_Only_Buy)
strategy.entry("short", strategy.short, when = tradeSignal < -MinSignalStrength)
if(Use_ATR_SL_TP)
strategy.exit("sl/tp", loss = dynSLpoints(3), trail_points = dynSLpoints(5), trail_offset = dynSLpoints(2))