この戦略では,主に移動平均線HMAとEMAによって形成された統合を利用し,購入のタイミングを決定する.HMAがEMAを超えると,統合が終了し,新たな上昇傾向が形成されると考えられる.したがって,HMAが同時にEMAを超えると購入する.
この戦略は,RSIインジケーターを組み合わせて,過剰購入および過剰販売状態を検出する.RSIが70を下回るときに購入し,RSIが80を超えると部分的な利益を取ることを考慮する.
この戦略は200期EMAとHMAで構築された移動平均システムを使用している.それらのうちのHMA指標は,EMAに基づいて設計されたより敏感な移動平均指標である.HMAがEMAを超えると,統合段階が終了し,株価が上昇し始めることを意味します.この時点で,RSI指標が過買いを示さない場合は,購入信号が生成されます.
既存のポジションの場合,株価が再び下がり,HMAが再びEMAを下回り,新たな統合の始まりを示す場合,ポジション全体が閉鎖されます.同時に,RSIが80を超えると,損失を防ぐために利益の20%が部分的に取り上げられます.
この戦略のトランザクションロジックはかなりシンプルで,主にHMAとEMAの長距離と短距離の交差と,RSIの高低を組み合わせて,比較的堅牢な取引戦略を形成します.
この戦略の最大の利点は,EMAとHMAの統合取引パターンを活用することで,ほとんどの偽ブレイクがフィルタリングされ,利益率を改善できるということです.同時に,RSI指標の補助はリスクも効果的に制御できます.両者の組み合わせにより,この戦略は統合と変動市場にとても適しています.
さらに,この戦略は3つの指標のみを使用し,論理はシンプルで,パラメータとバックテストを最適化し,戦略の検証と改善を促進します.
この戦略にはいくつかの利点があるが,注意すべきリスクもある.例えば,保有期間が比較的長くなり,サポートに必要な資金が十分である.横向的な統合期間に遭遇した場合,ストップロスの迅速な出口はできない.これは容易に損失拡大の状況につながります.
また,この戦略は主に移動平均指標に依存している.価格の異常な突破が発生した場合,ストップ損失対策が効果を発揮できず,リスクが大きくなる可能性がある.また,パラメータ設定は戦略のパフォーマンスにも影響し,最適なパラメータを見つけるために広範なテストを必要とする.
この戦略は,上記のリスクを考慮して,次の側面で最適化できます.
変動指標を組み合わせて,市場の変動に基づいてポジションを動的に調整する.
不必要な逆転取引を避けるために 傾向指標の判断を増やす.
移動平均のパラメータを最適化し,現在の市場特性に近づける.
タイムストップを使って 大きすぎる単一の損失を回避します
一般的に,これは比較的古典的なシンプルな統合と変動戦略である.これは主に株式指数やホットストックの短期および中期取引に使用され,比較的安定したアルファ値を得ることができる.パラメータの最適化とリスク管理措置の強化により,この戦略のパフォーマンスは依然として改善の余地がある.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 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/ // © mohanee //@version=4 strategy(title="EMA_HMA_RSI_Strategy", overlay=true, pyramiding=2, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD) //default_qty_value=10, default_qty_type=strategy.fixed, //longCondition = crossover(sma(close, 14), sma(close, 28)) //if (longCondition) //strategy.entry("My Long Entry Id", strategy.long) //shortCondition = crossunder(sma(close, 14), sma(close, 28)) //if (shortCondition) // strategy.entry("My Short Entry Id", strategy.short) //HMA HMA(src1, length1) => wma(2 * wma(src1, length1/2) - wma(src1, length1), round(sqrt(length1))) var stopLossVal=0.00 //variables BEGIN length=input(200,title="EMA and HMA Length") //square root of 13 rsiLength=input(13, title="RSI Length") takePartialProfits = input(true, title="Take Partial Profits (if this selected, RSI 13 higher reading over 80 is considered for partial closing ) ") stopLoss = input(title="Stop Loss%", defval=8, minval=1) //variables END //RSI rsi13=rsi(close,rsiLength) ema200=ema(close,length) hma200=HMA(close,length) //exitOnAroonOscCrossingDown = input(true, title="Exit when Aroon Osc cross down zero ") // Drawings //Aroon oscillator arronUpper = 100 * (highestbars(high, length+1) + length)/length aroonLower = 100 * (lowestbars(low, length+1) + length)/length aroonOsc = arronUpper - aroonLower aroonMidpoint = 0 //oscPlot = plot(aroonOsc, color=color.green) //midLine= plot(aroonMidpoint, color=color.green) //topLine = plot(90,style=plot.style_circles, color=color.green) //bottomLine = plot(-90,style=plot.style_circles, color=color.red) //fill(oscPlot, midLine, color=aroonOsc>0?color.green:color.red, transp=50) //fill(topLine,bottomLine, color=color.blue) //fill(topLine,oscPlot, color=aroonOsc>90?color.purple:na, transp=25) // RSI //plot(rsi13, title="RSI", linewidth=2, color=color.purple) //hline(50, title="Middle Line", linestyle=hline.style_dotted) //obLevel = hline(80, title="Overbought", linestyle=hline.style_dotted) //osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted) //fill(obLevel, osLevel, title="Background", color=rsi13 >=30 ? color.green:color.purple, transp=65) // longTermRSI >=50 hullColor = hma200 > hma200[2] ? #00ff00 : #ff0000 plot(hma200, title="HULL 200", color=hullColor, transp=25) plot(ema200, title="EMA 200", color=color.orange) //Entry-- strategy.initial_capital = 50000 strategy.entry(id="Long Entry", comment="LE", qty=(strategy.initial_capital * 0.10)/close, long=true, when=strategy.position_size<1 and hma200 < ema200 and hma200 > hma200[2] and rsi13<70 ) // // aroonOsc<0 //Add if(strategy.position_size>=1 and close < strategy.position_avg_price and ( crossover(rsi13,30) or crossover(rsi13,40) ) ) // hma200 < ema200 and hma200 > hma200[2] and hma200[2] < hma200[3] ) //and crossover(rsi13,30) aroonOsc<0 //and hma200 > hma200[2] and hma200[2] <= hma200[3] //crossover(rsi13,30) qty1=(strategy.initial_capital * 0.10)/close //stopLossVal:= abs(strategy.position_size)>1 ? ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 strategy.entry(id="Long Entry", comment="Add", qty=qty1, long=true ) //crossover(close,ema34) //and close>ema34 //crossover(rsi5Val,rsiBuyLine) -- SL="+tostring(stopLossVal, "####.##") //stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-0.5) : 0.00 stopLossVal:= abs(strategy.position_size)>1 ? ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 //stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-stopLoss*0.01) : 0.00 barcolor(color=strategy.position_size>=1? rsi13>80 ? color.purple: color.blue:na) //close partial if(takePartialProfits==true) strategy.close(id="Long Entry", comment="Partial X points="+tostring(close - strategy.position_avg_price, "####.##"), qty_percent=20 , when=abs(strategy.position_size)>=1 and crossunder(rsi13, 80) and close > strategy.position_avg_price ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close All //if(exitOnAroonOscCrossingDown) // strategy.close(id="Long Entry", comment="Exit All points="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and crossunder(aroonOsc, 0) ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89 //close All on stop loss strategy.close(id="Long Entry", comment="Stoploss X points="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and close < stopLossVal ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89 strategy.close(id="Long Entry", comment="hmaXema X points="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and close > strategy.position_avg_price and crossunder(hma200,ema200) ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89