この戦略は,EMAとRSIの2つの指標を組み合わせて,トレンドの方向を識別し,取引を行う.価格がEMA上であり,RSIが買点より低ければ看板;価格がEMA下であり,RSIが売点より高ければ看板.そして,最後の2つのK線の閉店価格大小関係を組み合わせて,トレンドの方向を決定し,トレンド取引を実現する.
200日EMAを計算し,トレンド判断の平均線指標とする. EMAは価格の変化に素早く反応し,トレンド方向を効果的に判断することができる.
14日RSIを計算し,超買超売りかどうかを判断する。RSIは50を下回ると超売り,50以上は超買と見なされる。同時にRSIの上下トレンドを組み合わせて,買い買いを判断する。
最後の2つのK線の閉盘価格の大きさの関係を比較して,トレンドの方向を判断する. 最後の2つの閉盘価格の増加は上昇傾向にあると考えられ,減少は下降傾向にあると考えられる.
値上がり傾向にあるとき,価格が200日EMAより高く,RSIが50より低く,値上がりしているとき,買入シグナルを発する.
価格が200日EMAを下回り,RSIが50を超えて下落しているとき,下落傾向にあるとき,セールシグナルを発行する.
ATRと最近14のK線の最高値,最低値が,ストップ・ロズ・ポイントとストップ・ストップ・ポイントの計算に使用される.
モバイル・ストップ・ストラトジーを採用し,リスクをコントロールする.
二重指標は,トレンドの方向を判断する組み合わせで,精度が向上する.EMAは,主トレンドを判断し,RSIとK線関係が局所的なトレンドと買い物タイミングを判断する.
RSI指標は,偽の突破を効果的に回避する. RSIの空白状態によって,EMA指標の遅れによる不必要な取引を回避する.
モバイル・ストップは,個々の大幅波動による損失を効果的に制御する.
最適化されたパラメータの組み合わせにより,戦略パラメータの頑丈性が強くなっています.
大幅の振動では,EMAとRSIが誤信号を生じる可能性が高いので,このような振動は避けるべきです.
ストップポイントが小さすぎると,過度のストップが起こりやすい.ストップポイントが大きすぎると,損失を制御することが困難である.ATRパラメータを適切に調整する.
日中のEMAを突破した後に再調整される可能性が高いので,RSIのパラメータを適切に緩め,トレンドを逃さないようにしてください.
適切なATRパラメータとストップ距離を調整し,より良いストップポイントを見つけます.
EMAとRSIのパラメータを最適化して,より適切なパラメータの組み合わせを見つけます.
MACD,ブリン帯など,他の補助指標をフィルタリングに追加して,信号の正確性を向上させる.
異なる品種のパラメータ設定の差異性をテストすることができ,パラメータの安定性をさらに向上させることができる.
特定の時間帯で戦略を停止し,誤信号が発生しやすい時間帯を回避することができます.
この戦略は,全体的に安定しており,収益は安定しており,最大撤退とシャープ率も非常に優れている.パラメータ最適化とストップポイントの調整によって,戦略の効果をさらに高めることができる.また,特定の状況下で発生する誤信号に警戒する必要があり,補助指標または時間フィルターを使用してこれらの状況を回避する必要がある.この戦略は,継続的な最適化によって,長期にわたって保持する価値のある安定策になる見込みがある.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-08-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// strategy("EMA RSI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Author : AJ Rupasinghege
// Date : 06/11/2022
// Release : v6.0
// Description : If the last two closes are in ascending order, the rsi is below 50 and ascending, and the current candle is above 200 ema, then LONG.
// If the last two closes are in descending order, the rsi is above 50 and descending, and the current candle is below 200 ema, then SHORT.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// INPUTS //////////////////////////////////////////////////////////////
ema_length = input(200, "EMA Length")
rsi_buy_value = input(50, "RSI Buy Value")
rsi_sell_value = input(50, "RSI Sell Value")
show_data = input.bool(0, "Show Data")
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////
var stop_loss = 0.0
var last_trade_entry_price = 0.0
var low_value= 0.0
var atr = 0.0
var high_value = 0.0
var stop_loss_points = 0.0
var limit = 0.0
var bar_id_entry = 0
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// FUNCTIONS //////////////////////////////////////////////////////////
getTradeConditionsLong() =>
//@function Used to calculate stop_loss, stop_loss points, limit and label values for long trades
//@param direction (float) // strategy.poistion.size
//@returns stop_loss, stop_loss_points, limit
//@Dependancies low_value, atr, last_trade_entry_price,bar_id_entry
_stop_loss = low_value - atr
_stop_lossPoints = (last_trade_entry_price - _stop_loss) *100000
_limit = last_trade_entry_price + (last_trade_entry_price - low_value + atr)
value = "OpenValue: " + str.tostring(last_trade_entry_price) +
"\n OpenBarIndex: " + str.tostring(bar_id_entry) +
"\n LowValue: " + str.tostring(low_value) +
"\n atr: " + str.tostring(atr) + "\n stop_loss: " +
str.tostring(_stop_loss) + "\n Limit: " +
str.tostring(_limit)
[_stop_loss,_stop_lossPoints,_limit, value]
getTradeConditionsShort() =>
//@function Used to calculate stop_loss, stop_loss points, limit and label values for short trades
//@param direction (float) // strategy.poistion.size
//@returns stop_loss, stop_loss_points, limit
//@Dependancies high_value, atr, last_trade_entry_price,bar_id_entry
_stop_loss = high_value + atr
_stop_lossPoints = (_stop_loss -last_trade_entry_price) * 100000
_limit = last_trade_entry_price - (high_value - last_trade_entry_price + atr)
value = "OpenValue: " + str.tostring(last_trade_entry_price) +
"\n OpenBarIndex: " + str.tostring(bar_id_entry) +
"\n HighValue: " + str.tostring(high_value) +
"\n atr: " + str.tostring(atr) + "\n stop_loss: " +
str.tostring(_stop_loss) + "\n Limit: " +
str.tostring(_limit)
[_stop_loss,_stop_lossPoints,_limit, value]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// SIGNALS //////////////////////////////////////////////////////////
ema = ta.ema(close,ema_length)
rsi = ta.rsi(close,14)
ema_buy_signal = ema < low
ema_sell_signal = ema > high
rsi_buy_signal = rsi < rsi_buy_value and rsi[1] < rsi[0]
rsi_sell_signal = rsi > rsi_sell_value and rsi[1] > rsi[0]
trend_buy_signal = close[2] < close[1] and close[1] < close[0]
trend_sell_signal = close[2] > close[1] and close[1] > close[0]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// TRADES //////////////////////////////////////////////////////////
long = trend_buy_signal
and ema_buy_signal
and rsi_buy_signal
short = trend_sell_signal
and ema_sell_signal
and rsi_sell_signal
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// STRATEGY //////////////////////////////////////////////////////////
if long
strategy.entry("Long", strategy.long)
if short
strategy.entry("Short", strategy.short)
// Calculate Trade Entry Variables
last_trade_entry_price := strategy.opentrades.entry_price(strategy.opentrades - 1)
bar_id_entry := strategy.opentrades.entry_bar_index(strategy.opentrades - 1)
atr := ta.atr(14)
low_value := ta.lowest(14)
high_value := ta.highest(14)
// Exit Strategy for Long Positions
if (strategy.position_size[1] != strategy.position_size and strategy.position_size>0)
[_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsLong()
stop_loss := _stop_loss
stop_loss_points := _stop_loss_points
limit := _limit
if show_data
label.new(bar_id_entry,stop_loss - 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none)
strategy.exit("Long Exit", "Long", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit )
// Exit Strategy for Short Positions
if (strategy.position_size[1] != strategy.position_size and strategy.position_size<0)
[_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsShort()
stop_loss := _stop_loss
stop_loss_points := _stop_loss_points
limit := _limit
if show_data
label.new(bar_id_entry,stop_loss + 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none)
strategy.exit("Short Exit", "Short", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit )
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// PLOTS //////////////////////////////////////////////////////////
plot(ema, "SMA", color = color.blue, linewidth = 2 )
p1 = plot(strategy.position_size>0? stop_loss:na, style = plot.style_linebr , color = color.rgb(82, 240, 42) )
p2 = plot(strategy.position_size<0? stop_loss:na, style = plot.style_linebr , color = color.rgb(223, 85, 85) )
p3 = plot(strategy.position_size!=0?limit : na, style = plot.style_linebr , color = color.rgb(94, 85, 223, 100) )
fill(p1, p3, color = color.new(color.green, 90))
fill(p2, p3, color = color.new(#e98787, 90))